Baseline Environment on AWS (BLEA) は 単独の AWS アカウントまたは AWS Control Tower で管理されたマルチアカウント環境で、セキュアなベースラインを確立するための リファレンス AWS CDK テンプレート群です。このテンプレート群は AWS のセキュリティサービスを活用して基本的かつ拡張可能なガードレールを提供します。また典型的なシステムアーキテクチャを実現するエンドツーエンドの AWS CDK サンプルコードを提供します。この AWS CDK テンプレートは用途に合わせてユーザが拡張して使うことを前提としており、拡張の参考となるコードやコメントを多く含んでいます。これによって AWS のアーキテクチャベストプラクティスや AWS CDK コードのカスタマイズを習得しやすくすることを目的としています。
Jump to | Changelog | HowTo | マルチアカウント環境へのデプロイ | Standalone 版からマルチアカウント版への移行 | パイプラインによるデプロイ |
ユースケース | フォルダ |
---|---|
スタンドアローン版ガバナンスベース | usecases/blea-gov-base-standalone |
Control Tower 版ガバナンスベース(ゲストアカウント用) | usecases/blea-gov-base-ct |
-
Control Tower 版ガバナンスベースサンプルでは異なる 3 つのデプロイメントオプションを提供しています
- 手元環境からの直接デプロイメント (blea-gov-base-ct.ts) (デフォルト)
- CDKPipeline を使ったデプロイメント (blea-gov-base-ct-via-cdk-pipelines.ts)
- Control Tower の Account Factory Customization を使ったデプロイメント (blea-gov-base-ct-via-cdk-pipelines.ts)
ユースケース | フォルダ |
---|---|
ECS による Web アプリケーションサンプル | usecases/blea-guest-ecs-app-sample |
EC2 による Web アプリケーションサンプル | usecases/blea-guest-ec2-app-sample |
サーバーレス API アプリケーションサンプル | usecases/blea-guest-serverless-api-sample |
-
ECS による Web アプリケーションサンプルでは異なる 2 つのデプロイメントオプションを提供しています
- 手元環境からの直接デプロイメント (blea-guest-ecs-app-sample.ts) (デフォルト)
- CDKPipeline を使ったデプロイメント (blea-guest-ecs-app-sample-via-cdk-pipelines.ts)
NOTE: 各々のユースケースは独立してデプロイ可能です
デプロイするステップについて記載します。デプロイだけ行う場合はエディタ環境の構築は必ずしも必要ありませんが、コードの変更が容易になりミスを減らすことができるため、エディタも含めた開発環境を用意することをお勧めします。
以下のランタイムを使用します。各 OS ごとの手順に従いインストールしてください。
npm は workspaces を使用するため 8.1.0 以上が必要です。最新バージョンは以下のようにしてインストールしてください。
npm install -g npm
CDK コードを安全に編集するため、本格的な開発を行わない場合であっても開発環境のセットアップを推奨します。以下に VisualStudioCode のセットアップ手順を示します。
BLEA を使う場合の、もっとも典型的な導入手順は次の通りです。ここでは単独のアカウントにガバナンスベースとゲストアプリケーションを導入する手順を示します。
- 関連ライブラリのインストールとコードのビルド
- AWS CLI の認証情報の設定
- デプロイ対象のアカウント作成
- ガバナンスベースをデプロイ
- ゲストアプリケーションサンプルをデプロイ
NOTE: ここでは 単独アカウントに Standalone 版ガバナンスベースと サーバーレス API アプリケーションサンプルを導入します。 Control Tower を使ったマルチアカウント版の導入手順については、Deploy to Control Tower environmentを参照してください。
ここでは最もシンプルな、単一アカウントへの Standalone 版導入を例にとって解説します。
git clone https://github.com/aws-samples/baseline-environment-on-aws.git
cd baseline-environment-on-aws
Node.js の必要なライブラリをインストールします。
# install dependencies
npm ci
Git に Commit する際に Linter, Formatter, git-secrets によるチェックを行うための Hook を登録します。以下の手順に従ってセットアップしてください。デプロイするだけの場合は必須ではありませんが、よりセキュアに開発するためにセットアップを推奨します。
CDK をデプロイするために AWS 認証情報(API キー)が必要です。ここでは最もシンプルな、恒久的な認証情報を使用する方法を紹介します。
これは主に開発環境用として利用する方式です。ここでは AWS CLI のプロファイルの例として、prof_dev
と prof_prod
の二つのアカウントを使う場合を考えます。
~/.aws/credentials
[prof_dev]
aws_access_key_id = XXXXXXXXXXXXXXX
aws_secret_access_key = YYYYYYYYYYYYYYY
region = ap-northeast-1
[prof_prod]
aws_access_key_id = ZZZZZZZZZZZZZZZZ
aws_secret_access_key = PPPPPPPPPPPPPPPP
region = ap-northeast-1
Organizations を使って新しいアカウントを作成します。 Organizations を使用しない単一のアカウントを利用することも可能ですが、後にマルチアカウント管理の環境に移行しやすくするため Organizations 配下のメンバーアカウント使用を推奨します。
BLEA ではセキュリティイベントおよびモニタリングイベントを通知のためにそれぞれ Slack チャネルを使用します。Slack 上にチャネルを 2 つ作成し、以下の手順を参照して AWS Chatbot の初期設定を行ってください。 設定が終わったら後の設定のため、ワークスペースの ID(1 つ)、通知先のチャネルの ID(2 つ)をメモしておきます。
デプロイの際に必要となる デプロイ先アカウントや通知先メールアドレスなど、各ユースケース固有のパラメータを指定する必要があります。 BLEA では parameter.ts
というファイルでパラメータを管理します。書式は TypeScript です。
シングルアカウント用ベースラインのパラメータはこちらで指定します。
usecases/blea-gov-base-standalone/parameter.ts
このサンプルは devParameter
というパラメータセットを定義する例です。同様の設定を検証、本番アカウントにもデプロイできるようにするには、stagingParameter
やprodParameter
といったパラメータセットを定義し、App (ここでは bin/blea-gov-base-standalone.ts
)でそれぞれの環境のスタックを作成します。
usecases/blea-gov-base-standalone/parameter.ts
// Example for Development
export const devParameter: AppParameter = {
envName: 'Development',
securityNotifyEmail: '[email protected]',
securitySlackWorkspaceId: 'T8XXXXXXX',
securitySlackChannelId: 'C00XXXXXXXX',
// env: { account: '123456789012', region: 'ap-northeast-1' },
};
この設定内容は以下の通りです。
key | value |
---|---|
envName | 環境名。これが各々のリソースタグに設定されます |
securityNotifyEmail | セキュリティに関する通知が送られるメールアドレス。内容は Slack と同様です |
securitySlackWorkspaceId | AWS Chatbot に設定した Slack workspace の ID |
securitySlackChannelId | AWS Chatbot に設定した Slack channel の ID。ガバナンスベースによってセキュリティに関する通知が行われます |
env | デプロイ対象のアカウントとリージョン(指定しない場合は CLI の認証情報に従います) |
NOTE: BLEA v2.x までは パラメータの設定に Context (cdk.json) を使っていましたが、v3.0 以降は parameter.ts を使用します。
初めて CDK を実行する場合は、対象のユースケースディレクトリへ移動し、CDK を bootstrap します。これは対象のアカウントとリージョンの組み合わせで初めて CDK を実行するときに必要です。
cd usecases/blea-gov-base-standalone
npx aws-cdk bootstrap --profile prof_dev
NOTE:
- ここでは BLEA 環境にインストールしたローカルの cdk を利用するため、
npx aws-cdk
を使用しています。npx
を使わず直接cdk
からコマンドを始めた場合は、グローバルインストールされた cdk が利用されます。- cdk を実行するときに便利なオプションがあります。デプロイ時の承認をスキップしロールバックさせないを参照してください。
ガバナンスベースをデプロイします。
npx aws-cdk deploy --all --profile prof_dev
これによって以下の機能がセットアップされます
- CloudTrail による API のロギング
- AWS Config による構成変更の記録
- GuardDuty による異常なふるまいの検知
- SecurityHub によるベストプラクティスからの逸脱検知 (AWS Foundational Security Best Practice, CIS benchmark)
- デフォルトセキュリティグループの閉塞 (逸脱した場合自動修復)
- AWS Health イベントの通知
- セキュリティに影響する変更操作の通知(一部)
- セキュリティイベントを通知する SNS トピック (SecurityAlarmTopic) の作成
- 上記 SNS トピックを経由した、メールの送信と Slack のセキュリティチャネルへの通知
ガバナンスベースでセットアップする他に AWS はいくつかの運用上のベースラインサービスを提供しています。必要に応じてこれらのサービスのセットアップを行なってください。
Amazon Inspector は、ワークロードをスキャンして、脆弱性を管理します。EC2 と ECR を継続的にスキャンすることで、ソフトウェアの脆弱性や意図しないネットワークの露出を検出します。検出された脆弱性は、算出されたリスクスコアに基づき優先順位づけされて表示されるため、可視性高く結果を取得できます。また、Security Hub とは自動で統合され、一元的に検出結果を確認できます。
セットアップ手順:https://docs.aws.amazon.com/inspector/latest/user/getting_started_tutorial.html
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 のベストプラクティスをフォローするためのアドバイスを提供します。レポート内容を定期的にメールで受け取ることが可能です。詳細は下記ドキュメントを参照してください。
ガバナンスベースの設定が完了したら、その上にゲストアプリケーションを導入します。 ここではゲストアプリケーションの例として、サーバーレス API アプリケーションサンプルをデプロイする手順を示します。
デプロイする前にゲストアプリケーションの設定を行います。
サーバーレス API アプリケーションのサンプルが配置された usecases/blea-guest-serverless-api-sample
に移動して parameter.ts を編集します。
usecases/blea-guest-serverless-api-sample/parameter.ts
// Example
export const devParameter: AppParameter = {
envName: 'Development',
monitoringNotifyEmail: '[email protected]',
monitoringSlackWorkspaceId: 'TXXXXXXXXXX',
monitoringSlackChannelId: 'CYYYYYYYYYY',
// env: { account: '123456789012', region: 'ap-northeast-1' },
};
設定内容は以下の通りです:
key | |
---|---|
envName | 環境名。これが各々のリソースタグに設定されます。 |
monitoringNotifyEmail | システム監視についての通知が送られるメールアドレス。 |
slackNotifier.workspaceId | AWS Chatbot に設定した Slack workspace の ID |
slackNotifier.channelIdMon | AWS Chatbot に設定した Slack channel の ID。システム監視についての通知が行われます。セキュリティのチャネルとは別のチャネルを指定してください。 |
env | デプロイ対象のアカウントとリージョン(指定しない場合は CLI の認証情報に従います) |
cd usecases/blea-guest-serverless-api-sample
npx aws-cdk deploy --all --profile prof_dev
以上で単一アカウントに対するベースラインおよびサンプルアプリケーションのデプロイが完了します。
以後はこのサンプルコードを起点にして、自分のユースケースに合わせたアプリケーションを開発していくことになります。一般的な開発に必要な情報を示します。
ガバナンスベースをデプロイした後でも、Security Hub のベンチマークレポートで 重要度が CRITICAL あるいは HIGH のレベルでレポートされる検出項目があります。これらに対しては手動で対応が必要です。必要に応じて修復(Remediation)を実施してください。
BLEA はガバナンスベース (blea-gov-base-ct, blea-gov-base-standalone) を対象として Semantic Versioning を採用しています。ガバナンスベースはメジャーバージョンの変更がない限り後方互換性が保たれます。メジャーバージョンが変更される場合にはマイグレーションガイドが提供されます。
ゲストシステムサンプルは Semantic Versioning の対象外です。これらはサンプルコードを提供することが目的であり、破壊的変更がいつでも起こりえます。メジャーバージョンが変更される場合も、マイグレーションガイドは提供されません。
v3 へのマイグレーションガイドを参照ください
See CONTRIBUTING for more information.
This library is licensed under the MIT-0 License. See the LICENSE file.