こんにちはとりです。
今回はIdentiy Centerで管理しているSSOユーザーごとにS3アクセスを制御したいときのバケットポリシーの書き方について記事になります。
ポリシー自体はシンプルになったのですが、どの条件でコントロールすればうまくいくか案外迷ったので、同じような方の参考になれば幸いです。
想定している構成
細かい要件としては以下を想定しています
- AWS 利用者は authority-A という許可セットを使って、対象のAWSアカウントにアクセスする
- authority-A は対象AWSアカウント内のS3全般に対して広めのアクセス権限をもっている
- AWSアカウント内の特定のS3バケットだけは、特定ユーザーだけ見れるようにしたい。
SSOの許可セットで広めに AWS 権限を与えているものの、特定のS3バケットについては見れるユーザーを絞りたいというケースになります

ポリシーの書き方
結果シンプルになりましたが、以下のようなポリシーで実現できました
S3に限らずIAM全般では明示的な Deny がある場合、それが最初に評価されるため、許可セット(authority-A)がアクセス権限を持っていたとしても、Deny 条件にマッチすればアクセスできなくなります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "SSOTest",
"Effect": "Deny",
"Principal": "*",
"Action": "*",
"Resource": [
"arn:aws:s3:::<S3 バケット名>/*",
"arn:aws:s3:::<S3 バケット名>"
],
"Condition": {
"StringNotLike": {
"aws:userId": "AROAXXXXXX:<SSO ユーザー名>*"
}
}
}
]
}
SSO のユーザーIDは以下コマンドを叩いてかえってくる UserId を指定します
aws sts get-caller-identity --output yaml
# こんな感じで結果が返ってくる
# Account: XXX
# Arn: XXX
# UserId: AROAXXXX:<SSO ユーザー名>
注意点としては先ほど書いたように、Deny 句があると最初にそれが評価されるため、SSOユーザー以外にもアクセスしてくるプリンシパル(例えばECSやlambda)がいる場合、適宜 Condition 句でdeny対象から外す必要があります。
おまけ
最初やろうとしてダメだった方法も tips として書いておきます
SSO から 払いだされるフェデレーテッドユーザーの形式も <許可セット名>/<SSO ユーザー名> で、SSOユーザー名含んでいたので、これでポリシーかけないかな?と思ったのですがダメそうでした。
↓の感じで条件書いてみたのですが、許可セットまでは制御がきくものの SSO ユーザー名までは aws:PrincipalARN
に含められないようです
"Condition": {
"StringNotLike": {
"aws:PrincipalARN": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_<許可セット名>/<SSO ユーザー名>"
}
}
コメント