
NotPrincipalが非推奨って話とアクセス許可境界(Permissions Boundary)の関係
はじめに
こんにちは、パオの人ことさすけです!
今回は、小ネタというかおそらくあまり知られていないのでは?という仕様に関してのお話です!
ポリシー設計をしたことがある人であれば、「NotPrincipal は AWS 非推奨である」という話を聞いたことある人もいるかと思います。
しかし、「便利なのになぜ非推奨なのか」については知らないことも割とありますよね。私も、とある公式ドキュメント の記述を目にするまでは検討もつきませんでした。。。
今回はそんな非推奨の理由、少なくともその一つなのだろうなぁというものを見つけました!というお話です。
さっそく結論
さて、今回は重箱の隅をつつくような内容なので、さっそく結論!
「アクセス許可境界が設定された IAM エンティティが NotPrincipal の Deny を適用したリソースベースポリシーをアタッチしたリソースにアクセスすると拒否対象でなくても拒否される」からです!
「???」となった方も多いかと思います。(文面ですし。。)
ということで、ちょっと検証しながら挙動を確認してきましょうか!
アクセス許可境界って?
前提として、アクセス許可境界って何?という話です。
アクセス許可境界とは、「最大の許可範囲を定めるもの」です。いわゆる、ガードレールってやつですね!文面だけではピンとこない方も多いかと思いますので、画像で確認していきましょ!
まず、IAM ポリシーにて AmazonS3FullAccess
のみ付与している場合では以下画像のようになります。
ここに、アクセス許可境界として「PutObject のみを許可する」というものを付与したとします。
すると以下のように、PutObject 以外のアクションは拒否されます。
要は、IAM をより安全に運用するための機能ってイメージですね。
検証
さて、検証していきましょう。
まずは、テスト用の IAM ユーザーと S3 バケットを作成しておきます。簡単な検証なので、以前作ったバケットなどを流用します。(名前が「なぜ?」って命名になってる鴨ですが、気にせずに)
IAM ユーザー:pao-ex01-permission
S3 バケット:test-pao-tokyo
IAM ユーザーの設定
さぁ、次は IAM ユーザー(pao-ex01-permission
)の設定を行っていきましょう。
やることはざっとこんな感じ。
- IAM ポリシーの設定
- アクセス許可境界の設定
そんなに複雑でもないので、この章で完結させてしまいましょう!
まず、IAM ポリシーですが、AWS マネージドポリシーの AmazonS3FullAccess
をアタッチするだけです!
アクセス許可境界は事前に作成しておいたポリシーをアタッチする形をとるため、pao_ex01_permission
というポリシーを作成しておきます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:ListBucket",
"s3:ListAllMyBuckets"
],
"Resource": "*"
}
]
}
先ほど作成しておいた、pao_ex01_permission
というポリシーを当該 IAM ユーザーにアタッチする形となります。
アタッチが完了すると画像のようになります。
これにより、当該 IAM ユーザーは「すべてのバケットに対して、アップロード、バケットの一覧表示、オブジェクトの一覧表示のみできる」という状態になりました。
バケットポリシーの設定
次に、バケットポリシーを設定していきます。
今回検証したいのは、「NotPrincipal にて Deny があるリソースベースポリシー」が付与されているリソースへのアクセスなので、以下のポリシーを設定します。
内容としては、「pao-ex01-permission
以外は、オブジェクトのアップロードを拒否する」ということです。
つまり、現在オブジェクトをアップロードできるのテスト用 IAM ユーザー(pao-ex01-permission
)のみということです。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": "arn:aws:iam::xxxxxxxxxxxx:user/pao-ex01-permission"
},
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::test-pao-tokyo/*"
}
]
}
アップロードしてみよう
さて、検証の締めくくりです!
実際にテスト用バケット(test-pao-tokyo
)にオブジェクトのアップロードをしてみましょう。
すると、以下の画像のようにエラーとなりアップロードに失敗しました。
状況の確認
さて、検証も終了しましたので状況を図にして確認してみましょうか。
現在の状況としては以下のようになっています。
そして、検証結果としては以下のとおり アップロードが拒否される というわけです。
まとめ
お疲れ様でした!最後まで読んでいただきありがとうございます!
今回は、アクセス許可境界を設定した場合に NotPrincipal を使用したリソースベースポリシーがあるリソースに対してのアクセスで予期せぬエラーが発生する可能性があるというお話でした。
これだいぶ意外ですよね。。。知っているだけでエラー解消の役にたつ知識だと思いますので、ぜひこの機会に頭の片隅にでも入れておいてください!
参考文献
IAM エンティティのアクセス許可境界 - AWS Identity and Access Management
アノテーション株式会社
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。