エキスパートのように IAM 権限を洗練させる Refining IAM permissions like an expert #SEC203 #AWSreInvent

2023 年 11 月に追加された IAM Access Analyzer のふたつの新機能を学べるワークショップを受講してきました。現在は一般公開されているため誰でも受講できます。

コンバンハ、千葉(幸)です。

突然ですが、わたしの好きな AWS サービスは AWS IAM です。一番好きです。

そんなわたしが AWS re:Invent 2023 で受講するセッションを吟味している際に、とても気になるタイトルのワークショップを見つけました。


  • SEC203-R | Refining IAM permissions like an expert [REPEAT]

「エキスパートのように IAM 権限を洗練させる」?これは気になるタイトルですね。ということで迷わず聴講してきました。(3ヶ月前に。)このブログではそのレポートをまとめます。

ワークショップの概要

セッションカタログから引用した概要文はこちら。

In this workshop, learn how to use AWS services to automatically detect unused and business-critical IAM permissions and ways you can update them safely to move toward a least-privilege environment. Discover how to embed the automation into the software development lifecycle to improve the builder experience while also accelerating security objectives. You must bring your laptop to participate. (機械翻訳) このワークショップでは、AWSサービスを使用して、未使用のビジネスクリティカルなIAM権限を自動的に検出する方法と、最小権限環境に移行するために安全に更新する方法を学びます。自動化をソフトウェア開発ライフサイクルに組み込み、セキュリティ目標を加速させながら、ビルダーエクスペリエンスを向上させる方法を発見してください。参加にはノートパソコンが必要です。

このワークショップは現在一般公開されているので、こちらから試せます。(AWS アカウントが必要です。)

ワークッショップで使用されたPDFは以下です。(見なくても大丈夫です。)

https://d1.awsstatic.com/events/Summits/reinvent2023/SEC203-R_Refining-IAM-permissions-like-an-expert-REPEAT.pdf

ワークッショップで学べること

IAM Access Analyzer の以下の機能について学ぶのがメインです。最低限ここを押さえられるとよいでしょう。

機能 代表的なアクション 概要
ポリシーの検証 ValidatePolicy JSONポリシーの構文やベストプラクティスに則っているかを検証
カスタムポリシーチェック CheckAccessNotGranted 特定のアクションがJSONポリシー内で許可されていないかをチェック
未使用のアイデンティティの検出 GetFindingV2 一定期間使用されていないIAMロールやパーミッションを検出

これらのアクションを Lambda や CodeBuild、Event Bridge と組み合わせたシナリオも学べます。全体のアーキテクチャ図のイメージは以下です。

IAM_expert_Github(https://github.com/aws-samples/aws-iam-refining-policy-permissionsより引用)

ワークショップの流れ

大きく以下の 3つに分けられます。

  1. AWS CLI でのコマンドの実行
  2. シナリオ1. 中央セキュリティチーム
  3. シナリオ2. DevOps エンジニア

2,3 は以下のレポジトリから関連リソースをデプロイする必要があります。

Deployment using AWS CDK v2

  • Clone this repository
  • Install AWS CLI v2
  • Install Python 3.11
  • Install AWS CDK
  • Install Docker Desktop
  • Use your IDE of preference such as PyCharm, Visual Studio Code, Sublime, vim, Atom
  • Local configuration steps:
    • Go to the root directory of the cloned repo
    • Run npm i to install required libraries
    • Create a virtual environment for Python python -m venv .venv, you can use other virtual environment tools
    • Activate the virtual environment:
      • source .venv/bin/activate for MacOS and Linux
      • .venv\scripts\activate for Windows
    • Run pip install -r requirements to install required libraries
    • Configure the AWS CLI to use your AWS account's Administrator credentials
    • Test AWS credentials using aws sts get-caller-identity
    • Prepare the account for deployment running npx cdk bootstrap
    • Check synthesis npx cdk synth
    • If no errors were detected, deploy all Stacks npx cdk deploy --all

環境の準備が大変、という方は 1. の AWS CLI コマンドの実行だけでも体験しておくのがオススメです。(とはいえ、1. でも一部はリソースの構築などが必要です。)

1. AWS CLI コマンドの実行

3 つの機能を AWS CLI で実行し、挙動を確認します。

ポリシーの検証

以下の AWS CLI コマンドを使用し、引数として渡した JSON ポリシーの検証を行います。

このコマンドで検証してくれる内容は以下のエントリで取り上げられているものです。マネジメントコンソールでポリシーの編集を行ったことがある方はイメージがつきやすいでしょう。

なお、このアクションに対応したポリシーは以下です。

  • アイデンティティベースポリシー
  • リソースベースポリシー
  • サービスコントロールポリシー

カスタムポリシーチェック

IAM Access Analyzer ではカスタムポリシーチェックという機能が用意されています。2023年11月末に追加された機能です。

カスタムポリシーチェックには以下の2種類があります。

  • ポリシー編集時に新しいアクセス権限が付与されないかをチェック(CheckNoNewAccess
  • 特定の IAM アクションのリストに合致するものがないかのチェック(CheckAccessNotGranted

このワークショップでは、後者に対する機能検証を check-access-not-granted コマンドを用いて行います。

このコマンドに対応したポリシーは以下です。

  • アイデンティティベースポリシー
  • リソースベースポリシー

未使用の IAM の検出

IAM Access Analyzer では、未使用のアクションや IAM ロールを検出する機能があります。これも2023年11月末に追加されたものです。

ここまで見てきたアクションとは異なり、今回の機能にはアナライザーと呼ばれるリソースの作成を必要とします。従来アナライザーが検出可能であったのは「外部からアクセス可能な状態になっているリソースベースポリシー」でしたが、機能追加によって「未使用の IAM」も検出できるようになりました。

それに伴い、関連コマンドが V2 が付与されたものに変わっています。

2. シナリオ1. 中央セキュリティチーム

このシナリオのイメージは以下です。

IAM_Expert_workshop

(ワークショップのページより引用)

大きく以下を実装します。

  • ポリシーの検証とカスタムポリシーチェックを組み込んだ Code Pipeline
  • イベントに応じて発火する3 種の Lambda 関数と、それに基づいた評価および Amazon SNS によるメール通知

イメージ図では CodeBuild と Lambda 関数が関連しているように見えますが、実際には関連しません。「CodeBuild にValidate policyCustom policy checksの機能を盛り込んでいる」ということを表現している図かと思います。

CodeBuild では以下の buildspec ファイルを用いています。先ほど学んだ AWS CLI コマンドが組み込まれていることがわかります。

{
"version": "0.1",
"phases": {
    "install": {
        "commands": [
            "curl https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip -o awscliv2.zip",
            "unzip awscliv2.zip",
            "sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update",
            "export PATH=/usr/local/bin:$PATH",
            "npm i",
            "npm install -g aws-cdk",
            "npx cdk version",
            "python -m venv .venv",
            ". .venv/bin/activate",
            "python --version",
            "pip install -r requirements.txt",
            "pip install boto3==1.33.0",
            "pip install cfn-policy-validator==0.0.25",
            "pip list"
        ]
    },
    "build": {
        "commands": [
            "npx cdk synth > ./iac.yaml",
            "cfn-policy-validator parse --template-path ./iac.yaml --region ${AWS_REGION} > iac_iam_parsed.json",
            "cat iac_iam_parsed.json | jq -r '.Roles[].Policies[].Policy' > policy.json",
            "echo 'call access analyzer to validate policy'",
            "aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://policy.json",
            "echo 'call custom policy checks'",
            "aws accessanalyzer check-access-not-granted --policy-type='IDENTITY_POLICY' --policy-document file://policy.json --access='{\"actions\":[\"s3:PutBucketPolicy\"]}'"
        ]
    }
    }
}

Lambda 関数によって行われる SNS メール通知のイメージは以下です。ここでは新たなポリシーバージョンが作成されたことをトリガーに Event Bridge → Lambda 関数→ Amason SNS と呼び出され、最終的にメール通知が行われます。

Policy_Document_Check_for_Policy_Validation_-_chiba_yukihiro_classmethod_jp_-_Classmethod_jp_メール

3. シナリオ2. DevOps エンジニア

このシナリオのイメージは以下です。

IAM_Expert__workshop

IAC を Git push したことをきっかけに Code Pipeline が走り、「ポリシーの検証」「カスタムポリシーチェック」が一連の処理の中で行われることを確認するシナリオです。

Code Pipeline の実行ログを確認すると、以下のようにビルドコマンドの中でアクションが実行されていることが確認できます。

...
[Container] 2023/11/29 00:00:38.160508 Running command echo 'call access analyzer to validate policy'
call access analyzer to validate policy

[Container] 2023/11/29 00:00:38.164831 Running command aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://policy.json
{
    "findings": []
}

[Container] 2023/11/29 00:00:38.810299 Running command echo 'call custom policy checks'
call custom policy checks

[Container] 2023/11/29 00:00:38.814582 Running command aws accessanalyzer check-access-not-granted --policy-type='IDENTITY_POLICY' --policy-document file://policy.json --access='{"actions":["s3:PutBucketPolicy"]}'
{
    "result": "FAIL",
    "message": "The policy document grants access to perform one or more of the listed actions.",
    "reasons": [
        {
            "description": "One or more of the listed actions in the statement with sid: PutBucketPolicyPermissions.",
            "statementIndex": 2,
            "statementId": "PutBucketPolicyPermissions"
        }
    ]
}
...

CI/CD のプロセスの中で IAM Access Analyazer を活用したポリシーチェック/検証を行う例を学べました。

終わりに

SEC203-R | Refining IAM permissions like an expert [REPEAT] のセッションレポートでした。

このセッション(ワークショップ)は複数回開催されており、わたしは 2日目以降の実施回に参加しました。事前予約を行なっておらず、当日枠で早めに会場前に並んでいたのですが、長蛇の列が形成されていました。

隣に並んでいた外国の方と、「すごい人気だね」「IAM はやはり重要なサービスだからね」「わたしのモストフェイバリットなサービスは AWS IAM だよ」という趣旨の簡単な会話をしたのが印象的です。

会場はかなり広めでしたが、その多くの席が埋まっていました。現地で受講できてよかったなと思います。

IAM_expert_wide

2023年の終わりに追加された IAM Access Analyzer の機能をきちんと把握するにも実りのあるワークショップだったと思います。

皆さんも興味があれば試してみてください。

以上、 チバユキ (@batchicchi) がお送りしました。