Control Tower管理下の特定OUにプロアクティブコントロールを有効化してみる
はじめに
かつまたです。本記事では構築済みのControl Tower環境に対してプロアクティブなコントロールを有効化し、コントロールに違反するCloudFormationテンプレートのデプロイを事前に防止する手順を実施してみたのでご紹介します。
今回はLambda関数のデプロイ時における、意図したCloudFormationテンプレートのデプロイ失敗を再現しました。
プロアクティブコントロールとは
プロアクティブコントロールは、CloudFormation テンプレートによってリソースがデプロイされる前にリソースをチェックし、新しいリソースが環境でコントロール要件に準拠しているかどうかを判断するコントロールです。
事前チェックはCloudFormation Hooks及びCloudFormation Guardによって行われます。
-
CloudFormation Hooks
CloudFormation Hooks を使用すると、プロビジョニング前にリソースの設定をプロアクティブに検査することが可能です。非準拠のリソースが見つかった場合、デプロイが失敗、または警告を出してデプロイ操作を続行できます。 -
CloudFormation Guard
CloudFormation Guardは、CloudFormationテンプレートやJSONドキュメントに対してポリシーベースのルールを定義・適用するためのオープンソースのドメイン固有言語(DSL)です。インフラストラクチャのコード化において、セキュリティやコンプライアンスのベストプラクティスを自動的に適用することができます。Guard独自のルール言語を使用して、リソースの設定値や関係性を検証し、組織のポリシーに準拠しているかを事前にチェックすることが可能です。
やってみる
-
組織管理アカウントの「Control Tower」→「Control Catalog」からコントロールを有効化していきます。今回は[CT.LAMBDA.PR.2] Require AWS Lambda function policies to prohibit public accessを有効化しました。このコントロールにより、リソースポリシーでパブリックアクセス(ワイルドカード指定)を許可するポリシーが記述されているLambdaを含む、CloudFormationテンプレートのデプロイがトライされた時、デプロイを防止可能です。
-
任意の組織OU、またはアカウントを指定し、コントロールを有効化します。
-
コントロールのアーティファクトから、リソースチェックを実施するCloudFormation Guard rule及び、コントロールに違反するテンプレートを確認することができます。
-
コントロール対象としたアカウントでCloudFormationコントロールのデプロイを試みます。以下テンプレートを使用しました。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'Lambda function with public access policy'
Resources:
# Lambda実行ロール
LambdaExecutionRole:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service: lambda.amazonaws.com
Action: sts:AssumeRole
ManagedPolicyArns:
- arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole
# Lambda関数
PublicLambdaFunction:
Type: AWS::Lambda::Function
Properties:
FunctionName: PublicAccessViolationTest
Runtime: python3.9
Handler: index.handler
Role: !GetAtt LambdaExecutionRole.Arn
Code:
ZipFile: |
import json
def handler(event, context):
return {
'statusCode': 200,
'body': json.dumps('This function has public access')
}
# パブリックアクセスを許可するポリシー(違反)
PublicAccessPermission:
Type: AWS::Lambda::Permission
Properties:
FunctionName: !Ref PublicLambdaFunction
Action: lambda:InvokeFunction
Principal: "*" # これが違反:すべてのプリンシパルにアクセスを許可
以下コマンドまたは、コンソールからのアップロードによりデプロイを実施します。
aws cloudformation deploy --template-file テンプレート名 --stack-name スタック名 --capabilities CAPABILITY_IAM
- デプロイイベントを確認してみます。CloudFormation Hooksの呼び出しの後、デプロイ失敗していることが確認できました。
おわりに
ご覧いただきありがとうございました。
今回はControl Towerのプロアクティブコントロールを使用して、セキュリティリスクのあるLambda関数のデプロイを事前に防止する方法をご紹介しました。
プロアクティブコントロールの最大のメリットは、問題のあるリソースがデプロイされる前に検知・防止できることです。CloudFormationテンプレートの場合となりますが、検知型コントロールでは一度デプロイされた後に違反を検知して修正する必要がありますが、プロアクティブコントロールではそもそも違反リソースの作成を防ぐことができます。
参考資料
アノテーション株式会社について
アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。