Skip to content

Latest commit

 

History

History
500 lines (343 loc) · 25 KB

DeployToControlTower_ja.md

File metadata and controls

500 lines (343 loc) · 25 KB

Deploy to ControlTower environment

In English | リポジトリの README に戻る

ここでは ControlTower 管理下のアカウントに BLEA を導入する手順について記述します。

デプロイの流れ

デプロイするステップは以下の通りです。デプロイするだけの場合ビルド環境の構築は必ずしも必要ありませんが、コードの変更を容易に行うため、エディタも含めた開発環境を用意することをお勧めします。

前提条件

a. ランタイム

  • ランタイム等の前提条件は Standalone 版と同様です。README をご覧ください
  • AWS SSO を使うための前提条件
    • aws2-wrap を使用するため、 Python3 (>= 3.8) が必要です。
    • AWS SSO との連携のため AWS CLI version2が必要です。

b. 開発環境

CDK コードを安全に編集するため、本格的な開発を行わない場合であっても開発環境のセットアップを推奨します。以下に VisualStudioCode のセットアップ手順を示します。

ControlTower 配下への導入手順

ControlTower の配下にマルチアカウント版のガバナンスベースを導入して、ゲストシステムとしてサンプルアプリケーションを導入する手順を例にとって解説します。ここでMCはマネジメントコンソールでの作業を、Localは手元環境での作業を示します。

  1. ControlTower およびセキュリティサービスのセットアップ(MC)

  2. デプロイ対象のゲストアカウントを ControlTower で作成する(MC)

  3. 依存パッケージのインストールとコードのビルド(Local)

  4. AWS SSO に合わせて AWS CLI の認証情報を設定する(Local)

  5. Audit アカウントに通知用のベースラインを設定する(Local)

  6. ゲストアカウント用ガバナンスベースをデプロイする(Local)

  7. ゲストアプリケーションサンプルをデプロイする(Local)

導入手順

1. ControlTower およびセキュリティサービスのセットアップ(MC)

ControlTower を利用することで、ガバナンスベースの一部の機能は自動的に設定されます。ControlTower が対応していないセキュリティサービスは Organizations に対して一括有効化を行うことで、以後新しいアカウントが作られると自動的に設定されるようになります。

ここでは ControlTower をセットアップし、Organizations 全体に対して SecurityHub, GuardDuty そして IAM Access Analyzer を有効化する手順を示します。これらの委任アカウントとして Audit アカウントを指定します。

1-1. ControlTower のセットアップ

ControlTower をセットアップします。 See: [https://docs.aws.amazon.com/controltower/latest/userguide/setting-up.html]

1-2. SecurityHub のセットアップ

1-3. GuardDuty のセットアップ

1-4. IAM Access Analyzer のセットアップ

1-5. Trusted Advisor のセットアップ

2. デプロイ対象のゲストアカウントを ControlTower で作成する(MC)

2-1. ゲストアカウントを作成する

ControlTower を使って新しいアカウント(ゲストアカウント)を作成します。

See: [https://docs.aws.amazon.com/controltower/latest/userguide/account-factory.html#quick-account-provisioning]

2-2. AWS Chatbot の事前準備として Slack workspaces の設定を行う

ゲストアカウントにおける、セキュリティイベントおよびモニタリングイベント通知のために Slack 連携用の設定を行います。セキュリティ通知のためのチャネル、システム監視通知のためのチャネルを Slack に作成し、以下の手順に従って Chatbot の設定を行います。設定が終わったら後の設定のため、ワークスペースの ID(1 つ)、通知先のチャネルの ID(2 つ)をメモしておきます。

3. 依存パッケージのインストールとコードのビルド(Local)

3-1. リポジトリの取得

git clone https://github.com/aws-samples/baseline-environment-on-aws.git
cd baseline-environment-on-aws

3-2. 依存する NPM パッケージのインストール

# install dependencies
npm ci

3-3. git-secrets のセットアップ

Git に Commit する際に Linter, Formatter, git-secrets によるチェックを行うための Hook を登録します。以下の手順に従ってセットアップしてください。デプロイするだけの場合は必須ではありませんが、よりセキュアに開発するためにセットアップを推奨します。

4. AWS SSO に合わせて AWS CLI の認証情報を設定する(Local)

恒久的な認証情報も利用可能ですが、ControlTower 環境では AWS SSO の利用を推奨します。AWS SSO によって、マネジメントコンソールへのログインおよび SSO 認証による AWS CLI の実行が可能です。

4-1. AWS CLI のバージョンを確認する

AWS CLI - AWS SSO 統合を使うためには、AWS CLIv2 を使う必要があります。

次のように CLI のバージョンを確認します:

aws --version

出力結果がバージョン 2 以上であることを確認します

aws-cli/2.3.0 Python/3.8.8 Darwin/20.6.0 exe/x86_64 prompt/off

4-2. aws2-wrap を導入する

AWS CLI - AWS SSO 統合を CDK から使用するため、オープンソースのツールである aws2-wrap ([https://github.com/linaro-its/aws2-wrap]) を CDK を実行する環境にインストールします

pip3 install aws2-wrap

4-3. Audit アカウントデプロイ用の AWS CLI プロファイルを設定する

次に、Control Tower の Audit アカウントにデプロイするための CLI プロファイルを設定します。ここではマネジメントアカウントの ID を 1111111111111, Audit アカウントの ID を 222222222222 としています。

~/.aws/config

# for Management Account Login
[profile ct-management-sso]
sso_start_url = https://d-90xxxxxxxx.awsapps.com/start#/
sso_region = ap-northeast-1
sso_account_id = 1111111111111
sso_role_name = AWSAdministratorAccess
region = ap-northeast-1

# Accessing with AWSControlTowerExecution Role on Audit Account
[profile ct-audit-exec-role]
role_arn = arn:aws:iam::222222222222:role/AWSControlTowerExecution
source_profile = ct-management-sso
region = ap-northeast-1

# for CDK access to ct-audit-exec-role
[profile ct-audit-exec]
credential_process = aws2-wrap --process --profile ct-audit-exec-role
region = ap-northeast-1

NOTE:

ControlTower の仕様により、Audit アカウントにデプロイするためには、まずマネジメントアカウントの AWSAdministratorAccess ロールでログインし、Audit アカウントのAWSControlTowerExecutionロールにスイッチして処理を実行する必要があります。

ct-management-ssoプロファイルで SSO ログインすることで、ct-audit-exec-roleプロファイルを使って Audit アカウント上での操作が可能です。これに CDK からアクセスするため、ラッピングされたプロファイルである ct-audit-exec を使用します。

4-4. ゲストアカウントデプロイ用の AWS CLI プロファイルを設定する

ゲストアカウントにデプロイするための AWS CLI プロファイルを設定します。ここではゲストアカウントの ID を123456789012としています。

~/.aws/config

# for Guest Account Login
[profile ct-guest-sso]
sso_start_url = https://d-90xxxxxxxx.awsapps.com/start#/
sso_region = ap-northeast-1
sso_account_id = 123456789012
sso_role_name = AWSAdministratorAccess
region = ap-northeast-1

# for CDK access to ct-guest-sso
[profile ct-guest]
credential_process = aws2-wrap --process --profile ct-guest-sso
region = ap-northeast-1

NOTE:

ct-guest-ssoプロファイルで ゲストアカウントに SSO ログインします。これに CDK からアクセスするため、ラッピングされたプロファイルである ct-guest を使用します。

4-5. AWS SSO を使った CLI ログイン

次のコマンドで AWS SSO にログインします。ここではct-guest-ssoプロファイルでログインする例を示します。

aws sso login --profile ct-guest-sso

このコマンドによって ブラウザが起動し、AWS SSO のログイン画面が表示されます。ゲストアカウントの管理者ユーザー名(メールアドレス)とパスワードを正しく入力すると画面がターミナルに戻り、 AWS CLI で ゲストアカウントでの作業が可能になります。

Notes: ct-guestプロファイルは aws2-warp を経由した認証を行なっており、CDK を実行する場合に使用します。

5. Audit アカウントに通知用のベースラインを設定する(Local)

Audit アカウントには ControlTower が作成した、すべての AWS Config の変更通知が送られる SNS Topic があります。この内容を Slack に通知するようベースラインを設定します。 AWS Chatbot のセットアップのみマネジメントコンソールで行い、以後の作業はローカルで行います。

NOTE:

AWS Config の通知が不要である場合はこのベースラインは設定しなくても構いません。他のアカウントの挙動には影響しません。

5-1. AWS Chatbot 用の Slack セットアップ

Audit account にマネジメントコンソールでログインして、 AWS Chatbot に Slack Workspace をセットアップします。ここでは Aggregation 用の 1 つだけを作成します。以下の手順を参照してください。

5-2. デプロイ情報(Context)を設定する

ControlTower の Audit アカウント用ユースケースの CDK Context (cdk.json) にパラメータを指定します。設定ファイルはこちらです。デフォルトでは dev-audit という名前の context が設定されています。

usecases/base-ct-audit/cdk.json

usecases/base-ct-audit/cdk.json

{
  "app": "npx ts-node bin/blea-base-ct-audit.ts",
  "context": {
    "dev-audit": {
      "description": "Context samples for ControlTower Audit Account - Specific account & region",
      "env": {
        "account": "333333333333",
        "region": "ap-northeast-1"
      },
      "slackNotifier": {
        "workspaceId": "T8XXXXXXX",
        "channelIdAgg": "C01ZZZZZZZZ"
      }
    }
  }
}

この設定内容は以下の通りです。

key value
description 設定についてのコメント
envName 環境名。これが各々のリソースタグに設定されます
env.account デプロイ対象のアカウント ID。CLI の profile で指定するアカウントと一致している必要があります
env.region デプロイ対象のリージョン。CLI の profile で指定するリージョンと一致している必要があります
slackNotifier.workspaceId AWS Chatbot に設定した Slack workspace の ID
slackNotifier.channelIdAgg AWS Chatbot に設定した Slack channel の ID。ControlTower 配下のアカウントの全ての AWS Config の変更が通知されます

NOTE: Context の使い方については以下の解説を参照してください

5-3. Audit アカウント用のベースラインをデプロイ

以下のコマンドで AWS SSO を使ってマネジメントアカウントにログインします。

Audit アカウントは マネジメントアカウントの AWSControlTowerExecution ロールでのみセットアップが可能です(ControlTower の仕様)

aws sso login --profile ct-management-sso

BLEA をビルドします。

cd usecases/base-ct-audit
npm run build

Audit アカウントに CDK 用バケットをブートストラップします(初回のみ)

cd usecases/base-ct-audit
npx cdk bootstrap -c environment=dev-audit --profile ct-audit-exec

Audit アカウントにガバナンスベースをデプロイします

npx cdk deploy --all -c environment=dev-audit --profile ct-audit-exec

以上で、この ControlTower 管理下にあるアカウントのすべての AWS Config 変更イベントが通知されるようになります。

NOTE:

  • ここでは BLEA 環境にインストールしたローカルの cdk を利用するため、npxを使用しています。直接cdkからコマンドを始めた場合は、グローバルインストールされた cdk が利用されます。
  • cdk コマンドを利用するときに便利なオプションがあります。デプロイ時の承認をスキップしロールバックさせないを参照してください。

6. ゲストアカウント用ガバナンスベースをデプロイする(Local)

6-1. デプロイ情報(Context)を設定する

デプロイのため CDK Context (cdk.json) にパラメータを指定する必要があります。 ControlTower 版のゲストアカウント ガバナンスベースの設定ファイルはこちらです。

usecases/base-ct-guest/cdk.json

このサンプルは devstaging という Context を定義する例です。同様の設定を検証、本番アカウントにもデプロイできるようにするには、stagingprodといった Context を用意します。

NOTE:

デプロイ対象のアカウントを明示的に指定したい場合はenvを指定してください。これによって CLI Profile で指定するアカウント-リージョンと、envで指定するものが一致していないとデプロイできなくなります。アカウントに設定したパラメータを確実に管理し、誤ったアカウントにデプロイすることを防ぐことができます。できるだけenvも指定することをお勧めします。

usecases/base-ct-guest/cdk.json

{
  "app": "npx ts-node bin/blea-base-sa.ts",
  "context": {
    "dev": {
      "description": "Context samples for Dev - Anonymous account & region",
      "envName": "Development",
      "securityNotifyEmail": "[email protected]",
      "slackNotifier": {
        "workspaceId": "T8XXXXXXX",
        "channelIdSec": "C00XXXXXXXX"
      }
    },
    "stage": {
      "description": "Context samples for Staging - Specific account & region  ",
      "env": {
        "account": "111111111111",
        "region": "ap-northeast-1"
      },
      "envName": "Staging",
      "securityNotifyEmail": "[email protected]",
      "slackNotifier": {
        "workspaceId": "T8XXXXXXX",
        "channelIdSec": "C01XXXXXXXX"
      }
    }
  }
}

この設定内容は以下の通りです。

key value
description 設定についてのコメント
env.account デプロイ対象のアカウント ID。CLI の profile で指定するアカウントと一致している必要があります
env.region デプロイ対象のリージョン。CLI の profile で指定するリージョンと一致している必要があります
envName 環境名。これが各々のリソースタグに設定されます
securityNotifyEmail セキュリティに関する通知が送られるメールアドレス。内容は Slack と同様です
slackNotifier.workspaceId AWS Chatbot に設定した Slack workspace の ID
slackNotifier.channelIdSec AWS Chatbot に設定した Slack channel の ID。セキュリティに関する通知が行われます

6-2. ゲストアカウントにガバナンスベースデプロイする

AWS SSO を使ってゲストアカウントにログインします。

aws sso login --profile ct-guest-sso

BLEA をビルドします。

cd usecases/base-ct-guest
npm run build

CDK 用バケットをブートストラップします(初回のみ)。

cd usecases/base-ct-guest
npx cdk bootstrap -c environment=dev --profile ct-guest

NOTE:

  • ここでは BLEA 環境にインストールしたローカルの cdk を利用するため、npxを使用しています。直接cdkからコマンドを始めた場合は、グローバルインストールされた cdk が利用されます。
  • cdk コマンドを利用するときに便利なオプションがあります。デプロイ時の承認をスキップしロールバックさせないを参照してください。

ゲストアカウントのガバナンスベースをデプロイします。

npx cdk deploy --all -c environment=dev --profile ct-guest

これによって以下の機能がセットアップされます

  • デフォルトセキュリティグループの閉塞 (逸脱した場合自動修復)
  • AWS Health イベントの通知
  • セキュリティに影響する変更操作の通知(一部)
  • Slack によるセキュリティイベントの通知

Standalone 版でセットアップされていた以下の内容は ControlTower およびセキュリティサービスの Organizations 対応により設定されます。

  • CloudTrail による API のロギング
  • AWS Config による構成変更の記録
  • GuardDuty による異常なふるまいの検知
  • SecurityHub によるベストプラクティスからの逸脱検知 (AWS Foundational Security Best Practice, CIS benchmark)

6-3. (オプション) 他のベースラインセットアップを手動でセットアップする

ガバナンスベースでセットアップする他に AWS はいくつかの運用上のベースラインサービスを提供しています。必要に応じてこれらのサービスのセットアップを行なってください。

a. EC2 管理のため AWS Systems Manager Quick Setup を実施する

EC2 を利用する場合は SystemsManager を利用して管理することをお勧めします。AWS Systems Manager Quick Setup を使うことで、EC2 の管理に必要な基本的なセットアップを自動化できます。 セットアップ手順: [https://docs.aws.amazon.com/systems-manager/latest/userguide/quick-setup-host-management.html]

Quick Setup は以下の機能を提供します:

  • Systems Manager で必要となる AWS Identity and Access Management (IAM) インスタンスプロファイルロールの設定
  • SSM Agent の隔週自動アップデート
  • 30 分ごとのインベントリメタデータの収集
  • インスタンスのパッチ不足を検出するための日次スキャン
  • 初回のみの、Amazon CloudWatch agent のインストールと設定
  • CloudWatch agent の月次自動アップデート
b. Trusted Advisor の検知結果レポート

TrustedAdvisor は AWS のベストプラクティスをフォローするためのアドバイスを提供します。レポート内容を定期的にメールで受け取ることが可能です。詳細は下記ドキュメントを参照してください。

7. ゲストアプリケーションサンプルをデプロイする(Local)

ガバナンスベースが設定された後は Standalone 版も ControlTower 版も同じ手順で同じゲストアプリケーションサンプルをデプロイできます。

ゲストアカウントに SSO で認証している状態からデプロイメントの手順を示します。

7-1. ゲストアプリケーションの Context を設定する

Standalone 版と同じ手順で Context を設定します。

7-2. ゲストアプリケーションをデプロイする

(ログインしていない場合)AWS SSO を使ってゲストアカウントにログインします。

aws sso login --profile ct-guest-sso

BLEA をビルドします。

cd usecases/guest-webapp-sample
npm run build

ゲストアプリケーションをデプロイします。

npx cdk deploy --all -c environment=dev --profile ct-guest

以上で単一アカウントに対するベースラインおよびサンプルアプリケーションのデプロイが完了します。

NOTE:

Aurora を含めた全てのリソースをデプロイ完了するまでには 30 分程度かかります。一部のリソースだけをデプロイしたい場合は対象のスタック名を明示的に指定してください。スタック名はアプリケーションコード(ここでは bin/blea-guest-ecsapp-sample.ts)の中で${pjPrefix}-ECSAppのように表現されています。

cd usecases/guest-webapp-sample
npx cdk deploy "BLEA-ECSApp" --app "npx ts-node bin/blea-guest-asgapp-sample.ts" -c environment=dev --profile prof_dev

NOTE: guest-webapp-sample は bin ディレクトリ配下に複数のバリエーションを用意しています。デフォルトでは cdk.json の app に指定されたアプリケーション(blea-guest-ecsapp-sample.ts)がデプロイされます。 別のアプリケーションをデプロイしたい場合は、以下のように cdk の引数で明示的に --app を指定することで対応可能です。同一ユースケース内であれば cdk.json の Context はいずれも同じ内容で動作します。

cd usecases/guest-webapp-sample
npx cdk deploy --all --app "npx ts-node bin/blea-guest-asgapp-sample.ts" -c environment=dev --profile prof_dev

7-3. 独自のアプリケーションを開発する

以後はこのサンプルコードを起点にして、自分のユースケースに合わせたアプリケーションを開発していくことになります。一般的な開発に必要な情報を示します。

7-4. セキュリティ指摘事項の修復

ガバナンスベースをデプロイした後でも、Security Hub のベンチマークレポートで 重要度が CRITICAL あるいは HIGH のレベルでレポートされる検出項目があります。これらに対しては手動で対応が必要です。必要に応じて修復(Remediation)を実施してください。