IAMポリシー権限の優先度を確認してみた
はじめに
こんにちは。(心の内では)健康を目指して日々精進しているshimojです。
普段はデータ分析基盤周りに関する業務を担当しておりますがAWS関連の対応をすることもあります。
最近、所定のIAMグループに属する各IAMユーザーが、S3バケット内の特定オブジェクトキーに対しての操作権限を設定しました。
IAMグループに指定するIAMポリシーの「Deny」は「Allow」ルールよりも優先されます。
本記事では特定のIAMグループに所属するユーザーの動作設定を確認します。
全体像
権限確認のため、以下図のようにIAMグループに所属したIAMユーザーを2つ作成します。
IAMグループ①にはAWS管理の「AmazonS3FullAccesss」ポリシーを、IAMグループ②には後述する特定キー配下以外の操作権限を拒否(Deny)するカスタムポリシーを作成しそれぞれアタッチします。
ユーザーが所属するグループと、オブジェクトキー配下の操作権限を表に記載します。
IAMユーザー | IAMグループ① | IAMグループ② | オブジェクトキー1配下 | オブジェクトキー2配下 |
---|---|---|---|---|
IAMユーザー① | 所属 | ー | 操作可能 | 操作可能 |
IAMユーザー② | 所属 | 所属 | 操作可能 | 操作不可 |
IAMグループ②に指定するポリシー
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "OnlyTargetS3Path",
"Effect": "Deny",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"NotResource": [
"arn:aws:s3:::{S3バケット名}/{オブジェクトキー1}/*"
]
}
]
}
動作確認
IAMユーザーを2つを指定したグループに所属した状態で動作確認を行います。
確認は2つのユーザーそれぞれが「オブジェクトキー1と2」に対して、以下3つの操作を実施します。
- ローカルファイルの「アップロード」
- S3にアップロードされたファイルの「ダウンロード」
- 該当オブジェクトキーのファイルを「削除」
実行時にはCLIコマンドを利用して動作確認を行いましたので、利用したコードを記載します。
オブジェクトキーやファイル名などは各IAMユーザーで異なるためそれぞれの値に適宜変更します。
# 1. アップロード確認コマンド
$ aws-vault exec {IAMユーザー} -- aws s3 cp {ローカルパス}/{ファイル名} s3://{バケット名}/{オブジェクトキー}/
# 2. ダウンロード確認コマンド
$ aws-vault exec {IAMユーザー} -- aws s3 cp s3://{バケット名}/{オブジェクトキー}/{ファイル名} {ローカルパス}/{ファイル名}
# 3. 削除確認コマンド
$ aws-vault exec {IAMユーザー} -- aws s3 rm s3://{バケット名}/{オブジェクトキー}/{ファイル名}
実行結果
CLIの実行結果をを表にまとめます。
結果より、IAMグループ②に所属したIAMユーザー②から「オブジェクトキー2」配下に対して操作権限がないため実行が失敗したことを確認しました。
No | IAMユーザー | パス | アップロード | ダウンロード | 削除 |
---|---|---|---|---|---|
1 | IAMユーザー① | オブジェクトキー1 | 成功 | 成功 | 成功 |
2 | IAMユーザー① | オブジェクトキー2 | 成功 | 成功 | 成功 |
3 | IAMユーザー② | オブジェクトキー1 | 成功 | 成功 | 成功 |
4 | IAMユーザー② | オブジェクトキー2 | 権限不足 | 権限不足 | 権限不足 |
CLIコマンド実行時の成功と失敗(権限不足)結果を一部記載します。
## 成功_ユーザー①が「オブジェクトキー2」へ対するアップロード
$ aws-vault exec IAMユーザー① -- aws s3 cp upload1_2.text s3://{バケット名}/{オブジェクトキー2}/
upload: ./upload1_2.text to s3://{バケット名}/{オブジェクトキー2}/upload1_2.text
## 失敗_ユーザー②が「オブジェクトキー2」へ対するアップロード
$ aws-vault exec IAMユーザー② -- aws s3 cp upload2_2.text s3://{バケット名}/{オブジェクトキー2}/
upload failed: ./upload2_2.text to s3://{バケット名}/{オブジェクトキー2}/upload2_2.text An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
まとめ
IAMポリシーの「Deny」と「Allow」を付与した場合「Deny」の優先を確認しました。
IAMの権限周りに関する運用を考慮する際には、複数のグループに所属させる必要があったりする場合がありますのでこの記事がどなたかの参考になれば幸いです。
余談
S3バケットはListする際にバケット単位で読み込み権限を指定します。
AWSコンソール画面からS3バケットを参照する必要がある場合、特定パス以外の参照も不可にする権限を追加すると、"s3:ListBucket"、AWS s3 lsなども失敗しますので少しはまりました。。
Discussion