[Workshop] Set up a secure AWS environment with AWS Control Tower に参加しました #COP301 #AWSreInvent
re:Invent 2024 現地参加してきたカスタマーサクセス部 運用支援チームのいたくらです。
「COP301 | Set up a secure AWS environment with AWS Control Tower」に参加したのでレポートします。
セッション情報
- セッション ID : COP301
- タイトル: Set up a secure AWS environment with AWS Control Tower
- スピーカー: Todd Gruet, James Seward
- レベル: 300 – Advanced
ワークショップの概要
Organizations operating in the cloud want to be able to move quickly while remaining secure. In this workshop, learn how AWS Control Tower provides you with the capabilities to simplify the building, management, and governance of a multi-account AWS environment. Gain hands-on experience with how to use AWS Control Tower, including enrolling accounts, automating account customization, and establishing security controls.
AWSクラウドで運用する組織は、セキュリティを維持しながら迅速に行動したいと考えています。このワークショップでは、AWS Control Towerが複数のAWSアカウントを持つ環境の構築、管理、ガバナンスを簡素化する機能をどのように提供するかを学びます。AWS Control Towerの使用方法について、アカウントの登録、アカウントのカスタマイズの自動化、セキュリティ管理の確立など、実践的な経験を積むことができます。
内容
アジェンダ
アジェンダは以下の通りです。
※ アジェンダのタイトルは英語でしたが、本ブログでは日本語訳で記載しています。
- AWS Control Tower の探索
- 既存 OU の登録
- 既存 AWS アカウントの登録
- コントロール管理
- Control Tower のカスタマイズ(CfCT)を使用して AWS Control Tower をカスタマイズする(オプション)
このワークショップではマルチアカウント環境内のアカウントのコントロールと CfCT 作成に焦点を当てています。
Control Tower のデプロイに時間がかかってしまったこともあり、本ブログでは「コントロール管理(検出コントロール)」までの内容を紹介します。
AWS Control Tower の探索
このワークショップにおける Control Tower の構成図は以下です。
また、AWS Organization の構成は以下となっています。
※ ワークショップのテキストから引用したため、説明用に数字が振られています
Control Tower の概要として、マネジメントコンソールの見方や、Control Tower の設定ドリフトを回避する方法、アカウントファクトリーの設定などがワークショップのドキュメントに記載されていたので、まずはその内容を確認しました。
既存 OU の登録
次に、Infrastructure OU を Control Tower に登録しました。
今回は CLI 経由で既存の組織単位を登録しました。
# ランディングゾーンが有効か確認し、IAM Identity Center Enabled Baseline 識別子を取得
$ IDC_ARN=$(aws controltower list-baselines --query 'baselines[?name==`IdentityCenterBaseline`].[arn]' | jq -r ".[[][]]")
$ echo $IDC_ARN
arn:aws:controltower:us-east-1::baseline/LN25R72TTG61GPTQ
# Identity Center ベースラインの有効なベースラインの ARN を取得
$ IDC_ENABLED_BASELINE=$(aws controltower list-enabled-baselines --query "enabledBaselines[?baselineIdentifier=='${IDC_ARN}'].[arn]" | jq -r ".[[][]]")
$ echo $IDC_ENABLED_BASELINE
arn:aws:controltower:us-east-1:xxxxxxxxxxxx:enabledbaseline/XAF05XFPI3I5ZKKNG
# Infrastructure OU の ARN を取得
$ INFRASTRUCTURE_OU=$(aws organizations list-organizational-units-for-parent --parent-id $( aws organizations list-roots --query 'Roots[0].Id' --output text) --query 'OrganizationalUnits[?Name==`Infrastructure`].Arn' --output text)
$ echo $INFRASTRUCTURE_OU
arn:aws:organizations::xxxxxxxxxxxx:ou/o-q41n7pupxg/ou-wqg1-yk4lhgeg
# Control Tower Baseline 識別子を取得
$ CT_BASELINE_IDENTIFIER=$(aws controltower list-baselines --query 'baselines[?name==`AWSControlTowerBaseline`].[arn]' | jq -r ".[[][]]")
$ echo $CT_BASELINE_IDENTIFIER
arn:aws:controltower:us-east-1::baseline/17BSJV31GJ2QSGA2
# EnableBaseline API を使用してターゲット OU にベースラインを作成し、Infrastructure OU を登録
$ aws controltower enable-baseline \
> --baseline-identifier $CT_BASELINE_IDENTIFIER \
> --baseline-version 4.0 \
> --target-identifier $INFRASTRUCTURE_OU \
> --parameters "[{\"key\":\"IdentityCenterEnabledBaselineArn\",\"value\":\"$IDC_ENABLED_BASELINE\"}]"
{
"arn": "arn:aws:controltower:us-east-1:xxxxxxxxxxxx:enabledbaseline/XOF1L2YXVXD51ETBL",
"operationIdentifier": "2342a0bf-760d-43c4-851f-8d3a7603814d"
}
$
少し待つと、マネジメントコンソール上でも Infrastructure OU が「成功」、Identity アカウントが「登録済み」となったことが確認できました。
既存 AWS アカウントの登録
続けて Control Tower 管理対象外となっている Sandbox01 アカウントを Control Tower に登録しました。
Sandbox01 アカウント上に ControlTowerExecution
ロール(Control Tower が環境を設定するときに使用するロール)を作成し、Control Tower サービスページの Organizations ダッシュボードを使用して、Sandbox01 アカウントを登録しました。
登録済みになった後、Sandbox01 アカウントの詳細画面を見てみると、「コンプライアンスステータス」が「準拠」になっていることが確認できました。
これで既存アカウントが Control Tower に正常に登録され、ベースラインとガードレールが Control Tower によって管理されるようになりました。
コントロール管理
ワークショップ内では Detective Controls(検出コントロール)と Preventive Controls(予防コントロール)をそれぞれ 1 つ有効化して、挙動を確認しました。
冒頭で述べたように Control Tower のデプロイに時間がかかってしまったため、検出コントロールだけ紹介します。
検出コントロールは、ポリシー違反など、アカウント内の非準拠リソースを検出し、ダッシュボードに非準拠のリソースを表示します。
また、これはアクションの発生を防ぐことはなく、AWS Config ルールを使用して実装されます。
Control Tower は、登録されたすべてのアカウントとリージョンで AWS Config を有効にし、検出コントロールを通じてコンプライアンスを監視、リソース変更を記録して、リソース変更ログをログアーカイブアカウントに配信します。
まずは Control Tower のサービスページで、[AWS-GR_S3_VERSIONING_ENABLED] Amazon S3 バケットのバージョニングが有効になっているかどうかを検出する
を Sandbox OU に対して有効にしました。
このように検出コントロールを有効にすると、対象 OU に含まれるすべてのアカウントに AWS CloudFormation StackSets を介して AWS Config マネージドルールがデプロイされます。
管理アカウント側で StackSets を確認してみると、有効にした検出コントロールに似た名前の StackSets が存在することが確認できました。
(Control Tower が検出コントロール用に作成する StackSets には、AWSControlTowerGuardrail というプレフィックスが付きます)
また、StackSets の スタックインスタンスを確認すると、StackSets がデプロイされたアカウント ID を確認することができました。
実際にデプロイされた方のアカウント(Sandbox アカウント)に切り替えて StackSets を確認してみました。
スタック一覧に、有効にした検出コントロールに似た名前のスタックが存在し、スタックのリソースタブを確認すると、このスタックで Config ルールがデプロイされたことが確認できました。
そのまま Sandbox アカウントの AWS Config に移動して、ルールを確認します。
現状は対象リソース(S3 バケット)がないため、「検出コンプライアンス」はハイフンになっています。
ここでバケットのバージョニングを無効にした S3 バケットをあえて作成し、非準拠リソースが検知できるかを検証しました。
S3 バケット作成後、ルールを再評価させると、「検出コンプライアンス」に「1 非準拠リソース」と表示されました。
管理アカウントに切り替え、Control Tower ダッシュボードの非準拠リソースを確認すると、具体的なリソース ID などが表示されていました。
最後に S3 バケットのバージョニングを有効に変更し、ルールを再評価させたところ、今度は「準拠」になりました。
Control Tower のカスタマイズ(CfCT)を使用して AWS Control Tower をカスタマイズする(オプション)
一番興味があった CfCT のセクション内容は、ワークショップ時間内に実施することができませんでした。
ワークショップのテキストにはこのセクションで以下を実施すると記載がありました。
- マニフェストファイル(CfCT 用の yaml ファイル)の内容確認
- マニフェストファイルのカスタマイズ
- カスタマイズ後の構成を zip 圧縮し、S3 へアップロード
- S3 アップロードをトリガーにあらかじめ準備されていた CodePipeline の CfCT パイプラインが開始され、対象となる OU や アカウントにカスタム StackSets と SCP をデプロイ
このセクションの内容に関しては、空き時間にワークショップのテキストを見ながら実施してみようと思っています。
最後に
Control Tower ダッシュボード上で組織全体の非準拠リソースが特定された状態で表示されるのは、視覚的に分かりやすくて便利だと感じました。
普段、裏側をあまり気にせずに各コントロールを有効にしていましたが、実際にどういう仕組みで各アカウントにデプロイされるのかが知れて勉強になりました。
また、便利そうだなと思いつつ触れていなかった CfCT についてもテキストベースで基礎知識を得ることができたので、実際にやってみようという気持ちになりました。
CfCT については実施したら別でブログ化しようと思います。
この記事がどなたかのお役に立てれば幸いです。
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。