IAMポリシーのアレコレ


# はじめに
業務でIAM設計を担当することになりましたので、アレコレを調査しました。
※随時更新
![iam_small_svg.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3161388/f3c23e44-ecf8-0c02-c139-de74356122d0.jpeg)


# 対象者
- AWSでIAM設計構築を担当する人

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [概要](#概要)
1. [実際の構築](#実際の構築)
1. [Permissions BoundaryによるIAM権限移譲](#PermissionsBoundaryによるIAM権限移譲)


<!-- 各チャプター -->
<a id="概要"></a>
# 概要

- IAMポリシーの種類は以下の6種類
    - アイデンティティベース
    - リソースベース
    - Permissions Boundary
    - SCP（サービスコントロールポリシー）
    - ACL（アクセスコントロールリスト）
    - セッションポリシー
</br>

 - ドキュメントの構成要素は「Version」と「Statement」
     - Version
         - “2008-10-17” と “2012-10-17” の2つが存在
     - Statement
         - Sid
         - Effect
         - Resource
         - Condition

</br>

 - Effectについて
     - 明示的に許可されていないリソースのアクションについては暗黙的に拒否される
     - 明示的拒否 ＞ 明示的許可 ＞ 暗黙的拒否

</br>

- IAMポリシーのデザインパターン
    - ホワイトリストパターン
        - 明示的許可のみ
        - 許可を記述していないアクションについては暗黙的に拒否
    - ブラックリストパターン
        - 明示的拒否のみ
        - 該当するアクションの権限は他のポリシーにより上書きすることができなくなる
        - 本ポリシーだけでは何の権限も与えない
        - 本ポリシーで権限の範囲を絞って明示的許可ポリシーでアクションを許可するという使用法になる
    - ハイブリッドパターン
        - 前出の2パターンを組み合わせたデザインパターン

<a id="#実際の構築"></a>
# 実際の構築

>1.権限を与えたくないアクション（サービス）を洗い出し、ブラックリストパターンで明示的に拒否するポリシーを作成する（IAMポリシーの作成・編集などセキュリティ的にクリティカルなものをなるべく個別に）

>2.権限を与えたいアクション（サービス）について、ホワイトリストパターンで（包括的に）許可していく

<a id="Permissions BoundaryによるIAM権限移譲"></a>
# 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": "*"
        }
    ]
}
```


## おわりに
IAMポリシー![Something went wrong]()
についてまとめました。

# 参考文献
- [IAMポリシーの概要とデザインパターン](https://qiita.com/InitialD104/items/6e468c0f31f0bc4e0a87)
- [最低限のガードレールを考慮したシンプルな IAM 設計を CloudFormation でデプロイする](https://dev.classmethod.jp/articles/build-simple-guardrail-iam-design-pattern-by-cfn/)
- [魔法の Permissions Boundary](https://pages.awscloud.com/rs/112-TZM-766/images/20230224_27th_ISV_DiveDeepSeminar_Permissionsboundary.pdf)
- [[新機能]IAMの委譲権限を制限可能なPermissions Boundaryが登場したので試してみた](https://dev.classmethod.jp/articles/iam-permissions-boundary/)
- [Permissions Boundaryによる利用者へのIAM権限移譲と権限昇格の防止](https://qiita.com/f-daiki/items/e435159db6bde4d0c0ec)
- [IAM Permissions boundary（アクセス権限の境界）で明示的に許可していないアクションでも条件次第で実行できるということを評価論理の流れを眺めて再認識してみた](https://dev.classmethod.jp/articles/iam-policies-evaluation-logic-rikai/)