IAM ポリシーの評価と明示的な拒否

開発者のための AWS セキュリティ活用

Rahul Singh

Technical Product Manager

ポリシーはルールの一覧です

{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::reports/*",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "true"
    },
    "IpAddress": {
      "aws:SourceIp": "203.0.113.0/24"
    }
  }
}

1つのIAMステートメントが持つ3つのフィールドを1本の軸上に並べ、1から3の番号を振った図。Effectは許可か拒否か、Actionはどの API 呼び出しか、Resourceは ARN で示される対象を表す。

開発者のための AWS セキュリティ活用

ポリシーはルールの一覧です

{
  "Effect": "Allow",
  "Action": "s3:GetObject",
  "Resource": "arn:aws:s3:::reports/*",
  "Condition": {
    "Bool": {
      "aws:SecureTransport": "true"
    },
    "IpAddress": {
      "aws:SourceIp": "203.0.113.0/24"
    }
  }
}

1つのIAMステートメントが持つ4つのフィールドを1本の軸上に並べ、1から4の番号を振った図。Effectは許可か拒否か、Actionはどの API 呼び出しか、Resourceは ARN で示される対象、Conditionはどのような条件を満たす必要があるかを表す。末尾には「4つのフィールド、1つのルール」と書かれている。

開発者のための AWS セキュリティ活用

3つのフィールドが問い、1つのフィールドが答える

質問

  • Action: その呼び出しか
  • Resource: その対象か
  • Condition: 条件は一致するか

回答

  • Effect: 許可か拒否か

IAMステートメントの4つのフィールドを縦に並べた図。Action、Resource、Conditionは「質問」とラベル付けされた1つの括弧でまとめられ、Effectは「回答」とラベル付けされた別の括弧でまとめられている。

開発者のための AWS セキュリティ活用

ルールは複数の場所から来る

ロールに紐づけられたポリシードキュメントと、ロールからバケットへ伸びる矢印を示す図。

ID ベース

  • ロールに紐づく
  • このロールは何ができるか
開発者のための AWS セキュリティ活用

ルールは複数の場所から来る

ロールに紐づけられたポリシードキュメントと、ロールからバケットへ伸びる矢印を示す図。

リソースに紐づけられたポリシードキュメントと、プリンシパルからバケットへ伸びる矢印を示す図。

ID ベース

  • ロールに紐づく
  • このロールは何ができるか

リソースベース

  • アクセス先のリソースに紐づく
  • 誰がこのバケットにアクセスできるか
開発者のための AWS セキュリティ活用

ルールが矛盾するとき

{"Effect": "Allow", "Action": "s3:*", "Resource": "*"}
{"Effect": "Deny",  "Action": "s3:DeleteObject", "Resource": "*"}
開発者のための AWS セキュリティ活用

ルールが矛盾するとき

{"Effect": "Allow", "Action": "s3:*", "Resource": "*"}
{"Effect": "Deny",  "Action": "s3:DeleteObject", "Resource": "*"}

リクエスト: s3:DeleteObject の結果: 拒否。

明示的な拒否は、どれほど広範な許可にも勝ります

許可ステートメントと拒否ステートメントの両方が1つのリクエストに作用し、拒否の経路が太く描かれ、結果が「拒否」と記された図。

開発者のための AWS セキュリティ活用

評価の順序と暗黙的な拒否

IAM ポリシー評価のフローチャート。API リクエストはまず該当する明示的な拒否を確認し、次に該当する許可を確認する。どちらも見つからない場合は暗黙的な拒否に至る。

  • 明示的な拒否: 何かが「ノー」と言った
  • 許可: 何かが「イエス」と言い、誰も「ノー」と言わなかった
  • 暗黙的な拒否: 何も言わなかった
開発者のための AWS セキュリティ活用

4つのリクエスト、3つの結果

{"Effect": "Allow", "Action": "s3:*",
 "Resource": "*"}

{"Effect": "Deny", "Action": "s3:DeleteObject",
 "Resource": "*"}
  • s3:GetObject → 許可: 広範な許可がカバーしている
  • s3:DeleteObject → 明示的な拒否: ステートメントが拒否している
  • kms:Decrypt、dynamodb:GetItem → 暗黙的な拒否: このポリシーはこれらのサービスに一切言及していない
  • KMS は暗号化キーを保持し、DynamoDB はマネージド型のキーバリューデータベース
開発者のための AWS セキュリティ活用

権限を追加しても解決しないことが多い理由

同じエラー、2つの原因

明示的な拒否

  • 別の許可を追加しても変わらない
  • 拒否を見つけて、範囲を絞るか削除する

暗黙的な拒否

  • 1つの限定的な許可
  • 呼び出しを行ったIDに対して

AccessDenied エラーが2つの原因に分岐する図。左側は拒否が見つかった場合で、許可を追加しても変わらない。右側は許可が見つからなかった場合で、呼び出し元 ID に1つの限定的な許可を与えれば解決する。

開発者のための AWS セキュリティ活用

練習しましょう!

開発者のための AWS セキュリティ活用

Preparing Video For Download...