IAM ポリシーで他人の S3 バケット・EC2 キーペアを削除できなくさせる方法
はじめに
こんにちは、アノテーション構築チームの荒川です。
開発者へ AWS 管理ポリシーの PowerUserAccess
をアタッチしている環境で、S3 バケットと EC2 キーペアは、自分のリソースだけ操作できるようにしたい、といった要望がありました。
この要望に対して AWS マネジメントコンソールで、 IAM ポリシーを追加する方法の手順を紹介します。
自分の IAM ユーザー名が入った S3 バケットだけ、変更(削除含む)可能にするポリシーの作成手順
1. IAM コンソールの ポリシーへアクセス
2. 「ポリシーを作成」ボタンをクリック
3. 「ビジュアルエディタ」タブから「JSON」タブへ変更する
4. 下記のポリシーをコピーして貼り付ける
{ "Version": "2012-10-17", "Statement": [ { "Sid": "S3WriteOnlyMyOwnBucketPolicy", "Effect": "Deny", "Action": [ "s3:CreateAccessPoint", "s3:SubmitMultiRegionAccessPointRoutes", "s3:PutAnalyticsConfiguration", "s3:PutAccelerateConfiguration", "s3:PutAccessPointConfigurationForObjectLambda", "s3:DeleteObjectVersion", "s3:PutStorageLensConfiguration", "s3:RestoreObject", "s3:DeleteAccessPoint", "s3:CreateBucket", "s3:DeleteAccessPointForObjectLambda", "s3:ReplicateObject", "s3:PutEncryptionConfiguration", "s3:DeleteBucketWebsite", "s3:AbortMultipartUpload", "s3:PutLifecycleConfiguration", "s3:UpdateJobPriority", "s3:DeleteObject", "s3:CreateMultiRegionAccessPoint", "s3:DeleteBucket", "s3:PutBucketVersioning", "s3:PutIntelligentTieringConfiguration", "s3:PutMetricsConfiguration", "s3:PutBucketOwnershipControls", "s3:PutReplicationConfiguration", "s3:DeleteMultiRegionAccessPoint", "s3:PutObjectLegalHold", "s3:InitiateReplication", "s3:UpdateJobStatus", "s3:PutBucketCORS", "s3:PutInventoryConfiguration", "s3:PutObject", "s3:PutBucketNotification", "s3:DeleteStorageLensConfiguration", "s3:PutBucketWebsite", "s3:PutBucketRequestPayment", "s3:PutObjectRetention", "s3:PutBucketLogging", "s3:CreateAccessPointForObjectLambda", "s3:PutBucketObjectLockConfiguration", "s3:CreateJob", "s3:ReplicateDelete" ], "NotResource": [ "arn:aws:s3:::*${aws:username}*", "arn:aws:s3:::*${aws:username}/*" ] } ] }
5. 「次のステップ: タグ」ボタンをクリック
6. 「次のステップ: 確認」ボタンをクリック
7. 名前、説明にそれぞれ「S3WriteOnlyMyOwnBucketPolicy」を入力
8. 「ポリシーの作成」ボタンをクリック
9. 画面上部に作成が完了した旨のメッセージが出ることを確認
自分の IAM ユーザー名が入った EC2 キーペアだけ、削除可能にするポリシーの作成手順
1. IAM コンソールの ポリシーへアクセス
2. 「ポリシーを作成」ボタンをクリック
3. 「ビジュアルエディタ」タブから「JSON」タブへ変更する
4. 下記のポリシーをコピーして貼り付ける(完全一致か部分一致かいずれか選択)
以下の例は「arakawa-key-pair」のように、ユーザー名の後に「-key-pair」を固定で付ける例です。「-key-pair」の箇所は運用に合わせて変更してください。
キーペア名を完全一致で判定するパターン
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2DeleteOnlyMyOwnKeyPair", "Effect": "Deny", "Action": "ec2:DeleteKeyPair", "Resource": "*", "Condition": { "StringNotEquals": { "ec2:KeyPairName": "${aws:username}-key-pair" } } } ] }
キーペア名を部分一致で判定するパターン
{ "Version": "2012-10-17", "Statement": [ { "Sid": "EC2DeleteOnlyMyOwnKeyPair", "Effect": "Deny", "Action": "ec2:DeleteKeyPair", "Resource": "*", "Condition": { "StringNotLike": { "ec2:KeyPairName": "*${aws:username}-key-pair*" } } } ] }
5. 「次のステップ: タグ」ボタンをクリック
6. 「次のステップ: 確認」ボタンをクリック
7. 名前、説明にそれぞれ「EC2DeleteOnlyMyOwnKeyPair」を入力
8. 「ポリシーの作成」ボタンをクリック
9. 画面上部に作成が完了した旨のメッセージが出ることを確認
作成した IAM ポリシーを IAM ユーザーへアタッチする手順
個別の IAM ユーザーへポリシーを追加したい場合、以下の手順を実施します。まとめてポリシーを管理したい場合は、後述する IAM グループを使います。
- IAM コンソールの IAM ユーザーへアクセス
- ポリシーをアタッチしたいユーザー名をクリック
- 「許可を追加」->「許可を追加」をクリック
- 「ポリシーを直接アタッチする」をクリック
- 許可ポリシー検索欄に「S3WriteOnlyMyOwnBucketPolicy」を入力
- 表示される IAM ポリシー: S3WriteOnlyMyOwnBucketPolicy をチェック
- 許可ポリシー検索欄に「EC2DeleteOnlyMyOwnKeyPair」を入力
- 表示される IAM ポリシー: EC2DeleteOnlyMyOwnKeyPair をチェック
- 「次へ」をクリック
- 「許可を追加」をクリック
- 画面上部にポリシーが追加された旨のメッセージが出ることを確認
作成した IAM ポリシーを既存の IAM グループへアタッチする手順
IAM ユーザーがすでに IAM グループへ所属している場合は、そのグループへ作成したポリシーを追加します。
- IAM コンソールの ユーザーとグループへアクセス
- グループ名の一覧から対象のグループ名をクリック(グループがない場合は先にグループを作成する)
- 「ユーザー」タブから「許可」タブへ変更する
- 「許可を追加」->「ポリシーをアタッチ」をクリック
- その他の許可ポリシー検索欄に「S3WriteOnlyMyOwnBucketPolicy」を入力
- 表示される IAM ポリシー: S3WriteOnlyMyOwnBucketPolicy をチェック
- 「フィルターをクリア」ボタンをクリック
- その他の許可ポリシー検索欄に「EC2DeleteOnlyMyOwnKeyPair」を入力
- 表示される IAM ポリシー: EC2DeleteOnlyMyOwnKeyPair をチェック
- 「許可を追加」をクリック
- 画面上部にポリシーが追加された旨のメッセージが出ることを確認
おわりに
ポイントとしては、S3 のバケットは ARN でリソースを指定したポリシーを作れますが、EC2 のキーペアはリソースの指定ができず *
のみになることです。
S3 は NotResource 句で、キーペアは Condition 句を使って制御してみました。
Condition 句で制御する際、部分一致(*/?)を使いたい場合は StringNotEquals
ではなく、StringNotLike
にするよう気をつけてください。
StringNotEquals
で部分一致を使うと、ポリシーの作成はできますが、自分の名前が入ったアクセスキーでも削除できなくなります。
参考
- Amazon EC2 のアクション、リソース、および条件キー - サービス認証リファレンス
- IAM JSON ポリシー要素: NotResource - AWS Identity and Access Management
- IAM JSON ポリシー要素: 条件演算子 - AWS Identity and Access Management
アノテーション株式会社について
アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、さまざまな背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。