Amazon Web Services ブログ
サンドボックス、開発、テスト環境で IAM ポリシー作成を一元化および自動化する方法
本番環境に対応したアーキテクチャに移行する際、お客様のアプリケーションチームはサンドボックス環境で AWS のサービスを試して、AWS の進化していくイノベーションに対応することができます。アプリケーションチームは、さまざまな AWS のサービスとリソースにタイムリーにアクセスする必要があります。つまり、最低限の権限を与えられることを保証するメカニズムを必要とします。通常、アプリケーションチームは、定期的に Amazon Elastic Block Store のスナップショットバックアップを行う AWS Lambda 関数や、セキュリティチームが管理する一元化された情報セキュリティアカウントにイベントを送信する Amazon CloudWatch Events ルールなどの管理リソースにアクセスできません。
このブログ投稿では、さまざまなサンドボックス、開発、テスト環境で作業しているアプリケーションチームが AWS Identity and Access Management (IAM) ポリシーを作成および検証するため、一元化かつ自動化したワークフローを作成する方法をご紹介します。セキュリティ開発者は、セキュリティチームの特定の要件に従ってこのワークフローをカスタマイズできます。セキュリティ開発者は、アカウントの種類または所有チームに基づいたアクセス許可セットを制限するロジックも作成できます。AWS CodePipeline を使用して、さまざまな段階や複数の AWS アカウントにわたるワークフローを作成および管理します。これについては、次のセクションで詳しく説明します。
ソリューションの概要
次のシナリオから始めましょう。Alice は AWS サンドボックスアカウントの管理者です。これは、組織のデータサイエンティストが Amazon Athena や Amazon EMR などの AWS の分析サービスを試す際に使用します。データサイエンティストは、機密情報が取り出された後、実際のデータセットの一部に対して分析ジョブのサンプルを実行することで、これらのサービスが本番ユースケースに適合しているかを評価します。データセットは既存の Amazon Simple Storage Service (Amazon S3) バケットに保存されます。Alice は新しいプロジェクトごとに、プロジェクトチームに要求された Amazon S3 バケットにアクセスして、分析クラスターを作成できるようにする新しい IAM ポリシーを作成します。ただし Alice は、サンドボックスアカウントが特定の Amazon Elastic Compute Cloud (Amazon EC2) インスタンスタイプのみを起動できるという会社のガイドラインに従う必要があります。さらに、セキュリティチームがサンドボックスアカウントのコンプライアンスをモニタリングするのに使用する、すべての管理上の AWS Lambda 機能と CloudWatch Events ルールへのアクセスを制限する必要もあります。以下に示すのは、これらの要件を満たし、Alice や他の管理者がタスクの実行を簡単にできるようにするソリューションです。
- Alice は IAM ビジュアルエディタを使用して、データサイエンスチームが EMR クラスターを起動および管理するためのアクセスを許可するテンプレートを作成します。このクラスターは S3 ベースのデータセットを分析するものです。次に、AWS Key Management Service (AWS KMS) キーを使用して、IAM JSON ポリシードキュメントを既存の S3 バケットにアップロードします。キーと S3 バケットは、アカウントベースラインの一部としてセキュリティチームによって既に作成されています。これについては、この投稿で後ほど詳しく説明します。
- AWS CodePipeline は IAM JSON ポリシードキュメントを自動的に取得し、一連の検証処理を呼び出します。このチェックでは、セキュリティチームが管理する AWS アカウントでホストする単一で中央の Lambda 関数を使用します。
- IAM JSON ポリシーは、セキュリティ開発者がコーディングしたすべてのアカウントと一般的なセキュリティ要件に準拠している場合、中央の Lambda 関数は Alice のアカウントにポリシーを自動的に作成し、パイプラインは成功します。検証を行う中央の Lambda 関数はまた、定義済みの明示的な拒否のセットを IAM ポリシーに添付して、サンドボックスアカウントの望ましくないユーザー機能を制限するようにします。IAM JSON ポリシーがチェックに失敗した場合、パイプラインは失敗し、Alice にコンプライアンス違反である理由を提供します。その後、Alice はポリシーを変更して再送信する必要があります。ポリシーが正常に作成されると、Alice はそれを正しい IAM ユーザー、グループ、またはロールに添付します。
ソリューションのデプロイメント
このソリューションには、次の 3 つの手順が含まれます。
- ステップ 1: ソリューションの前提条件をデプロイする
- ステップ 2: 中央の情報セキュリティアカウントでポリシーを検証する Lambda 関数を設定する
- ステップ 3: サンドボックスアカウントのパイプラインをテストする
前提条件
このソリューションでは AWS のサービスまたは IAM エンティティに付与されるアクセス許可を管理するため、最初に隔離されたテスト環境でソリューションを試し、セキュリティ要件をすべて満たしていることを確認することを強く推奨します。
- ソリューションをセットアップするには、2 つの AWS アカウントで管理者アクセスが必要です。このソリューションのデプロイは、通常、新しい AWS アカウントをセットアップするときに組織の管理者が行います。次の 2 つの種類のアカウントにアクセスする必要があります。
- サンドボックスアカウントこのアカウントで、アプリケーションチームはさまざまな AWS アーキテクチャを試すことができます。前述のように、これは開発アカウントあるいはテストアカウントの場合があります。
- 中央の情報セキュリティアカウント。通常、これはマルチアカウント構造内でセキュリティコンプライアンスをモニタリングおよび実施する情報セキュリティチームが所有しています。
重要: 情報セキュリティアカウントで作成する Lambda 関数には高度なアクセス許可が付与されているため、アカウントを保護するためにもベストプラクティスを厳守してください。アカウントへのアクセスをセキュリティチームメンバーに制限する必要があります。また、サンドボックスアカウント管理者は、この中央の Lambda 機能に、IAM ポリシーの作成以外のサンドボックスアカウントの IAM アクセス許可を与えないでください。
- 両方の AWS アカウントが AWS マネジメントコンソールを使用するため、両方の AWS アカウントにロールを持ち、コンソールのロールの切り替え機能を使用することを強くお勧めします。エイリアスを各アカウントに添付し、それぞれに異なる色コードを付けると、ログインしているアカウントを常に把握できます。
- このソリューション用に作成するすべてのリソースに、同じ AWS リージョンを使用してください。
ステップ 1: ソリューションの前提条件をデプロイする
2 つの AWS アカウントをつなぐパイプラインを構築する前に、最初に両方のアカウントで必要なリソース (IAM ロールや暗号化キーなど) を設定する必要があります。通常、組織が初めてにサンドボックス、開発、テスト環境をセットアップする際に、この設定はセキュリティチームのガイドラインに従って行われます。
重要
- このセクションで作成する最初のセットアップに加えて、セキュリティチームは、サンドボックス、開発、またはテストアカウントの管理者が AdministratorAccess IAM ポリシーのようなそのアカウントタイプのために許可されたセキュリティポリシーを満たさない IAM ポリシーを添付することを明示的に拒否する必要があります。加えて、セキュリティチームは、アカウントの現在や将来のユーザー、グループ、あるいはロールに、(たとえば) CreatePolicy、CreatePolicyVersion、PutRolePolicy、PutUserPolicy、PutGroupPolicy、UpdateAssumeRolePolicy といった IAM ポリシーを直接設定や更新するアクセス許可がないことを確認する必要があります。アクセス許可の作成は、自動化パイプラインを介してのみ実行できるようにする必要があります。これについては、後ほど、作成する方法を説明します。
- これから説明するソリューションは最低限の特権の作成に焦点を当てているため、セキュリティチームがソリューションを IAM アクセス許可の境界と組み合わせて、このソリューションで定義されているすべてのアクセス許可が組織内のあらゆる種類のアカウントの一連の定義済みアクセス許可がスコープを指定するようにしておくことを強くお勧めします。たとえばアカウント管理者は、これらのプリンシパルに添付されるアクセス許可を制限する、定義済みアクセス許可の境界のセットを持つ IAM ユーザーまたはロールの作成のみが許可されることがあります。アクセス許可の境界の詳細については、こちらの AWS セキュリティブログの投稿をご参照ください。
サンドボックスアカウントの前提条件を作成する
以下の手順に従って、AWS CloudFormation テンプレートをデプロイして、サンドボックスアカウントに次のリソースを作成します。
- サンドボックス管理者が IAM ポリシーをアップロードする S3 バケット
- 自動化パイプラインが IAM ポリシーを格納する S3 バケットにアクセスするための IAM ロール
- S3 バケットの IAM ポリシーを暗号化するための AWS KMS キー
- デフォルトのブラウザでサンドボックスアカウントにログインしている間に、こちらのリンクをクリックして、サンドボックス環境の前提条件で AWS スタックを起動します。テンプレート URL が既に入力された状態で、CloudFormation コンソールにリダイレクトされます。
- [Next] をクリックし、オプションでスタックの名前を指定します。推奨されるスタック名、Sandbox-Pipeline は既に入力されています。
- テンプレートは、セキュリティアカウントの AWS アカウント ID を入力できる CentralAccount という入力パラメータを定義しています。セキュリティアカウントのアカウント ID を見つける方法に関する詳細については、こちらを確認してください。
- [Next] を選択してから、もう一度 [Next] をクリックします。
- パイプラインで使用する IAM ロールをスタックに作成させるには、[I acknowledge that AWS CloudFormation might create IAM resources with custom names] のチェックボックスをオンにしてから、[Create Stack] をクリックします。
- [Stack info] タブを選択し、[Stack Status] フィールド値を見ながら定期的に更新します。スタックが CREATE_COMPLETE の状態に達したら、CloudFormation の [Outputs] タブに移動し、次の出力値を選択したテキストエディタにコピーします。これらの値は、後に CloudFormation スタックで使用します。
情報セキュリティアカウントの前提条件を作成する
以下の手順に従って、情報セキュリティアカウントに、次のリソースを作成する CloudFormation テンプレートをデプロイします。
- 中央の Lambda 関数を呼び出して、サンドボックスアカウント KMS キーへのアクセスを提供するために、自動化パイプラインが使用する IAM ロール
- サンドボックスアカウントでロールを引き受けて、IAM ポリシーを管理するために、中央の Lambda 関数が使用する IAM ロール
- デフォルトのブラウザでサンドボックスアカウントにログインしている間に、こちらのリンクをクリックして、サンドボックス環境の前提条件で AWS スタックを起動します。テンプレート URL が既に入力された状態で、CloudFormation コンソールにリダイレクトされます。
- [Next] をクリックし、オプションでスタックの名前を指定します。推奨されるスタック名、Sandbox-Pipeline は既に入力されています。
- 次の入力パラメーターフィールドに入力します。
- SandboxAccount: サンドボックスアカウントの AWS アカウン トID。
- ArtifactBucket: サンドボックスアカウントで実行した以前のスタックのテキストエディタでメモしたバケット名
- CMKARN: サンドボックスアカウントで実行した以前のスタックのテキストエディタでメモした KMS キーの Amazon リソース名 (ARN)
- PolicyCheckerFunctionName: 後で作成する Lambda 関数の名前。デフォルト値は PolicyChecker です。
- [Next] を選択してから、もう一度 [Next] をクリックします。
- パイプラインで使用する IAM ロールをスタックに作成させるには、[I acknowledge that AWS CloudFormation might create IAM resources with custom names] のチェックボックスをオンにしてから、[Create Stack] をクリックします。
- スタックが CREATE_COMPLETE の状態に達するまでスタックを待ちます。
サンドボックスアカウントのパイプラインを作成する
サンドボックスアカウントに戻り、サンドボックスアカウントで次のリソースを作成する CloudFormation テンプレートをデプロイします。
- S3 から IAM ポリシードキュメントを取得して、検証を一元化するためセキュリティアカウントに送信する AWS CodePipeline 自動化パイプライン。有効となっている場合、情報セキュリティアカウントの Lambda 関数は、サンドボックスアカウントに IAM ポリシーも作成します。
- 中央の Lambda 関数がバケットから IAM ポリシーの JSON ドキュメントを取得できるようにする S3 バケットポリシー
- 中央の情報セキュリティアカウントの Lambda 関数が引き受け、サンドボックスアカウントで IAM ポリシーを作成するために使用する IAM ロール。サンドボックスアカウント管理者は、それらの IAM ポリシーを、IAM ユーザーやロールなどの必要なエンティティに添付できます。
- デフォルトのブラウザでサンドボックスアカウントにログインしている間に、こちらのリンクをクリックして、サンドボックス環境の前提条件で AWS スタックを起動します。テンプレート URL が既に入力された状態で、CloudFormation コンソールにリダイレクトされます。
- [Next] をクリックし、オプションでスタックの名前を指定します。推奨されるスタック名、Sandbox-Pipeline は既に入力されています。
- 次の入力パラメーターフィールドに入力します。
- CentralAccount: ハイフンのない情報セキュリティアカウントの AWS アカウント ID。
- ArtifactBucket: 前にテキストエディタで書き留めてある、情報セキュリティアカウントの以前のスタックで使用したものと同じバケット名。
- CMKARN: 前にテキストエディターで書き留めてある、情報セキュリティアカウントの以前のスタックで使用した KMS キーの ARN。
- PolicyCheckerFunctionName: 繰り返しになりますが、後で作成する Lambda 関数の名前。これは、情報セキュリティアカウントテンプレートに指定した値と同じでなければなりません。
- [Next] を選択してから、もう一度 [Next] をクリックします。
- スタックに必要な IAM ロールを作成させるには、[I acknowledge that AWS CloudFormation might create IAM resources with custom names] のチェックボックスをオンにし、[Create Stack] をクリックします。
- スタックが CREATE_COMPLETE の状態に達するまでスタックを待ちます。
ステップ 2: 中央の情報セキュリティアカウントでポリシーを検証する Lambda 関数を設定する
中央の情報セキュリティアカウントで、サンドボックス環境で作成した IAM ポリシーを検証する Lambda 関数を作成します。
- AWS Lambda コンソールで、[Create Function] を選択してから、[Author from scratch] をクリックします。次のフィールドに値を指定します。
- 名前。これは、情報セキュリティアカウントの前提条件を設定するときに、ステップ 1 で CloudFormation の入力パラメータ PolicyCheckerFunctionName として定義した関数名と同じである必要があります。ステップ 1 でデフォルト値を変更しなかった場合、デフォルトは PolicyChecker のままです。
- ランタイム。Python 2.7。
- ロール。ロールを設定するには、[Choose an existing role] をクリックしてから、policy-checker-lambda-role という名前のロールを選択します。これは、情報セキュリティアカウントの前提条件を設定するときに、ステップ 1 で作成したロールです。
[Create Function] をクリックし、[Function Code] までスクロールダウンして、次のコードをエディタに貼り付けます (既存のコードを置き換えます)。
このサンプルコードは、すべてのアカウントリソースですべての IAM アクションを許可してしまい、制限が少なすぎるポリシーについて、Alice が送信した IAM JSON ポリシーを Lambda 関数が確認する方法を示しています。サンプルコードには、T2 EC2 インスタンスファミリーの一部ではない Amazon EC2 インスタンスの起動を防ぐ IAM 拒否アクションも示されています。ここで明示的に拒否すると、T2 インスタンスのみを起動できます。セキュリティ開発者はこのサンプルコードと同様のコードを作成して、すべてのアカウントタイプのセキュリティポリシーを満たし、さまざまなサンドボックス、開発、テスト環境で作成した IAM ポリシーを制御する必要があります。
- 新しい Lambda 関数コードを保存する前に、さらに下にスクロールして Basic Settings セクションを表示し、関数のタイムアウトを 10 秒に増やします。
- [Save] をクリックします。
ステップ 3: サンドボックスアカウントのパイプラインをテストする
いよいよ、サンドボックスアカウントにソリューションをデプロイします。
- 次のファイルを作成し、それらを policy.zip という名前のアーカイブに圧縮します (これは、作成済みパイプラインが予想する名前です)。
- metadata.json: このファイルには、作成する IAM ポリシーの名前や説明などのメタデータが含まれています。
- policy.json: このファイルには、作成する IAM ポリシーの JSON 本体が含まれています。
- policy.zip ファイルを前に作成したバケットにアップロードするには、サンドボックスアカウントの Amazon S3 コンソールに移動し、ページ上部の検索ボックスで、以前にテキストエディタで ArtifactBucket としてメモしたバケットを検索します。
- バケットを見つけたら、バケット名をクリックし、[Upload] を選択します。アップロードダイアログが表示されます。
- [Add Files] を選択し、policy.zip ファイルがあるフォルダーに移動します。ファイルを選択し、[Open]、[Next] の順にクリックしてから、もう一度 [Next] をクリックします。
- [AWS KMS master-key] ラジオボタンをクリックし、エイリアス codepipeline-policy-crossaccounts がある KMS キーを選択します。
- [Next]、[Upload] の順にクリックします。
- AWS CodePipeline コンソールに移動し、サンドボックスパイプラインを選択して、パイプラインが実行を開始するのを待ちます。開始するまで、最大 1 分かかる場合があります。
- パイプラインが完了するまで待ちます。アップロードしたばかりの IAM ポリシーに検証エラーがなく、IAM ポリシーが正常に作成されている必要があります。新しく作成した IAM ポリシーを表示するには、AWS IAM コンソールを開きます。
- 左側で [Policies] を選択し、metadata.json ファイルで定義されている名前のポリシーを検索します。
- ポリシー名を選択します。定義済みポリシーに自動的に追加された IAM の拒否に注意してください。
パイプラインをさらにテストする場合は、ポリシーを変更すれば、すべてのリソースですべてのアクションを許可できます。policy.zip が再度アップロードされると、パイプラインは次のエラーを返します。
Lambda 関数コードを変更するときにエラーが発生した場合には、中央の情報セキュリティアカウントの Lambda 関数ログにいつでも戻ることができます。Lambda 関数ログにアクセスする方法の詳細については、ドキュメントをご参照ください。
ここで使用しているロジックと同じものを、他のサンドボックス、開発、テスト環境にも拡張できます。ただし、中央の情報セキュリティアカウントの場合、既存のロールを更新して、新しく追加したサンドボックス、開発、テストアカウントのリソースを信頼し、アクセスできるようにする必要があります。
まとめ
このブログ投稿では、さまざまな AWS アカウントで IAM ポリシーの検証と作成を一元化する方法を示しました。これで、セキュリティ開発者はセキュリティのベストプラクティスのコーディングを開始し、さまざまなサンドボックス、開発、テストアカウント全体で、IAM ポリシーの自動作成と検証を許可できるようになります。アカウント管理者は、検証済み IAM ポリシーを必要な IAM ユーザー、グループ、またはロールに添付できます。このプロセスは、俊敏性と制御のバランスを取るものです。これで、アカウント管理者はコンプライアンスと最低限の特権を持つ IAM ポリシーを作成できるようになります。さらに、アプリケーションチームが迅速な実験とイノベーションを推し進めていくことが可能になります。このブログの投稿に関するコメントは、以下のコメントセクションからお送りください。
AWS セキュリティに関するコンテンツ、ニュース、機能についての最新情報を入手したいなら、 Twitter でフォローしてください。