

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Terraform を使用して AWS Organizations の IAM アクセスキー管理を一元化する
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform"></a>

*Aarti Rajput、Chintamani Aphale、T.V.R.L.Phani Kumar Dadi、Pratap Kumar Nanda、Pradip kumar Pandey、Mayuri Shinde (Amazon Web Services)*

## 概要
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-summary"></a>

キーとパスワードのセキュリティルールの適用は、すべての組織にとって****不可欠なタスクです。重要なルールの 1 つは、セキュリティを強化するために、AWS Identity and Access Management (IAM) キーを定期的にローテーションすることです。通常、AWS アクセスキーは、チームが AWS コマンドラインインターフェイス** **(AWS CLI) または AWS 外部のアプリケーションから AWS にアクセスするたびに、ローカルで作成および設定されます。組織全体で強力なセキュリティを維持するには、要件が満たされた時点で、または定期的に、古いセキュリティキーを変更または削除する必要があります。組織内の複数のアカウントでキーローテーションを管理するプロセスは、時間がかかり、面倒です。このパターンは、Account Factory for Terraform (AFT) と AWS サービスを使用してローテーションプロセスを自動化するのに役立ちます。

このパターンには以下の利点があります。
+ アクセスキー ID とシークレットアクセスキーを、組織内のすべてのアカウントで一元管理できます。
+ `AWS_ACCESS_KEY_ID` および `AWS_SECRET_ACCESS_KEY` 環境変数を自動的にローテーションできます。
+ ユーザー認証情報が侵害された場合に更新を適用できます。

このパターンでは、Terraform を使用して AWS Lambda 関数、Amazon EventBridge ルール、IAM ロールをデプロイします。EventBridge ルールが定期的に実行され、作成された日時に基づいてすべてのユーザーアクセスキーを一覧表示する Lambda 関数を呼び出します。追加の Lambda 関数は前のキーをチェックし、定義したローテーション期間 (45 日間など) より古い場合、新しいアクセスキー ID とシークレットアクセスキーを作成し、Amazon Simple Notiﬁcation Service (Amazon SNS) と Amazon Simple Email Service (Amazon SES) を使用してセキュリティ管理者に通知します。シークレットはそのユーザーの AWS Secrets Manager で作成され、古いシークレットアクセスキーは Secrets Manager に保存され、古いキーにアクセスするためのアクセス許可が設定されます。古いアクセスキーは、今後使用されることのないように、非アクティブ期間 (例: キーがローテーションされてから 15 日後に当たる 60 日) 後に無効になります。非アクティブなバッファ期間 (例: 90 日、またはこの例ではキーがローテーションされてから 45 日) 後、古いアクセスキーは AWS Secrets Manager から削除されます。詳細なアーキテクチャとワークフローについては、「[アーキテクチャ](#centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-architecture)」セクションを参照してください。

## 前提条件と制限事項
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-prereqs"></a>
+ [AWS Control Tower ](https://docs.aws.amazon.com/controltower/latest/userguide/what-is-control-tower.html)(バージョン 3.1 以降) を使用して構築された組織のランディングゾーン
+  次の 3 つのアカウントで設定された [Account Factory for Terraform (AFT)](https://catalog.workshops.aws/control-tower/en-US/customization/aft):
  + [組織管理アカウント](https://catalog.workshops.aws/control-tower/en-US/customization/aft/repositories/global-customizations)は組織全体を一元管理します
  + [AFT 管理アカウント](https://catalog.workshops.aws/control-tower/en-US/customization/aft/repositories/account-customizations)は Terraform パイプラインをホストし、インフラストラクチャをデプロイアカウントにデプロイします
  + [デプロイアカウント](https://catalog.workshops.aws/control-tower/en-US/customization/aft/repositories/provisioning-customizations)は、この完全なソリューションをデプロイし、IAM キーを一元管理します
+ デプロイアカウントにインフラストラクチャをプロビジョニングするための Terraform バージョン 0.15.0 以降
+ [Amazon Simple Email Service (Amazon SES)](https://aws.amazon.com/ses/) で設定されている E メールアドレス
+ (推奨) セキュリティを強化するには、このソリューションを [仮想プライベートクラウド (VPC)](https://registry.terraform.io/modules/terraform-aws-modules/vpc/aws/latest) 内の[プライベートサブネット](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html) (デプロイアカウント) 内にデプロイします。変数をカスタマイズする場合は VPC とサブネットの詳細を指定できます (「[エピック](#centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-epics)」セクションの「*コードパイプラインのパラメータをカスタマイズする*」を参照)。

## アーキテクチャ
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-architecture"></a>

**AFT リポジトリ**

このパターンでは、Account Factory for Terraform (AFT) を使用して、必要なすべての AWS リソースを作成し、コードパイプラインを使用してデプロイアカウントにリソースをデプロイします。コードパイプラインは、次の 2 つのリポジトリで実行されます。
+ **グローバルカスタマイズ**は、AFT に登録されているすべてのアカウントで実行される Terraform コードを対象とします。
+ **アカウントのカスタマイズ**は、デプロイアカウントで実行される Terraform コードを対象とします。

**リソースの詳細**

AWS CodePipeline ジョブは、デプロイアカウントに次のリソースを作成します。
+ AWS EventBridge ルールと設定済みルール
+ `account-inventory` Lambda 関数
+ `IAM-access-key-rotation` Lambda 関数
+ `Notification` Lambda 関数
+ E メールテンプレートを含む Amazon Simple Storage Service (Amazon S3) バケット
+ 必要な IAM ポリシー

**アーキテクチャ**

![\[AWS Organizations で IAM アクセスキー管理を一元化するためのアーキテクチャ\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/0217275c-cb4c-4bdf-b105-ad9abfd4fded/images/844512f0-67b3-4d41-aaaa-fbd9e341c438.png)


この図表は、以下を示すものです。

1. EventBridge ルールは、24 時間ごとに `account-inventory` Lambda 関数を呼び出します。

1. `account-inventory` Lambda 関数は、すべての AWS アカウント ID、アカウント名、アカウントメールのリストを AWS Organizations に問い合わせます。 

1. `account-inventory` Lambda 関数は AWS アカウントごとに `IAM-access-key-auto-rotation` Lambda 関数を開始し、メタデータをこの関数に渡して追加の処理を行わせます。

1. `IAM-access-key-auto-rotation` Lambda 関数は、引き受けた IAM ロールを使用して AWS アカウント ID にアクセスします。Lambda スクリプトは、アカウント内のすべてのユーザーとそのユーザーの IAM アクセスキーに対して監査を実行します。

1. IAM キーローテーションのしきい値 (ローテーション期間) は、`IAM-access-key-auto-rotation` Lambda 関数がデプロイされるときに環境変数として設定されます。ローテーション期間が変更されると、`IAM-access-key-auto-rotation` Lambda 関数は更新された環境変数で再デプロイされます。各パラメータを設定して、ローテーション期間、古いキーの非アクティブ期間、古いキーが削除されるまでの期間となる非アクティブバッファを設定できます (「[エピック](#centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-epics)」セクションの「*コードパイプラインのパラメータをカスタマイズする*」を参照)。

1. `IAM-access-key-auto-rotation` Lambda 関数は、設定に基づいてアクセスキーの経過時間を検証します。IAM アクセスキーの経過時間が定義されたローテーション期間を超えていない場合、Lambda 関数はそれ以上のアクションを実行しません。

1. IAM アクセスキーの経過時間が定義されたローテーション期間を超えている場合、`IAM-access-key-auto-rotation` Lambda 関数は新しいキーを作成し、既存のキーをローテーションします。

1. Lambda 関数は古いキーを Secrets Manager に保存し、アクセスキーがセキュリティ標準から逸脱しているユーザーのアクセス許可を制限します。また、Lambda 関数はリソースベースのポリシーを作成し、指定した IAM プリンシパルのみがシークレットにアクセスして取得できるようにします。

1. `IAM-access-key-rotation` Lambda 関数は `Notification` Lambda 関数を呼び出します。

1. `Notification` Lambda 関数は S3 バケットにメールテンプレートを問い合わせ、関連するアクティビティメタデータを使用して E メールメッセージを動的に生成します。

1. `Notification` Lambda 関数は Amazon SES を呼び出し、さらなるアクションを実行します。

1.  Amazon SES はアカウント所有者の E メールアドレスに対し、関連する情報を含む E メールを送信します。

## ツール
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-tools"></a>

**AWS サービス**
+ 「[AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html)」は、AWS リソースへのアクセスを安全に管理し、誰が認証され、使用する権限があるかを制御するのに役立ちます。このパターンには IAM ロールとアクセス許可が必要です。
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) は、サーバーのプロビジョニングや管理を行うことなくコードを実行できるコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。
+ [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) は、コード内のハードコードされた認証情報 (パスワードを含む) を Secrets Manager への API コールに置き換えて、シークレットをプログラムで取得する上で役立ちます。
+ 「[Amazon Simple Email Service (Amazon SES)](https://docs.aws.amazon.com/ses/latest/dg/Welcome.html)」はユーザー自身のメールアドレスとドメインを使用してメールを送受信する上で役立ちます。

**その他のツール**
+ [Terraform](https://www.terraform.io/) は HashiCorp の infrastructure as code (IaC) ツールで、クラウドとオンプレミスのリソースの作成と管理を支援します。

**コードリポジトリ**

このパターンの手順とコードは、GitHub の [IAM access key rotation](https://github.com/aws-samples/centralized-iam-key-management-aws-organizations-terraform.git) リポジトリで入手できます。AWS Control Tower の中央デプロイアカウントにコードをデプロイして、中央の場所からキーローテーションを一元管理できます。

## ベストプラクティス
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-best-practices"></a>
+ IAM については、IAM ドキュメントの「[IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html)」を参照してください。
+ キーローテーションについては、IAM ドキュメントの[アクセスキーを更新するためのガイドライン](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#rotate-credentials)を参照してください。

## エピック
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-epics"></a>

### ソースファイルのセットアップ
<a name="set-up-source-files"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| リポジトリのクローン作成 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 

### アカウントの設定
<a name="configure-accounts"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ブートストラップアカウントの設定 | [AFT ブートストラップ](https://catalog.workshops.aws/control-tower/en-US/customization/aft/deploy)プロセスの一環として、ローカルマシンに `aft-bootstrap` というフォルダが必要となります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 
| グローバルカスタマイズの設定 | [AFT フォルダの設定](https://catalog.workshops.aws/control-tower/en-US/customization/aft/repositories/global-customizations)の一環として、ローカルマシンに `aft-global-customizations` というフォルダが必要となります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 
| アカウントのカスタマイズを設定 | [AFT フォルダの設定](https://catalog.workshops.aws/control-tower/en-US/customization/aft/repositories/account-customizations)の一環として、ローカルマシンに `aft-account-customizations` というフォルダが必要となります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 

### コードパイプラインのパラメータをカスタマイズする
<a name="customize-parameters-for-the-code-pipeline"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| すべてのアカウントの非 Terraform コードパイプラインパラメータをカスタマイズ | `aft-global-customizations/terraform/` フォルダに `input.auto.tfvars` というファイルを作成し、必要な入力データを指定します。デフォルト値については、[GitHub リポジトリのファイル](https://github.com/aws-samples/centralized-iam-key-management-aws-organizations-terraform/blob/main/global-account-customization/input.auto.tfvars)を参照してください。 | DevOps エンジニア | 
| デプロイアカウントのコードパイプラインパラメータをカスタマイズ | `aft-account-customizations/<AccountName>/terraform/` フォルダに `input.auto.tfvars` というファイルを作成し、コードを AWS CodeCommit にプッシュします。AWS CodeCommit にコードをプッシュすると、コードパイプラインが自動的に開始されます。以下の各パラメータの値を、組織の要件に基づいて指定します (デフォルト値については [Github リポジトリのファイル](https://github.com/aws-samples/centralized-iam-key-management-aws-organizations-terraform/blob/main/account-customization/input.auto.tfvars)を参照)。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 

### キーローテーションを検証する
<a name="validate-key-rotation"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| ソリューションの検証 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 

### ソリューションを拡張する
<a name="extend-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| E メール通知日のカスタマイズ | アクセスキーを無効にする前に、特定の日に E メール通知を送信する場合は、以下の変更で `IAM-access-key-auto-rotation` Lambda 関数を更新できます。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | DevOps エンジニア | 

## トラブルシューティング
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-troubleshooting"></a>


| 問題 | ソリューション | 
| --- | --- | 
| アカウントの一覧表示中に `account-inventory` Lambda ジョブが `AccessDenied` で失敗する。 | この問題が発生した場合は、アクセス許可を検証する必要があります。[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/centralize-iam-access-key-management-in-aws-organizations-by-using-terraform.html) | 

## 関連リソース
<a name="centralize-iam-access-key-management-in-aws-organizations-by-using-terraform-resources"></a>
+ [Learn Terraform recommended practices](https://developer.hashicorp.com/terraform/cloud-docs/recommended-practices) (Terraform ドキュメント)
+ [IAM でのセキュリティのベストプラクティス](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) (IAM ドキュメント)
+ [Best practices for key rotation](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#rotate-credentials) (IAM ドキュメント)