はじめに
業務でIAM設計を担当することになりましたので、アレコレを調査しました。
※随時更新
対象者
- AWSでIAM設計構築を担当する人
目次
概要
- IAMポリシーの種類は以下の6種類
- アイデンティティベース
- リソースベース
- Permissions Boundary
- SCP(サービスコントロールポリシー)
- ACL(アクセスコントロールリスト)
- セッションポリシー
- ドキュメントの構成要素は「Version」と「Statement」
- Version
- “2008-10-17” と “2012-10-17” の2つが存在
- Statement
- Sid
- Effect
- Resource
- Condition
- Version
- Effectについて
- 明示的に許可されていないリソースのアクションについては暗黙的に拒否される
- 明示的拒否 > 明示的許可 > 暗黙的拒否
- IAMポリシーのデザインパターン
- ホワイトリストパターン
- 明示的許可のみ
- 許可を記述していないアクションについては暗黙的に拒否
- ブラックリストパターン
- 明示的拒否のみ
- 該当するアクションの権限は他のポリシーにより上書きすることができなくなる
- 本ポリシーだけでは何の権限も与えない
- 本ポリシーで権限の範囲を絞って明示的許可ポリシーでアクションを許可するという使用法になる
- ハイブリッドパターン
- 前出の2パターンを組み合わせたデザインパターン
- ホワイトリストパターン
実際の構築
1.権限を与えたくないアクション(サービス)を洗い出し、ブラックリストパターンで明示的に拒否するポリシーを作成する(IAMポリシーの作成・編集などセキュリティ的にクリティカルなものをなるべく個別に)
2.権限を与えたいアクション(サービス)について、ホワイトリストパターンで(包括的に)許可していく
Permissions BoundaryによるIAM権限移譲
-
アタッチするポリシーの内容
- 任意の操作許可
- CloudTrailとConfigの停止/削除を拒否
- IAMユーザの作成を拒否
- IAM Roleの作成とPolicyのアタッチは指定したRole用Boundary(RolePermissionsBoundary)がアタッチされている場合のみ可能(されていないと拒否)
- RolePermissionsBoundaryの編集を拒否
- アタッチされているPermissions Boundaryのデタッチを拒否
-
設定例
PolicyDocument: {
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AdministratorAccess",
"Effect": "Allow",
"Action": "*",
"Resource": "*"
},
{
"Sid": "DenyUserCreationOrChange",
"Effect": "Deny",
"Action": [
"iam:CreateUser",
"iam:DeleteUser",
"iam:PutUserPolicy",
"iam:DeleteUserPolicy",
"iam:AttachUserPolicy",
"iam:DetachUserPolicy",
"iam:PutUserPermissionsBoundary",
"iam:AddUserToGroup",
"iam:RemoveUserFromGroup",
"iam:UpdateUser"
],
"Resource": "*"
},
{
"Sid": "DenyCreateOrChangeRoleWithoutBoundary",
"Effect": "Deny",
"Action": [
"iam:CreateRole",
"iam:PutRolePolicy",
"iam:DeleteRolePolicy",
"iam:AttachRolePolicy",
"iam:DetachRolePolicy",
"iam:PutRolePermissionsBoundary"
],
"Resource": "*",
"Condition": {
"StringNotEquals": {
"iam:PermissionsBoundary": "arn:aws:iam::${AWS::AccountId}:policy/RolePermissionsBoundary"
}
}
},
{
"Sid": "DenyBoundaryPolicyEdit",
"Effect": "Deny",
"Action": [
"iam:CreatePolicyVersion",
"iam:DeletePolicy",
"iam:DeletePolicyVersion",
"iam:SetDefaultPolicyVersion"
],
"Resource": [
"Fn::Sub" : "arn:aws:iam::${AWS::AccountId}:policy/RolePermissionsBoundary"
]
},
{
"Sid": "DenyBoundaryDelete",
"Effect": "Deny",
"Action": [
"iam:DeleteUserPermissionsBoundary",
"iam:DeleteRolePermissionsBoundary"
],
"Resource": "*"
},
{
"Sid": "DenyCloudTrailAndConfigChange",
"Effect": "Deny",
"Action": [
"cloudtrail:DeleteTrail",
"cloudtrail:PutEventSelectors",
"cloudtrail:StopLogging",
"cloudtrail:UpdateTrail",
"config:DeleteConfigurationRecorder",
"config:DeleteDeliveryChannel",
"config:DeleteRetentionConfiguration",
"config:PutConfigurationRecorder",
"config:PutDeliveryChannel",
"config:PutRetentionConfiguration",
"config:StopConfigurationRecorder"
],
"Resource": "*"
}
]
}