AWS Organizations and AWS Secrets Manager を使用してIAMユーザーアクセスキーを大規模に自動的にローテーションする - AWS 規範ガイダンス

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

AWS Organizations and AWS Secrets Manager を使用してIAMユーザーアクセスキーを大規模に自動的にローテーションする

作成者: Tracy Hickey (AWS)、Gaurav Verma (AWS)、Laura Seletos (AWS)、Michael Davie (AWS)、Arvind Patel (AWS)

環境:PoC またはパイロット

テクノロジー: セキュリティ、アイデンティティ、コンプライアンス

AWS サービス: AWS CloudFormation、Amazon CloudWatch Events、AWSアイデンティティとアクセス管理、AWSLambda、AWSOrganizations、Amazon S3、Amazon SES、AWSSecrets Manager

[概要]

重要: ベストプラクティスとして、 では、アクセスキーなどの長期的な認証情報を持つIAMユーザーの代わりに AWS Identity and Access Management (IAM) ロールを使用するAWSことをお勧めします。このパターンで説明されているアプローチは、長期間のAWSAPI認証情報を必要とするレガシー実装のみを対象としています。これらの実装では、Amazon Elastic Compute Cloud (Amazon EC2) インスタンスプロファイルIAM Roles Anywhere を使用するなど、短期認証情報を使用するオプションを検討することをお勧めします。この記事のアプローチは、短期認証情報の使用にすぐには変更できず、長期認証情報をスケジュールに従ってローテーションする必要がある場合のみを対象としています。このアプローチでは、ローテーションされたAPI認証情報を使用するようにレガシーアプリケーションコードまたは設定を定期的に更新する責任があります。

アクセスキーは、IAMユーザーの長期的な認証情報です。IAM 認証情報を定期的にローテーションすると、侵害された一連のIAMアクセスキーがAWSアカウント内のコンポーネントにアクセスできなくなります。IAM 認証情報のローテーションは、 のセキュリティのベストプラクティスIAMの重要な部分でもあります。

このパターンは、キーローテーションリポジトリで提供されている AWS CloudFormation テンプレートを使用して、IAMアクセス GitHub IAMキーを自動的にローテーションするのに役立ちます。

このパターンは、1 つのアカウントまたは複数のアカウントでのデプロイをサポートします。AWS Organizations を使用している場合、このソリューションは組織IDs内のすべてのAWSアカウントを識別し、アカウントが削除されたり、新しいアカウントが作成されたりすると動的にスケーリングします。一元化された AWS Lambda 関数は、引き受けたIAMロールを使用して、選択した複数のアカウントでローテーション関数をローカルで実行します。

  • 既存のIAMアクセスキーが 90 日経過すると、新しいアクセスキーが生成されます。 

  • 新しいアクセスキーは Secrets Manager にシーAWSクレットとして保存されます。リソースベースのポリシーでは、指定されたIAMプリンシパルのみがシークレットにアクセスして取得できます。管理アカウントにキーを保存すると、すべてのアカウントのキーが管理アカウントに保存されます。

  • 新しいアクセスキーが作成されたAWSアカウントの所有者に割り当てられた E メールアドレスに通知が送信されます。

  • 以前のアクセスキーは 100 日後に非アクティブ化され、110 日後に削除されます。

  • 一元化された E メール通知がAWSアカウント所有者に送信されます。

Lambda 関数と Amazon は、これらのアクション CloudWatch を自動的に実行します。その後、新しいアクセスキーペアを取得して、コードまたはアプリケーション内で置き換えることができます。ローテーション、削除、非アクティブ化の期間はカスタマイズできます。

前提条件と制限

  • 少なくとも 1 つのアクティブなAWSアカウント。

  • AWS 組織、設定およびセットアップ (チュートリアル を参照)。

  • 管理アカウントから AWS Organizations をクエリするアクセス許可。詳細については、AWS「Organizations ドキュメント」の「Organizations」と「サービスにリンクされたロール」を参照してください。 AWS

  • AWS CloudFormation テンプレートと関連リソースを起動するアクセス許可を持つIAMプリンシパル。詳細については、 AWS CloudFormation ドキュメントの「セルフマネージドアクセス許可を付与する」を参照してください。

  • リソースをデプロイするための既存の Amazon Simple Storage Service (Amazon S3) バケット。

  • Amazon Simple Email Service (Amazon SES) がサンドボックスから移動しました。詳細については、Amazon ドキュメントの「Amazon SESサンドボックスからの移動」を参照してください。 SES

  • 仮想プライベートクラウド (VPC) で Lambda を実行する場合は、メイン CloudFormation テンプレートを実行する前に次のリソースを作成する必要があります。

    • VPC。

    • サブネット。

    • Amazon SES、AWSSystems Manager、AWSSecurity Token Service (AWS STS)、Amazon S3、AWSSecrets Manager のエンドポイント。( GitHub IAMキーローテーションリポジトリで提供されているエンドポイントテンプレートを実行して、これらのエンドポイントを作成できます。)

  • AWS Systems Manager パラメータ ( パラメータSMTP) に保存されている Simple Mail Transfer Protocol (SSM) ユーザーとパスワード。パラメータはメイン CloudFormation テンプレートパラメータと一致する必要があります。

アーキテクチャ

テクノロジースタック

  • Amazon CloudWatch

  • Amazon EventBridge

  • IAM

  • AWS Lambda

  • AWS 組織 

  • Amazon S3

アーキテクチャ

次の図は、このパターンのコンポーネントとワークフローを示しています。このソリューションでは、認証情報をメンバーアカウントと管理アカウントに保存する 2 つのシナリオがサポートされています。

オプション 1: 認証情報をメンバーアカウントに保存する

メンバーアカウントにIAM認証情報を保存する

オプション 2: 認証情報を管理アカウントに保存する

管理アカウントにIAM認証情報を保存する

図は次のワークフローを示しています。

  1. EventBridge イベントは 24 時間ごとに account_inventoryLambda 関数を開始します。

  2. この Lambda 関数は、すべてのAWSアカウント IDs、アカウント名、およびアカウント E メールのリストを AWS Organizations にクエリします。 

  3. account_inventoryLambda 関数は、AWSアカウント ID ごとに access_key_auto_rotation Lambda 関数を開始し、メタデータを渡して追加の処理を行います。

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

  5. IAM アクセスキーの経過時間がベストプラクティスのしきい値を超えない場合、Lambda 関数はそれ以上のアクションを実行しません。

  6. IAM アクセスキーの経過時間がベストプラクティスのしきい値を超えた場合、access_key_auto_rotationLambda 関数は実行するローテーションアクションを決定します。

  7. アクションが必要な場合、access_key_auto_rotationLambda 関数は新しいキーが生成されると AWS Secrets Manager でシークレットを作成して更新します。リソースベースのポリシーも作成され、指定されたIAMプリンシパルのみがシークレットにアクセスして取得できます。オプション 1 の場合、認証情報はそれぞれのアカウントの Secrets Manager に保存されます。オプション 2 の場合 (StoreSecretsInCentralAccount フラグが True に設定されている場合)、認証情報は管理アカウントの Secrets Manager に保存されます。 

  8. notifier Lambda 関数が開始され、アカウントの所有者にローテーションアクティビティが通知されます。この関数は、AWSアカウント ID、アカウント名、アカウント E メール、および実行されたローテーションアクションを受け取ります。 

  9. notifier Lambda 関数はデプロイメント S3 バケットにメールテンプレートをクエリし、関連するアクティビティメタデータを使用して動的に更新します。その後、E メールはアカウントオーナーの E メールアドレスに送信されます。

注意:

  • このソリューションは、複数のアベイラビリティゾーンでの耐障害性をサポートします。ただし、複数の AWS リージョンでは回復性をサポートしていません。複数のリージョンでサポートを受けるには、ソリューションを 2 番目のリージョンにデプロイし、キーローテーション EventBridge ルールを無効にしたままにできます。その後、2 つ目のリージョンでソリューションを実行したいときにルールを有効にできます。

  • このソリューションは監査モードで実行できます。監査モードでは、IAMアクセスキーは変更されませんが、ユーザーに通知するための E メールが送信されます。ソリューションを監査モードで実行するには、キーローテーションテンプレートを実行するとき、または access_key_auto_rotation Lambda 関数の環境変数で DryRunFlag フラグを True に設定します。

自動化とスケール

このソリューションを自動化する CloudFormation テンプレートは、 GitHub IAMキーローテーションリポジトリに提供され、コードセクションに一覧表示されます。AWS Organizations では、 CloudFormation StackSetsを使用して、ソリューションを各メンバーアカウントに個別にデプロイするのではなく、複数のアカウントにASA-iam-key-auto-rotation-iam-assumed-roles.yaml CloudFormation テンプレートをデプロイできます。 

ツール

AWS サービス

  • Amazon CloudWatch は、AWSリソースのメトリクスと、実行するアプリケーションのAWSメトリクスをリアルタイムでモニタリングするのに役立ちます。

  • AWS Identity and Access Management (IAM) は、誰が認証され、誰に使用を許可されているかを制御することで、AWSリソースへのアクセスを安全に管理するのに役立ちます。

  • AWS Lambda は、サーバーのプロビジョニングや管理を必要とせずにコードを実行するのに役立つコンピューティングサービスです。必要に応じてコードを実行し、自動的にスケーリングするため、課金は実際に使用したコンピューティング時間に対してのみ発生します。

  • AWS Organizations は、複数のアカウントを作成および一元管理する組織に集約するのに役立つAWSアカウント管理サービスです。

  • AWS Secrets Manager は、パスワードを含むコード内のハードコードされた認証情報を Secrets Manager へのAPI呼び出しに置き換えて、プログラムでシークレットを取得するのに役立ちます。

  • Amazon Simple Storage Service (Amazon S3) は、どのようなデータ量であっても、データを保存、保護、取得することを支援するクラウドベースのオブジェクトストレージサービスです。

  • Amazon Simple Email Service (Amazon SES) は、独自の E メールアドレスとドメインを使用して E メールを送受信するのに役立ちます。

  • Amazon Simple Notification Service (Amazon SNS) は、ウェブサーバーや E メールアドレスなど、パブリッシャーとクライアント間のメッセージ交換の調整と管理に役立ちます。

  • Amazon Virtual Private Cloud (Amazon VPC) は、定義した仮想ネットワークにAWSリソースを起動するのに役立ちます。この仮想ネットワークは、独自のデータセンターで運用する従来のネットワークに似ており、 のスケーラブルなインフラストラクチャを使用する利点がありますAWS。 

  • Amazon VPCエンドポイントは、多くのサービスを含むAWS PrivateLink、 が提供するAWSサービスに接続するためのインターフェイスを提供します。から指定するサブネットごとにVPC、エンドポイントネットワークインターフェイスがサブネットに作成され、サブネットアドレス範囲からプライベート IP アドレスが割り当てられます。 

コード

必要なAWS CloudFormation テンプレート、Python スクリプト、ランブックドキュメントは、 GitHub IAMキーローテーションリポジトリにあります。テンプレートは次のようにデプロイされます。

テンプレート

デプロイ先

Notes (メモ)

ASA-iam-key-auto-rotation-and-notifier-solution.yaml

デプロイアカウント

これはソリューションのメインテンプレートです。

ASA-iam-key-auto-rotation-iam-assumed-roles.yaml

認証情報をローテーションしたい単一または複数のメンバーアカウント

CloudFormation スタックセットを使用して、このテンプレートを複数のアカウントにデプロイできます。

ASA-iam-key-auto-rotation-list-accounts-role.yaml

セントラル/管理アカウント

このテンプレートを使用して、AWSOrganizations のアカウントのインベントリを保持します。

ASA-iam-key-auto-rotation-vpc-endpoints.yaml

デプロイアカウント

このテンプレートを使用してエンドポイントの作成を自動化するには、 VPC で Lambda 関数を実行する (メインテンプレートで RunLambdaInVPCパラメータを True に設定する) 必要があります。

エピック

タスク説明必要なスキル

デプロイする S3 バケットを選択します。

アカウントのAWSマネジメントコンソールにサインインし、Amazon S3 コンソール を開き、デプロイする S3 バケットを選択します。AWS Organizations で複数のアカウントにソリューションを実装する場合は、組織の管理アカウントにサインインします。

クラウドアーキテクト

リポジトリをクローン作成します。

GitHub IAM キーローテーションリポジトリをローカルデスクトップにクローンします。

クラウドアーキテクト

ファイルを S3 バケットにアップロードします。

クローンファイルを S3 バケットにアップロードします。以下のデフォルトフォルダ構造を使用して、クローンされたファイルとディレクトリをすべてコピーして貼り付けます。asa/asa-iam-rotation

: CloudFormation テンプレートでこのフォルダ構造をカスタマイズできます。

クラウドアーキテクト

E メールテンプレートを変更します。

iam-auto-key-rotation-enforcement.html E メールテンプレート (template フォルダ内) を要件に合わせて変更します。テンプレートの末尾の [Department Name Here] を部門名に置き換えます。

クラウドアーキテクト
タスク説明必要なスキル

キーローテーションの CloudFormation テンプレートを起動します。

  1. デプロイアカウントで ASA-iam-key-auto-rotation-and-notifier-solution.yaml テンプレートを起動します。詳細については、 CloudFormation ドキュメントの「スタックテンプレートの選択」を参照してください。

  2. 次のようなパラメータの値を指定します。

    • CloudFormation S3 バケット名 (S3BucketName) – Lambda コードを含むデプロイ S3 バケットの名前。

    • CloudFormation S3 バケットプレフィックス (S3BucketPrefix) – S3 バケットのプレフィックス。

    • 想定IAMロール名 (IAMRoleName) – key-rotation Lambda 関数がキーをローテーションするために想定するロール名。

    • IAM 実行ロール名 (ExecutionRoleName) – key-rotation Lambda 関数で使用されるIAM実行ロールの名前。

    • インベントリ実行ロール名 (InventoryExecutionRoleName) – account_inventory Lambda 関数で使用されるIAM実行ロールの名前。

    • ドライランフラグ (監査モード) (DryRunFlag)True に設定すると監査モードがオンになります (デフォルト)。False に設定すると、強制モードがオンになります。

    • 組織アカウントを一覧表示するアカウント (OrgListAccount) – 組織内のアカウントを一覧表示するために使用される中央/管理アカウントのアカウント ID。

    • アカウント一覧ロール名 (OrgListRole) – 組織内のアカウントを一覧表示するために使用されるロール名。

    • セントラルアカウントの Secrets Store フラグ (StoreSecretsInCentralAccount) – True に設定すると、セントラルアカウントにシークレットが保存されます。False に設定すると、シークレットはそれぞれのアカウントに保存されます。

    • 認証情報をレプリケートするリージョン (CredentialReplicationRegions) – 認証情報をレプリケートするAWSリージョン (Secrets Manager)。カンマで区切られていますus-east-2,us-west-1,us-west-2。例えば、。スタックの作成しているスタックのリージョンをスキップします。

    • RunLambdaInVpc) で Lambda VPC を実行する — True に設定して、指定された で Lambda 関数を実行しますVPC。VPC エンドポイントを作成し、Lambda 関数を含むサブネットにNATゲートウェイをアタッチする必要があります。詳細については、このオプションについて説明している re: POST の記事を参照してください。

    • VPC Lambda 関数の ID (VpcId)、VPCセキュリティグループルールCIDRの ID (VpcCidr)、および Lambda 関数のサブネット ID (SubnetId) – True RunLambdaInVpcに設定する場合はVPC、、CIDR、、およびサブネットに関する情報を提供します。

    • 管理者メールアドレス (AdminEmailAddress) – 通知の送信先となる有効なメールアドレス。

    • AWS 組織 ID (AWSOrgID) – 組織の一意の ID。この ID は o- で始まり、その後に 10~32 個の小文字または数字が続きます。

    • E メールテンプレートファイル名 [監査モード] EmailTemplateAudit) と 〔強制モード〕 (EmailTemplateEnforce) – 監査モードと強制モードのためにnotifierモジュールによって送信される E メールHTMLテンプレートのファイル名。

    • SMTP ユーザーSSMパラメータ名 (SMTPUserParamName) SMTP SSM とパスワードパラメータ名 (SMTPPasswordParamName) – Simple Mail Transfer Protocol () のユーザーとパスワード情報SMTP。 

クラウドアーキテクト

引き受けたロールの CloudFormation テンプレートを起動します。

  1. AWS CloudFormation コンソール で、キーをローテーションする各アカウントのASA-iam-key-auto-rotation-iam-assumed-roles.yamlテンプレートを起動します。複数のアカウントがある場合は、メイン CloudFormation テンプレートを管理アカウントにスタックとしてデプロイし、 CloudFormation スタックセットを含むASA-iam-key-auto-rotation-iam-assumed-roles.yamlテンプレートを必要なすべてのアカウントにデプロイできます。詳細については、 CloudFormation ドキュメントの「 の使用AWS CloudFormation StackSets」を参照してください。

  2. 次のパラメータの値を指定します。

    • 想定IAMロール名 (IAMRoleName) – Lambda access_key_auto_rotation関数によって想定されるIAMロール名。デフォルト値をそのまま使用できます。

    • IAM 実行ロール名 (ExecutionRoleName) – Lambda 関数を実行するサブアカウントロールを引き受けIAMるロール。

    • プライマリAWSアカウント ID (PrimaryAccountID) – メインテンプレートがデプロイされるAWSアカウント ID。 

    • IAM 適用除外グループ (IAMExemptionGroup) – 自動キーローテーションから除外するIAMアカウントを容易にするために使用されるIAMグループ名。

クラウドアーキテクト

アカウントインベントリの CloudFormation テンプレートを起動します。

  1. 管理/中央アカウントで ASA-iam-key-auto-rotation-list-accounts-role.yaml テンプレートを起動します

  2. 次のパラメータの値を指定します。

    • 想定IAMロール名 (IAMRoleName) – Lambda access_key_auto_rotation関数が引き受けるIAMロール名。

    • IAM Account Lambda の実行ロール名 (AccountExecutionRoleName) – Lambda notifier関数が引き受けるIAMロールの名前。

    • IAM ローテーション Lambda の実行ロール名 (RotationExecutionRoleName) – Lambda access_key_auto_rotation関数が引き受けるIAMロールの名前。

    • プライマリAWSアカウント ID (PrimaryAccountID) – メインテンプレートがデプロイされるAWSアカウント ID。

クラウドアーキテクト

VPC エンドポイントの CloudFormation テンプレートを起動します。

このタスクはオプションです。

  1. デプロイアカウントで ASA-iam-key-auto-rotation-vpc-endpoints.yaml テンプレートを起動します。 

  2. 次のパラメータの値を指定します。

    • VPC ID (pVpcId)、サブネット ID (pSubnetId)、および (pVPCCidr) CIDRの範囲 VPC – VPC、CIDR、およびサブネットに関する情報を提供します。

    • 各VPCエンドポイントの パラメータを True に設定します。エンドポイントが既にある場合は、False を選択できます。

クラウドアーキテクト

関連リソース