初めに
こんにちは、入社2年目の藤本です。
皆さんが普段利用されているAWS環境の権限管理はできているでしょうか。
管理するシステムが多くなれば、アカウント間での権限管理は複雑さを増し、適切なアクセス制御が求められます。 加えて、IAM のセキュリティのベストプラクティス「最小特権アクセス許可を適用する」を考慮する必要があります。
今回は、AWS IAM Access Analyzerを用いて、マルチアカウント環境の権限管理について考えてみました。
AWS IAM Access Analyzerとは
AWS IAM Access Analyzerとは、IAMロールやリソースに対するアクセス許可を分析するサービスです。AWS IAMのマネジメントコンソールから操作することができ、アナライザーを作成することで簡単に権限の確認をすることができます。
IAM Access Analyzerの主な機能は以下の4つです。
①外部アクセスの検出
AWSアカウントまたは組織の外部からアクセスが可能なAmazon S3 バケットや IAM ロールなどのリソースを特定することができます。この機能によって、セキュリティ上のリスクとなるリソースやデータへの意図しないアクセスを確認することができます。 この機能は無料で利用できます。
②IAM ユーザーおよびロールに付与された未使用のアクセスを検出
未使用のアクセス権限を持つ IAM ユーザーとロールを検出します。検出した結果から、未使用のロール、IAM ユーザーのアクセスキー、IAM ユーザーのパスワードを確認することができます。この機能は、1 か月あたりに分析された IAM ロールとユーザーの数に基づいて、未使用のアクセス分析に対する料金が発生します。
また、①, ②の検出結果はダッシュボードにまとめて表示されます。
③カスタムポリシーチェック
カスタマー管理ポリシーがAWSのベストプラクティスやセキュリティ標準に準拠していることを検証します。 IAM Access Analyzer に対して行った API リクエストの数に基づいて、料金が発生します。
④ポリシーの生成
AWS CloudTrailでキャプチャされたアクセスアクティビティに基づいて、きめ細かなポリシーを生成します。生成されたポリシーを使用することで、エンティティのアクセス許可を最小の権限に絞り込むことができます。 この機能は無料で利用できます。
今回は、①外部アクセスの検出機能を用いて、マルチアカウント環境における権限管理を考えます。
検出対象(リソースタイプ)
IAM Access Analyzerが外部アクセスの検出をする対象(リソースタイプ)は、2024年10月時点では以下になります。
- 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 テーブル
最新の情報は、AWS Identity and Access Management ユーザーガイドをご覧ください。
検出対象として、すべてのリソースがサポートされている訳ではないことに注意してください。また、アナライザーは存在するリージョンのリソースのみを検出するため、検出結果を取得したいリージョンごとにアナライザーを作成する必要があります。 グローバルリソースであるIAMロールに外部のアクセス許可が存在する場合は、アナライザーが存在する全てのリージョンで外部アクセスを検出します。
検出範囲(アナライザーの信頼ゾーン)
アナライザー作成時に、検出の範囲に組織全体またはAWSアカウントのどちらかを選択します。この時、選択した組織またはAWSアカウントを、「アナライザーの信頼ゾーン」と呼びます。
アナライザーの信頼ゾーンにAWSアカウントを選択した場合、アナライザーをデプロイしたAWSアカウント以外の外部アクセスを検出します。
アナライザーの信頼ゾーンに組織全体を選択した場合、マネジメントアカウントに1つのアナライザーをデプロイすることで、AWS Organizationsの組織に属するすべてのメンバーアカウントの外部アクセスを検出できます。 検出結果を管理するアカウントには、Organizationsのマネジメントアカウント以外のアカウントにも委任することができます。組織全体のセキュリティ監査を行うことを想定して作られるAuditアカウントに委任することが望ましいです。
しかし、組織のアナライザーでは、組織内のメンバーアカウント同士のアクセスは検出されません。そのため、組織内のメンバーアカウントごとに外部アクセスを検出したい場合は、各アカウントにつき1つずつアナライザーをデプロイする必要があります。
今回、以下のような要件を仮定して構成を考えてみました。
- 組織全体ではなく、メンバーアカウントごとに外部アクセスを検出する
- 検出結果は1つのアカウント(Auditアカウント)に集約する
- 検出結果の通知はSlackに通知する
IAM Access Analyzerの外部アクセス検出の通知システムを考えてみる
構成案
Auditアカウント
AWS Security HubにメンバーアカウントのIAM Access Analyzerの検出結果を集約して、Slackに通知します。Security Hubを利用することで、他のセキュリティ系サービスの検出結果も集約し、一元的に検出結果を管理することができます。また、今回は単一リージョンを想定しているため、Auditアカウントに1つのSecurity Hubをデプロイしています。マルチリージョンでAccess Analyzerの外部アクセスを検出したい場合は、メンバーアカウント側の各リージョンにSecurity Hubをデプロイし、Auditアカウント側のSecurity Hubの検出結果のリージョン集約を設定します。
通知に関しては、Security Hubからの通知をAmazon SNSが受け取り、AWS Chatbot経由でSlackに通知します。
メンバーアカウント
前述した通り、信頼ゾーンに組織全体を選択した場合、組織内のメンバーアカウントごとに外部アクセスを検出することができなくなるため、信頼ゾーンにアカウントを選択したアナライザーをアカウントごとにデプロイします。
AWS CloudFormationを利用してデプロイする場合は、以下のテンプレートを参考にしてみてください。
AWSTemplateFormatVersion: '2010-09-09' Description: Member-IAMAccessAnalyzer Shared StackSet Template Parameters: AnalyzerName: Description: The name of the Analyzer. Type: String Default: Member-IAMAccessAnalyzer Resources: Analyzer: Type: AWS::AccessAnalyzer::Analyzer Properties: AnalyzerName: !Sub "${AnalyzerName}-${AWS::AccountId}-${AWS::Region}" Type: ACCOUNT
詳細は、AWS CloudFormationユーザーガイド AccessAnalyzerでご確認ください。
アナライザーの注意点
アナライザーはリージョン単位で設定する必要がある
IAM Access Analyzerはリージョン単位のサービスです。各リージョンごとにアナライザーを作成する必要があることに注意してください。また、マネジメントコンソールで操作する際は、IAMのコンソールではグローバルと表示されますが、Access Analyzerのページへ移動するとリージョンへ自動で切り替わります。マネジメントコンソールでの操作は、どのリージョンで操作しているか都度確認するようにしましょう。
アナライザーは、組織全体のアナライザーとAWSアカウントのアナライザーが存在する
アナライザーは、信頼ゾーンが組織全体とAWSアカウントでそれぞれ1つずつ作成できます。2つ以上作成することはできません。 組織全体のアナライザーの検出結果とその組織に含まれるメンバーアカウントのアナライザーの検出結果が重複する場合があるため、アナライザーを作成するアカウントと信頼ゾーンは検討が必要です。 また、未使用のアクセスを検出するアナライザーは、外部アクセスを検出するアナライザーとは別物になるため、利用の際はそれぞれアナライザーを作成する必要があります。
アナライザー自体は修正を行わない
アナライザー自体は修正を行いません。アナライザーはあくまでも IAM ポリシーを分析し、 リソースへの外部アクセスを識別するだけです。意図しないアクセスである場合は、ポリシーステートメントを変更して、該当するリソースへのアクセス許可を削除する操作が必要になります。
終わりに
今回は、IAM AccessAnalyzerを用いたマルチアカウント環境の権限管理を考えてみました。 定期的な通知によって、権限の見直しを行い、意図しないアクセスを未然に防ぐことで、セキュアなマルチアカウント環境を実現しましょう。 また、アーカイブルールという機能でアナライザーの検出結果をフィルタリングすることが可能です。通知の可読性を向上させるために、通知の必要がない外部アクセスはアーカイブルールによって制御することも大切です。
参考
AWS Identity and Access Management Access Analyzer の使用 - AWS Identity and Access Management
IAM Access Analyzer の検出結果ダッシュボードを表示する - AWS Identity and Access Management
IAM Access Analyzer の検出結果の仕組みを理解する - AWS Identity and Access Management