SSOユーザーごとにS3アクセスを制御するバケットポリシーの書き方

TECH記事

こんにちはとりです。

今回は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 ユーザー名>"
        }
}

コメント

タイトルとURLをコピーしました