In English | リポジトリの README に戻る
ここでは ControlTower 管理下のアカウントに BLEA を導入する手順について記述します。
デプロイするステップは以下の通りです。デプロイするだけの場合ビルド環境の構築は必ずしも必要ありませんが、コードの変更を容易に行うため、エディタも含めた開発環境を用意することをお勧めします。
- ランタイム等の前提条件は Standalone 版と同様です。README をご覧ください
- AWS SSO を使うための前提条件
aws2-wrap
を使用するため、 Python3 (>=3.8
) が必要です。- AWS SSO との連携のため AWS CLI version2が必要です。
CDK コードを安全に編集するため、本格的な開発を行わない場合であっても開発環境のセットアップを推奨します。以下に VisualStudioCode のセットアップ手順を示します。
ControlTower の配下にマルチアカウント版のガバナンスベースを導入して、ゲストシステムとしてサンプルアプリケーションを導入する手順を例にとって解説します。ここでMC
はマネジメントコンソールでの作業を、Local
は手元環境での作業を示します。
-
ControlTower およびセキュリティサービスのセットアップ(MC)
-
デプロイ対象のゲストアカウントを ControlTower で作成する(MC)
-
依存パッケージのインストールとコードのビルド(Local)
-
AWS SSO に合わせて AWS CLI の認証情報を設定する(Local)
-
Audit アカウントに通知用のベースラインを設定する(Local)
-
ゲストアカウント用ガバナンスベースをデプロイする(Local)
-
ゲストアプリケーションサンプルをデプロイする(Local)
ControlTower を利用することで、ガバナンスベースの一部の機能は自動的に設定されます。ControlTower が対応していないセキュリティサービスは Organizations に対して一括有効化を行うことで、以後新しいアカウントが作られると自動的に設定されるようになります。
ここでは ControlTower をセットアップし、Organizations 全体に対して SecurityHub, GuardDuty そして IAM Access Analyzer を有効化する手順を示します。これらの委任アカウントとして Audit アカウントを指定します。
ControlTower をセットアップします。 See: [https://docs.aws.amazon.com/controltower/latest/userguide/setting-up.html]
- [https://docs.aws.amazon.com/securityhub/latest/userguide/designate-orgs-admin-account.html]
- [https://docs.aws.amazon.com/securityhub/latest/userguide/accounts-orgs-auto-enable.html]
ControlTower を使って新しいアカウント(ゲストアカウント)を作成します。
ゲストアカウントにおける、セキュリティイベントおよびモニタリングイベント通知のために Slack 連携用の設定を行います。セキュリティ通知のためのチャネル、システム監視通知のためのチャネルを Slack に作成し、以下の手順に従って Chatbot の設定を行います。設定が終わったら後の設定のため、ワークスペースの ID(1 つ)、通知先のチャネルの ID(2 つ)をメモしておきます。
git clone https://github.com/aws-samples/baseline-environment-on-aws.git
cd baseline-environment-on-aws
# install dependencies
npm ci
Git に Commit する際に Linter, Formatter, git-secrets によるチェックを行うための Hook を登録します。以下の手順に従ってセットアップしてください。デプロイするだけの場合は必須ではありませんが、よりセキュアに開発するためにセットアップを推奨します。
恒久的な認証情報も利用可能ですが、ControlTower 環境では AWS SSO の利用を推奨します。AWS SSO によって、マネジメントコンソールへのログインおよび SSO 認証による 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
AWS CLI - AWS SSO 統合を CDK から使用するため、オープンソースのツールである aws2-wrap ([https://github.com/linaro-its/aws2-wrap]) を CDK を実行する環境にインストールします
pip3 install aws2-wrap
次に、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
を使用します。
ゲストアカウントにデプロイするための 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
を使用します。
次のコマンドで AWS SSO にログインします。ここではct-guest-sso
プロファイルでログインする例を示します。
aws sso login --profile ct-guest-sso
このコマンドによって ブラウザが起動し、AWS SSO のログイン画面が表示されます。ゲストアカウントの管理者ユーザー名(メールアドレス)とパスワードを正しく入力すると画面がターミナルに戻り、 AWS CLI で ゲストアカウントでの作業が可能になります。
Notes:
ct-guest
プロファイルは aws2-warp を経由した認証を行なっており、CDK を実行する場合に使用します。
Audit アカウントには ControlTower が作成した、すべての AWS Config の変更通知が送られる SNS Topic があります。この内容を Slack に通知するようベースラインを設定します。 AWS Chatbot のセットアップのみマネジメントコンソールで行い、以後の作業はローカルで行います。
NOTE:
AWS Config の通知が不要である場合はこのベースラインは設定しなくても構いません。他のアカウントの挙動には影響しません。
Audit account にマネジメントコンソールでログインして、 AWS Chatbot に Slack Workspace をセットアップします。ここでは Aggregation 用の 1 つだけを作成します。以下の手順を参照してください。
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 の使い方については以下の解説を参照してください
以下のコマンドで 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 コマンドを利用するときに便利なオプションがあります。デプロイ時の承認をスキップしロールバックさせないを参照してください。
デプロイのため CDK Context (cdk.json) にパラメータを指定する必要があります。 ControlTower 版のゲストアカウント ガバナンスベースの設定ファイルはこちらです。
usecases/base-ct-guest/cdk.json
このサンプルは dev
とstaging
という Context を定義する例です。同様の設定を検証、本番アカウントにもデプロイできるようにするには、staging
やprod
といった 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。セキュリティに関する通知が行われます |
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)
ガバナンスベースでセットアップする他に AWS はいくつかの運用上のベースラインサービスを提供しています。必要に応じてこれらのサービスのセットアップを行なってください。
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 の月次自動アップデート
TrustedAdvisor は AWS のベストプラクティスをフォローするためのアドバイスを提供します。レポート内容を定期的にメールで受け取ることが可能です。詳細は下記ドキュメントを参照してください。
ガバナンスベースが設定された後は Standalone 版も ControlTower 版も同じ手順で同じゲストアプリケーションサンプルをデプロイできます。
ゲストアカウントに SSO で認証している状態からデプロイメントの手順を示します。
Standalone 版と同じ手順で Context を設定します。
(ログインしていない場合)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_devNOTE: 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
以後はこのサンプルコードを起点にして、自分のユースケースに合わせたアプリケーションを開発していくことになります。一般的な開発に必要な情報を示します。
ガバナンスベースをデプロイした後でも、Security Hub のベンチマークレポートで 重要度が CRITICAL あるいは HIGH のレベルでレポートされる検出項目があります。これらに対しては手動で対応が必要です。必要に応じて修復(Remediation)を実施してください。