[レポート] Building effective IAM policies に参加しました #AWSreInvent #SEC305
IAMポリシーを作成するビルダーズセッションに参加しましたのでそちらのセッションレポートとなります。
概要
Anyone who builds on AWS should understand how to build effective IAM policies. In this session, learn the requirements for security controls and walk through the construction of IAM policies that implement those controls. See which policy types are most appropriate for each control, and walk away with some real-life examples of IAM policies that you can take back to your organization.
以下、翻訳です。
AWS 上で構築する人は誰でも、効果的な IAM ポリシーを構築する方法を理解する必要があります。このセッションでは、セキュリティ制御の要件を学び、それらの制御を実装する IAM ポリシーの構築について説明します。各コントロールにどのポリシー タイプが最も適しているかを確認し、組織に持ち帰ることができる IAM ポリシーの実例をいくつか紹介します。
レポート
Agenda
今回のビルダーズセッションは以下のような流れになります。
シナリオが4つ用意されているので、コントロールを実装するIAMポリシーを作成していきます。 作成したらグループに戻り各シナリオについてディスカッションをします。
今回はCloud9を起動し、Assessment toolを使用して作成したIAMポリシーをテストします。
こちらのツールはポリシーを作成した後に実行すると結果が戻ります。
Set up
初めに、作成したポリシーを評価するツールをインストールします。
マネジメントコンソールでAWS Cloud9
を開き、今回のセッション用に準備されている環境を開きます。
ツールをダウロードしてインストールします。
$ curl 'https://static.us-east-1.prod.workshops.aws/public/a8b77c64-5ab8-49a3-8751-ba7d5351e107/assets/eval_policy-0.0.33-py3-none-any.whl' --output eval_policy-0.0.33-py3-none-any.whl pip install eval_policy-0.0.33-py3-none-any.whl
Scenario 1 組織内のすべてのプリンシパルにリソースへのアクセスを許可する
作成するポリシーの内容
すべてのプリンシパルに特定のバケットのすべてのオブジェクトへのs3:GetObject
を許可するポリシーを作成します。
ポリシーで使用する値
- AWS Organizations organization ID: o-123456
- Bucket name: MY-BUCKET
- Account: 111111111111
- Action: s3:GetObject
作成したポリシー
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::MY-BUCKET/*", "Condition": { "StringEquals": { "aws:PrincipalOrgId": "o-123456" } } }] }
ポリシーを作成した後にコマンドを実行すると、作成したポリシーを評価できます。
$ eval-policy --step 1 --policy policy1.json
こちらは比較的すぐできました。
Scenario 2 サービスコントロールポリシーでプラットフォームのリソースを保護する
作成するポリシーの内容
key が team
、value が admin
のタグを持つリソースに対するすべてのアクションの実行を拒否します。keyがteam
、valueがadmin
のタグを持つプリンシパルのみが、タグ付きリソースに対して何らかのアクションを実行できるようにサービス コントロール ポリシーを作成します。
ポリシーで使用する値
- Tag on resources to protect: Key: team Value: admin
- Tag on principals that are exempt: Key: team Vaue: admin
- Resource: all resources
- Action: all actions
作成したポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "*", "Resource": "*" }, { "Effect": "Deny", "Action": "*", "Resource": "*", "Condition": { "StringEquals": { "aws:ResourceTag/team": "admin" }, "StringNotEquals": { "aws:PrincipalTag/team": "admin" } } } ] }
Scenario 3 ID ベースのポリシーで起動できる EC2 インスタンスのタイプを制限する
作成するポリシーの内容
インスタンスタイプがt3.small
である場合、EC2インスタンスを起動する。そのほかのインスタンスタイプは起動しないというIAMポリシーを作成します。
ポリシーで使用する値
- Allowed instance type: t3.small
- Action: ec2:RunInstances
作成したポリシー
{ "Version": "2012-10-17", "Statement": [ { "Action": "ec2:*", "Effect": "Allow", "Resource": "*" }, { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotEquals": { "ec2:InstanceType": "t3.small" } } } ] }
こちらはよく見たことのある内容のポリシーでしたのですぐできました。
セッションでは画像にあるようなポリシーの書き方が紹介されました。
Scenario 4 信頼できないプリンシパルが混乱した代理人として AWS サービスを使用することを防止する
作成するポリシーの内容
SNS トピックが S3 バケットからの通知を受信できるようにしするポリシーを作成します。 AWSのサービスプリンシパルs3.amazonaws.comがSNSトピックにメッセージをパブリッシュすることを許可する必要があります。他のAWSアカウントがs3.amazonaws.comサービスを混乱した代理として使用し、あなたのトピックにメッセージを公開することを防ぐ必要があります。
ポリシーで使用する値
- Service: s3.amazonaws.com
- Action: sns:Publish
- Region: us-east-1
- Topic name: MyTopic
- Account that the SNS topic is in: 111111111111
- Account that you want to receive notifications from: 111111111111
- S3 bucket that you want to receive notifications from: MY-BUCKET
作成したポリシー
{ "Version": "2012-10-17", "Statement": [{ "Effect": "Allow", "Principal": { "Service": "s3.amazonaws.com" }, "Action": "sns:Publish", "Resource": "arn:aws:sns:us-east-1:111111111111:MyTopic", "Condition": { "ArnEquals": { "aws:SourceArn": "arn:aws:s3:::MY-BUCKET" }, "StringEquals": { "aws:SourceAccount": "111111111111" } } }] }
まとめ
IAMを学び直す良い機会と思い参加をしました。ヒントを見ながら作成していくのですが、結構難しく感じました。 実践的な内容のシナリオでIAMポリシーを紹介してくれたので参加して良かったと思います。