AWS入門ブログリレー2024〜AWS IAM Access Analyzer編〜
コンバンハ、千葉(幸)です。
当エントリは弊社AWS事業本部による『AWS 入門ブログリレー 2024』の33日目のエントリです。
このブログリレーの企画は、普段 AWS サービスについて最新のネタ・深い/細かいテーマを主に書き連ねてきたメンバーの手によって、 今一度初心に返って、基本的な部分を見つめ直してみよう、解説してみようというコンセプトが含まれています。
AWS をこれから学ぼう!という方にとっては文字通りの入門記事として、またすでに AWS を活用されている方にとっても AWS サービスの再発見や 2024 年のサービスアップデートのキャッチアップの場となればと考えておりますので、ぜひ最後までお付合いいただければ幸いです。
では、さっそくいってみましょう。今回のテーマは『AWS Identity and Access Management (IAM) Access Analyzer』です。
AWS IAM Access Analyzer とは何か
AWS IAM Access Analyzer は、AWS IAM に関するなんかいい感じの働きを何個かやってくれるサービスです。
できることが何種類かあるため、一言で「これができます」というは難しかったりします。「なんかいい感じの働き」とは、以下のような困りごとに対応してくれるものです。
- AWS リソースが意図せず外部からアクセス可能な状態になっていたらすぐ気づきたいな🤔
- しばらく使ってない IAM ユーザーや IAM ロールがあったら気づきたいな🤔
- IAM ユーザーや IAM ロールがしばらく使ってない権限があったら絞りたいな🤔
- 作成予定のポリシーに構文誤りとかうっかり強めの権限をつけていたら気づきたいな🤔
- ポリシーに与えたくな許可が追加されていたら気づきたいな🤔
- IAM ユーザーや IAM ロールの過去の実績から見て必要最小限の IAM ポリシーを作りたいな🤔
AWS IAM Access Analyzer でできることをまとめると、以下となります。
# | 機能 | 概要 |
---|---|---|
1 | 外部アクセス検出 | 外部エンティティからアクセス可能な状態となっているリソースの検出 |
2 | 未使用アクセスの検出 | 未使用のIAMユーザー/ロール/パーミッションを検出 |
3 | ポリシーの検証 | JSONポリシーの構文やベストプラクティスへの準拠状況を検証 |
4 | カスタムポリシーチェック | 新たな許可が追加されていないか、定めたリストに合致する許可が与えられていないかをチェック |
5 | ポリシーの生成 | IAMユーザー/ロールの過去のAPI実行履歴からIAMポリシーを生成 |
AWS IAM Access Analyzer の主要なコンポーネントを確認したのち、上記の表をもとに AWS IAM Access Analyzer で何ができるのかを紹介していきます。
なお、念のため書いておくと本記事の内容は2024年4月現在の情報に則ったものです。(AWS IAM Access Analyzer はそこそこ頻繁にアップデートがあるサービスです。)
AWS IAM Access Analyzer の主要リソース、アナライザー
AWS IAM Access Analyzer サービスには以下 2 つのリソースタイプがあります。
- アナライザー
- アーカイブルール
特に重要なのはアナライザーです。アナライザーはリージョン単位で作成するリソースです。
アナライザーのタイプは4つあり、「利用する機能が何か」「対象がAWSアカウントかOrganizationsか」によって分類されます。
ACCOUNT
外部アクセス検出で信頼ゾーンが AWS アカウントORGANIZATION
外部アクセス検出で信頼ゾーンが OrganizationsACCOUNT_UNUSED_ACCESS
未使用アクセス検出で選択アカウントが AWS アカウントORGANIZATION_UNUSED_ACCESS
未使用アクセス検出で選択アカウントが Organizations
外部アクセス検出用のアナライザーは無料、未使用アクセス検出用のアナライザーは有料です。
アナライザーによって検出された結果は、Findingsとして表され、コンソールなどで確認可能です。Findings はステータスを変更でき、アーカイブもできます。
特定の条件に合致した Findings を自動的にアーカイブさせるルールを設定でき、それはアーカイブルールというリソースとして作成し、定義します。
AWS IAM Access Analyzer を裏で支えるエンジン、Zelkova
AWS IAM Access Anayzer サービスに属するリソースではありませんが、深い関わりを持つものとして Zelkova があります。 *1
Zelkova は自動推論エンジンです。自動推論エンジンとは何か、というのを詳しく説明できないのですが、ちょうどいい画像があったので引用します。
(A billion SMT queries a day - Amazon Science より画像引用)
ポリシーとセットで質問(クエリ)を投げかけることで、裏側でいい感じに処理されて最終的に Yes か No かの結果が得られる、というものです。AWS IAM Access Analyzer 専用の機能というわけではなく、S3 のブロックパブリックアクセス、AWS Config、Amazon Macie、Amazon GuardDuty、AWS Trusted Advisor などさまざまなサービスで活用されています。
AWS IAM Access Analyzerにおいては「1. 外部アクセス検出」「4. カスタムポリシーチェック」で使用されています。
ちなみに、Zelkova 自体は AWS Lambda によってホストされサーバーレスな環境で動いているそうです。Zelkova について詳しく知りたい方は以下のあたりをご参照ください。
- AWSセキュリティは「論理」に訊け! Automated Reasoning の理論と実践 - ログミーTech
- How AWS uses automated reasoning to help you achieve security at scale | AWS Security Blog
- Semantic-based Automated Reasoning for AWS Access Policies using SMT
AWS IAM Access Analyzer の機能ごとの各種観点まとめ
改めて AWS IAM Access Analyzer の各種機能をまとめます。
機能ごとに以下の観点を整理しました。
- 開始時期:機能がサポートされた時期
- 料金:有料か無料か
- アナライザー:リソース「アナライザー」を必要とするかどうか
- Zelkova:Zelkova と関連性を持つかどうか
- Policy:機能と関連性が強いポリシータイプおよび実施される内容
- Id:アイデンティティベースポリシー
- Rs:リソースベースポリシー
- Sc:Organizations SCP
- 主要コマンド:主要な AWS CLI コマンド
# | 機能 | 開始時期 | 料金 | アナライザー | Zelkova | Policy(Id) | Policy(Rs) | Policy(Sc) | 主要コマンド |
---|---|---|---|---|---|---|---|---|---|
1 | 外部アクセス検出 | 2019年12月 | 無料 | 要 | ⚪︎ | ー | 外部アクセス設定を分析 | ー | list-findings |
2 | 未使用アクセスの検出 | 2023年11月 | 有料(アナライザー) | 要 | ー | アクセス実績を分析 | ー | ー | list-findings-v2 |
3 | ポリシーの検証 | 2021年3月 | 無料 | 不要 | ー | 内容を検証 | 内容を検証 | 内容を検証 | validate-policy |
4 | カスタムポリシーチェック | 2023年11月 | 有料(API実行ごと) | 不要 | ⚪︎ | 内容をチェック | 内容をチェック | ー | check-access-not-granted |
5 | ポリシーの生成 | 2021年4月 | 無料 | 不要 | ー | ポリシーを生成 | ー | ー | start-policy-generation |
順番に各機能の内訳を確認していきましょう!
1. 外部アクセス検出
項目 | 値 |
---|---|
開始時期 | 2019年12月 |
料金 | 無料 |
アナライザー | 要 |
Zelkova | ⚪︎ |
Policy(Id) | ー |
Policy(Rs) | 外部アクセス設定を分析 |
Policy(Sc) | ー |
主要コマンド | list-findings |
全体像のイメージです。
▲ アナライザーがリソースの外部からのアクセス可否状況を分析し、検出する
外部アクセス検出では、アナライザーを作成して分析を行います。ここでのアナライザーは無料です。
アナライザーはリージョン単位で作成します。アナライザー作成時に、信頼ゾーンとして以下のいずれかを指定します。
- AWS アカウント(アナライザーが存在する AWS アカウント)
- Organizations 組織
アナライザーは自身と同じリージョンに属する対象リソースに対して定期的にスキャンを行い、リソースが信頼ゾーンの外部エンティティ(AWSアカウントやIAMユーザー、IAMロール、匿名アクセスなど)からアクセス可能になっていないかを分析します。
2024年4月時点の対象リソースは以下のとおりです。
- Amazon Simple Storage Service バケット
- Amazon Simple Storage Service ディレクトリバケット
- AWS Identity and Access Management ロール
- AWS Key Management Service キー
- AWS Lambda の関数とレイヤー
- Amazon Simple Queue Service キュー
- AWS Secrets Manager シークレット
- Amazon Simple Notification Service トピック
- Amazon Elastic Block Store ボリュームスナップショット
- Amazon Relational Database Service DB スナップショット
- Amazon Relational Database Service DB クラスタースナップショット
- Amazon Elastic Container Registry リポジトリ
- Amazon Elastic File System ファイルシステム
- Amazon DynamoDB Streams
- Amazon DynamoDB テーブル
参考:外部アクセスの IAM Access Analyzer リソースタイプ - AWS Identity and Access Management
分析対象がすべてリソースベースポリシーというわけではなく、「アカウント間共有設定」「Grant」「ACL」なども分析対象となります。
外部エンティティからアクセス可能なリソースが検出された場合、Findings が生成されます。Findings は AWS マネジメントコンソールからダッシュボードとして確認も可能です。
アナライザーはAWSServiceRoleForAccessAnalyzer
というサービスリンクロール(SLR)の権限を使用します。
外部アクセスのプレビュー検証
定期的、自動的なアナライザーによる分析とは別に、プレビューとして明示的に確認もできます。これは対象リソースのリソースベースポリシーを変更する前に、変更後のポリシーが外部エンティティからのアクセスが可能になっていないかを検証するためのものです。
S3 バケットのバケットポリシーや IAM ロールの信頼ポリシーなど、一部のリソースでは AWS マネジメントコンソールでプレビュー用のボタンが用意されています。
- 参考:
2. 未使用アクセスの検出
項目 | 値 |
---|---|
開始時期 | 2023年11月 |
料金 | 有料(アナライザー) |
アナライザー | 要 |
Zelkova | ー |
Policy(Id) | アクセス実績を分析 |
Policy(Rs) | ー |
Policy(Sc) | ー |
主要コマンド | list-findings-v2 |
全体像のイメージです。
▲ アナライザーが IAM ユーザーやロールの使用実績を分析、使用していないものを検出する
未使用アクセス検出でも、アナライザーを作成して分析を行います。ここでのアナライザーは有料です。料金は2024年現在東京リージョンで「0.20USD /分析された IAM ロールまたはユーザー/月」です。
アナライザーはリージョン単位で作成します。ただしどのリージョンで作成しても結果は変わらず、複数存在する場合はその分料金が発生するため、どこか一つのリージョンで代表して作成することが推奨されています。
アナライザーを作成する際に、選択アカウント(分析対象とするアカウント)を以下のいずれかから選択します。
- AWS アカウント(アナライザーが存在する AWS アカウント)
- Organizations 組織
アナライザーは定期的に選択アカウントに存在する以下をスキャン/分析します。
- IAM ユーザー(パスワード、アクセスキーの最終使用日時)
- IAM ロール(最終アクティブ日)
- IAM ユーザーおよび IAM ロールに与えられた許可(最終実行日)
未使用アクセス検出用のアナライザーを作成する際は、追跡期間を指定します。例えば90日間を指定すると、90日以上未使用の対象があれば Findings として検出されます。
「IAM ユーザーおよび IAM ロールに与えられた許可」について言い換えると、「権限は与えられているが一定期間実行した履歴がないアクション」です。
例えば IAM ロールにAdministratorAccess
をアタッチしていたとします。そのうちすべてのサービスのすべてのアクションを実行することはないでしょう。そのロールでは S3 に関するアクションしか実行していなかった場合、それ以外のサービスのアクションが「未使用の許可」という形で検出されます。
こちらのアナライザーもAWSServiceRoleForAccessAnalyzer
というサービスリンクロール(SLR)の権限を使用します。
- 参考:
3. ポリシーの検証
項目 | 値 |
---|---|
開始時期 | 2021年3月 |
料金 | 無料 |
アナライザー | 不要 |
Zelkova | ー |
Policy(Id) | 内容を検証 |
Policy(Rs) | 内容を検証 |
Policy(Sc) | 内容を検証 |
主要コマンド | validate-policy |
全体像のイメージです。
▲ マネジメントコンソールでの操作の場合、ほぼリアルタイムで検証して指摘してくれる
ポリシーの検証はアナライザーの作成は不要です。
操作者が AWS API を実行することにより実現します。一番馴染みが深いのは、AWS マネジメントコンソールで IAM ポリシーの編集を行うときでしょうか。
編集中に構文誤りがあれば指摘してくれますし、例えば広すぎる権限を与える書き方をしていると警告をしてくれます。検証した結果引っかかるものがあれば、以下のいずれかのレベルで結果が表示されます。(ここでの結果はアナライザーによって生成された Findings とは別物です。)
- セキュリティ
- エラー
- 警告
- 提案
表示され得るメッセージの全量は以下にまとめられています。中には、特定のポリシータイプでだけ発生するものもあります。
参考:Access Analyzer ポリシーチェックリファレンス - AWS Identity and Access Management
ポリシーの検証の対象となるポリシータイプは以下です。
- アイデンティティベースポリシー
- リソースベースポリシー
- Organizations SCP
リソースベースポリシーに分類されるものでも、対応しているのはいくつかのリソースタイプ向けのものです。1.外部アクセス検出で対応しているリソースタイプと同一ではありません。
また、コンソールでの表示に対応しているポリシーはさらに限定されます。
参考:[アップデート] IAM ポリシーと SCP でベストプラクティスに則れ! IAM Access Analyzer が新機能「ポリシーチェック」に対応しました | DevelopersIO *2
4. カスタムポリシーチェック
項目 | 値 |
---|---|
開始時期 | 2023年11月 |
料金 | 有料(API実行ごと) |
アナライザー | 不要 |
Zelkova | ⚪︎ |
Policy(Id) | 内容をチェック |
Policy(Rs) | 内容をチェック |
Policy(Sc) | ー |
主要コマンド | check-access-not-granted |
全体像のイメージです。
▲ 新しい許可の追加がないか、あるいは与えたくない許可が追加されていないかチェックする
カスタムポリシーチェックでもアナライザーの作成は不要です。
操作者が API を実行することにより実現します。カスタムポリシーチェックに該当する API は2種類あり、対応する AWS CLI コマンドは以下です。
- check-no-new-access — AWS CLI 2.15.41 Command Reference
- check-access-not-granted — AWS CLI 2.15.41 Command Reference
対象となるのはアイデンティティベースポリシーとリソースベースポリシーで、操作するインターフェースと API ごとの対応状況は以下のとおりです。(2024/4時点。)
API | インターフェース | Policy(Id) | Policy(Rs) |
---|---|---|---|
CheckNoNewAccess | コンソール | ⚪︎ | ⚪︎ |
CheckNoNewAccess | プログラム | ー | ⚪︎ |
CheckAccessNotGranted | コンソール | ー | ⚪︎ |
CheckAccessNotGranted | プログラム | ー | ⚪︎ |
- コンソール:AWS マネジメントコンソール
- プログラム:AWS CLI などのプログラムアクセス
CheckNoNewAccessは変更前後のポリシードキュメントを比較し、新たな許可が増えているかどうかをチェックします。
CheckAccessNotGrantedはあらかじめ「与えたくない許可のリスト」を用意しておき、対象のリソースがそのリストに含まれる許可を有しているかどうかをチェックします。
これらの AWS API の実行には料金がかかり、2024/4時点の東京リージョンで「API 呼び出しあたり 0.0020USD」がかかります。
- 参考:
5. ポリシーの生成
項目 | 値 |
---|---|
開始時期 | 2021年4月 |
料金 | 無料 |
アナライザー | 不要 |
Zelkova | ー |
Policy(Id) | ポリシーを生成 |
Policy(Rs) | ー |
Policy(Sc) | ー |
主要コマンド | start-policy-generation |
全体像のイメージです。
▲ IAM ユーザーやロールの過去のアクション実行履歴をもとに IAM ポリシーを生成する
ポリシーの生成にはアナライザーは不要です。ただし、生成リクエストを実施する際には AWS IAM Access Analyzer 用のサービスロール(サービスリンクロールではない)を指定する必要があります。
ポリシーの生成時には、以下を指定します。
- IAM ユーザーもしくは IAM ロール
- 追跡期間
- 分析対象の CloudTrail 証跡
- AWS IAM Access Analyzer 用のサービスロール
対象となった IAM ユーザー/ロールの過去のアクションの実行履歴をもとに、必要となる許可を含むポリシーのドキュメントが生成されます。サービスによってはアクション単位で詳細が取得できず、「このサービスの何らかのアクションを実行した」という粒度でのみ情報が取得できます。
生成されたポリシードキュメントをもとに操作者がカスタマイズを加え、実際の IAM ポリシーを作成できます。
必要最小限の権限を持たせる、というアプローチに有効な機能ですが、いくつか注意事項はあります。
- 同時に複数のポリシーを生成できない
- 1日に生成できるポリシー数には上限がある
- 追跡できる期間は最大90日
- 分析できる CloudTrail ログファイル数、ログサイズには上限がある
- アクションレベルの分析に対応していないサービスがある
うまく活用しましょう。
- 参考:
終わりに
今回は AWS IAM Access Analyzer の概要についてまとめてみました。
改めて考えるとたくさんの機能がありますね。必要となるリソースや料金の発生有無、対象となるポリシータイプなどさまざまでしたので、整理できてよかったです。皆さんがこれから使っていく上での助けになれば幸いです。
以上、『AWS 入門ブログリレー 2024』の33日目のエントリ『AWS IAM Access Analyzer』編でした。
次回、2024/04/30 は弊社 よな による「AWS IoT Core編」の予定です!
お楽しみに!
参考
- AWS Identity and Access Management Access Analyzer を使用する - AWS Identity and Access Management
- AWS Identity and Access Management Access Analyzer - Amazon Web Services
- [アップデート] IAM Access Analyzer が新たに 6 つのリソースタイプの分析に対応しました(全12種に!) | DevelopersIO