ENGINEER BLOG ENGINEER BLOG
  • 公開日
  • 最終更新日

別アカウント宛てのピアリング接続を削除するConfigルールを作成してみた

この記事を共有する

目次

はじめに

こんにちは!パーソル&サーバーワークスの野間です。

AWSで複数アカウントを運用していると、意図しない VPC ピアリング接続が残ってしまうケースがあります。
セキュリティや運用管理の観点からも放置は避けたいところです。
そこで今回は、AWS Config の カスタムポリシー(Guard) を使って「別アカウント宛ての VPC ピアリング接続を検出して削除する仕組み」を作ってみました。

実装する構成の概要

AWS Config カスタムポリシー(Guard)

以下の条件で VPC ピアリング接続の評価を行います。

  • 「リクエスタ所有者」または「アクセプタ所有者」が別アカウントの場合は非準拠
    • ただし「許可アカウントリスト」に含まれていれば準拠(例外)
  • 同一アカウント同士の VPC ピアリング接続は準拠

修復(Remediation)の流れ

流れは以下の通りです。

  1. AWS Config カスタムポリシーが「別アカウント宛て」の VPC ピアリング接続を検知
  2. 非準拠だった場合、AWS Systems Manager Automation のドキュメントで当該接続を削除

aws-config-rule-workflow.png

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 <>
              }
            }
  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
  AutomationIAMRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: !Ref RoleName
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          - Effect: Allow
            Principal:
              Service:
                - ssm.amazonaws.com
            Action:
              - sts:AssumeRole
      Policies:
        - PolicyName: !Ref PolicyName
          PolicyDocument:
            Version: 2012-10-17
            Statement:
              - Effect: Allow
                Action:
                  - ec2:DeleteVpcPeeringConnection
                Resource:
                  - "*"
  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 カスタムポリシー(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 ピアリング接続のみが非準拠と判定されていることを確認しました。 config-rule-peering-1.png
続いて修復アクションを実行したところ、実行結果は 「アクションが正常に実行されました」 となりました! config-rule-peering-3.png
VPC ピアリング接続画面でも対象が 「削除済み」 となっていることを確認できました。 config-rule-peering-2.png

まとめ

今回は、AWS Config のカスタムポリシー(Guard)で別アカウント宛ての VPC ピアリング接続を検出、削除する仕組みを構築しました。
意図していないピアリングを放置しないためのガードレールとして、運用負荷を下げながらセキュリティを底上げできると感じました。
同様の課題に向き合っている方の参考になれば幸いです。

この記事は私が書きました

野間 太一

記事一覧

猫とCloudFormationが好きです。

野間 太一

この記事を共有する

クラウドのご相談

CONTACT

クラウド導入や運用でお悩みの方は、お気軽にご相談ください。
専門家がサポートします。

サービス資料ダウンロード

DOWNLOAD

ビジネスをクラウドで加速させる準備はできていますか?
今すぐサービス資料をダウンロードして、詳細をご確認ください。