全リージョンでデフォルトセキュリティグループを無効化してみる

2019.09.30

前回の記事ではAWSマネジメントコンソールを使用してデフォルトセキュリティグループを無効化する設定方法を書きました。今回はCloudFormation Stacksetsを利用して、全リージョンで無効化を行う方法を書きたいと思います。

StacksetsでStackを全リージョンに作成する

Stacksetsを利用して全リージョンに展開していきます。Stacksetsについてはわかりやすい記事がすでにあるので、そちらを参考に設定してみてください。肝心の部分を他の記事へのリンクで済ませてしまいますが、全く同じことを書くことになるのでここでは書きません。

一発でGuardDutyを全リージョン有効化して通知設定するテンプレート作った

SSM Automationを実行するIAM Roleを作成

ConfigルールとIAM Roleを作成するテンプレートを別々にしました。というのも、IAMはグローバルリソースですのでリージョン毎に作成しないためです。次のテンプレートをStacksetsにて任意のリージョンで実行します。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC default security group closed role.
Resources:
  revokeSecurityGroupRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: RevokeSecurityGroupRole
      AssumeRolePolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Effect: Allow
            Principal:
              Service: ssm.amazonaws.com
            Action: sts:AssumeRole
      Policies:
        - PolicyName: RevokeSecurityGroupPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              Effect: Allow
              Action:
                - ec2:RevokeSecurityGroupIngress
                - ec2:RevokeSecurityGroupEgress
                - ec2:DescribeSecurityGroups
              Resource: "*"

Configルールを作成する

次のテンプレートをStacksetsにて全リージョンで実行します。

---
AWSTemplateFormatVersion: '2010-09-09'
Description: VPC default security group closed.
Resources:
  document:
    Type: AWS::SSM::Document
    Properties:
      DocumentType: Automation
      Content:
        description: Revoke all security group rules.
        schemaVersion: "0.3"
        assumeRole: "{{ AutomationAssumeRole }}"
        parameters:
          GroupId:
            type: String
            description: (Required) Security Group ID
            allowedPattern: ^([s][g]\-)([0-9a-f]){1,}$
          AutomationAssumeRole:
            type: String
            description: (Optional) The ARN of the role that allows Automation to perform the actions on your behalf.
            default: ""
        mainSteps:
          - name: GetSecurityGroupInfo
            action: aws:executeAwsApi
            onFailure: Abort
            inputs:
              Service: ec2
              Api: DescribeSecurityGroups
              GroupIds: ["{{GroupId}}"]
            outputs:
              - Name: IpPermissionsIngress
                Selector: $.SecurityGroups[0].IpPermissions
                Type: MapList
              - Name: IpPermissionsEgress
                Selector: $.SecurityGroups[0].IpPermissionsEgress
                Type: MapList
          - name: RevokeAllIngress
            action: aws:executeAwsApi
            onFailure: Continue
            inputs:
              Service: ec2
              Api: RevokeSecurityGroupIngress
              GroupId: "{{GroupId}}"
              IpPermissions: "{{GetSecurityGroupInfo.IpPermissionsIngress}}"
          - name: RevokeAllEgress
            action: aws:executeAwsApi
            onFailure: Continue
            inputs:
              Service: ec2
              Api: RevokeSecurityGroupEgress
              GroupId: "{{GroupId}}"
              IpPermissions: "{{GetSecurityGroupInfo.IpPermissionsEgress}}"

  configRule:
    Type: AWS::Config::ConfigRule
    Properties:
      ConfigRuleName: vpc-default-security-group-closed
      Description: Checks that the default security group of any Amazon Virtual Private Cloud (VPC) does not allow inbound or outbound traffic. The rule is non-compliant if the default security group has one or more inbound or outbound traffic.
      Scope:
        ComplianceResourceTypes:
          - AWS::EC2::SecurityGroup
      Source:
        Owner: AWS
        SourceIdentifier: VPC_DEFAULT_SECURITY_GROUP_CLOSED

  remediation:
    Type: AWS::Config::RemediationConfiguration
    Properties:
      ConfigRuleName: !Ref configRule
      TargetType: SSM_DOCUMENT
      TargetId: !Ref document
      Parameters:
        AutomationAssumeRole:
          StaticValue:
            Values:
              - !Sub arn:aws:iam::${AWS::AccountId}:role/RevokeSecurityGroupRole
        GroupId:
          ResourceValue:
            Value: RESOURCE_ID
      Automatic: true
      MaximumAutomaticAttempts: 5
      RetryAttemptSeconds: 60

オプトインの必要なリージョンもありますので、人によってはリージョン数が異なっていることもあると思いますが、選択したリージョンでデフォルトセキュリティグループが無効になっていると思います。

さいごに

個人的にはAutomationドキュメントでAWS APIが実行できるようになったことがポイントで、これにより色んな可能性があると思います。

どなたかの参考になれば幸いです。