[レポート] Building effective IAM policies に参加しました #AWSreInvent #SEC305

2023.12.04

IAMポリシーを作成するビルダーズセッションに参加しましたのでそちらのセッションレポートとなります。

概要

image

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

image

今回のビルダーズセッションは以下のような流れになります。

シナリオが4つ用意されているので、コントロールを実装するIAMポリシーを作成していきます。 作成したらグループに戻り各シナリオについてディスカッションをします。

今回はCloud9を起動し、Assessment toolを使用して作成したIAMポリシーをテストします。

image

こちらのツールはポリシーを作成した後に実行すると結果が戻ります。

Set up

初めに、作成したポリシーを評価するツールをインストールします。

マネジメントコンソールでAWS Cloud9を開き、今回のセッション用に準備されている環境を開きます。

image

ツールをダウロードしてインストールします。

$ 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

image

こちらは比較的すぐできました。

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"
                }
            }
        }
    ]
}

image

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"
                }
            }
        }
    ]
}

image

こちらはよく見たことのある内容のポリシーでしたのですぐできました。

セッションでは画像にあるようなポリシーの書き方が紹介されました。

image

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"
            }
        }
    }]
}

image

まとめ

IAMを学び直す良い機会と思い参加をしました。ヒントを見ながら作成していくのですが、結構難しく感じました。 実践的な内容のシナリオでIAMポリシーを紹介してくれたので参加して良かったと思います。

Resources

image