- 公開日
- 最終更新日
別アカウント宛てのピアリング接続を削除するConfigルールを作成してみた
この記事を共有する

目次
はじめに
こんにちは!パーソル&サーバーワークスの野間です。
AWSで複数アカウントを運用していると、意図しない VPC ピアリング接続が残ってしまうケースがあります。
セキュリティや運用管理の観点からも放置は避けたいところです。
そこで今回は、AWS Config の カスタムポリシー(Guard) を使って「別アカウント宛ての VPC ピアリング接続を検出して削除する仕組み」を作ってみました。
実装する構成の概要
AWS Config カスタムポリシー(Guard)
以下の条件で VPC ピアリング接続の評価を行います。
- 「リクエスタ所有者」または「アクセプタ所有者」が別アカウントの場合は非準拠
- ただし「許可アカウントリスト」に含まれていれば準拠(例外)
- 同一アカウント同士の VPC ピアリング接続は準拠
修復(Remediation)の流れ
流れは以下の通りです。
- AWS Config カスタムポリシーが「別アカウント宛て」の VPC ピアリング接続を検知
- 非準拠だった場合、AWS Systems Manager Automation のドキュメントで当該接続を削除
CloudFormationテンプレート
AWSTemplateFormatVersion: 2010-09-09
Parameters:
RoleName:
Type: String
PolicyName:
Type: String
SSMDocumentName:
Type: String
ConfigRuleName:
Type: String
Allowlist:
Type: String
Resources:
ConfigRule:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: !Ref ConfigRuleName
EvaluationModes:
- Mode: DETECTIVE
Scope:
ComplianceResourceTypes:
- AWS::EC2::VPCPeeringConnection
Source:
SourceDetails:
- EventSource: aws.config
MessageType: ConfigurationItemChangeNotification
- EventSource: aws.config
MessageType: OversizedConfigurationItemChangeNotification
Owner: CUSTOM_POLICY
CustomPolicyDetails:
PolicyRuntime: guard-2.x.x
PolicyText: !Sub |
# --- variables ---
let peer_state = configuration.status.code
let requester = configuration.requesterVpcInfo.ownerId
let accepter = configuration.accepterVpcInfo.ownerId
let watched_statuses = ['active','pending-acceptance','provisioning']
let allowlist = ${Allowlist}
rule vpc peering_same_or_allowlist
when resourceType == "AWS::EC2::VPCPeeringConnection" {
when %peer_state IN %watched_statuses {
%requester == %accepter OR
%requester IN %allowlist OR
%accepter IN %allowlist <
各リソースの説明
AWS Config カスタムポリシー(Guard)
AWS Config の評価方式には「マネージドルール」「カスタムポリシー(Guard)」「カスタムルール(Lambda)」があります。
今回は カスタムポリシー(Guard) を用いてルールを作成しています。
- watched_statuses:評価対象とする VPC ピアリング接続のステータス
- allowlist : 許可するアカウント ID のリスト
- (例)'["111111111111","222222222222"]'
ConfigRule:
Type: AWS::Config::ConfigRule
Properties:
ConfigRuleName: !Ref ConfigRuleName
EvaluationModes:
- Mode: DETECTIVE
Scope:
ComplianceResourceTypes:
- AWS::EC2::VPCPeeringConnection
Source:
SourceDetails:
- EventSource: aws.config
MessageType: ConfigurationItemChangeNotification
- EventSource: aws.config
MessageType: OversizedConfigurationItemChangeNotification
Owner: CUSTOM_POLICY
CustomPolicyDetails:
PolicyRuntime: guard-2.x.x
PolicyText: !Sub |
# --- variables ---
let peer_state = configuration.status.code
let requester = configuration.requesterVpcInfo.ownerId
let accepter = configuration.accepterVpcInfo.ownerId
let watched_statuses = ['active','pending-acceptance','provisioning']
let allowlist = ${Allowlist}
rule vpc_peering_same_or_allowlist
when resourceType == "AWS::EC2::VPCPeeringConnection" {
when %peer_state IN %watched_statuses {
%requester == %accepter OR
%requester IN %allowlist OR
%accepter IN %allowlist <
修復(Remediation)設定
非準拠リソースをどのように修正するかを定義します。
後述のAWS Systems Manager Automation ドキュメントを呼び出して削除を実行します。
- Automatic:falseだと手動修正、trueだと自動修復(即時削除)
- RESOURCE_ID:非準拠となった VPC ピアリング接続 ID
RemediationConfiguration:
Type: AWS::Config::RemediationConfiguration
Properties:
ConfigRuleName: !Ref ConfigRule
Automatic: false
TargetType: SSM_DOCUMENT
TargetId: !Ref SSMDocument
Parameters:
VpcPeeringConnectionId:
ResourceValue:
Value: RESOURCE_ID
AutomationAssumeRole:
StaticValue:
Values:
- !GetAtt AutomationIAMRole.Arn
AWS Systems Manager ドキュメント
非準拠となったリソースを修正する方法を定義しています。
今回の場合は、対象の VPC ピアリング接続を削除するカスタムルールを作成しました。
- aws:executeAwsApi:AWS API オペレーションを呼び出すことができるアクション
- DeleteVpcPeeringConnection:VPC ピアリング接続を削除する API(参考)
SSMDocument:
Type: AWS::SSM::Document
Properties:
Name: !Ref SSMDocumentName
DocumentFormat: YAML
DocumentType: Automation
Content:
schemaVersion: "0.3"
description: Delete VPC Peering Connection
assumeRole: !GetAtt AutomationIAMRole.Arn
parameters:
VpcPeeringConnectionId:
type: String
default: ''
AutomationAssumeRole:
type: String
default: ''
mainSteps:
- name: DeleteVPCPeeringConnection
action: aws:executeAwsApi
inputs:
Service: ec2
Api: DeleteVpcPeeringConnection
VpcPeeringConnectionId: '{{ VpcPeeringConnectionId }}'
動作確認
AWS Config のコンプライアンス画面では、「許可アカウントリスト」に含まれていないアカウントとの VPC ピアリング接続のみが非準拠と判定されていることを確認しました。
続いて修復アクションを実行したところ、実行結果は 「アクションが正常に実行されました」 となりました!
VPC ピアリング接続画面でも対象が 「削除済み」 となっていることを確認できました。
まとめ
今回は、AWS Config のカスタムポリシー(Guard)で別アカウント宛ての VPC ピアリング接続を検出、削除する仕組みを構築しました。
意図していないピアリングを放置しないためのガードレールとして、運用負荷を下げながらセキュリティを底上げできると感じました。
同様の課題に向き合っている方の参考になれば幸いです。
この記事は私が書きました
野間 太一
記事一覧猫とCloudFormationが好きです。
