ablog

不器用で落着きのない技術者のメモ

VPCエンドポイントポリシーを変更すると CWE で検知して Lambda でリセットするようにしてみた

VPCエンドポイントポリシーを変更すると CloudWatch Events で検知して Lambda でリセットするようにしてみた。

設定

IAMロールを作成する
  • 名前: LambdaVpcEndpoint
  • インラインポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:DescribeVpcEndpoints",
                "ec2:ModifyVpcEndpoint"
            ],
            "Resource": "*"
        }
    ]
}
Lambda 関数を作成する
  • 名前: rollbackEndpointPolicy
  • ランタイム: Python 2.7
  • ロール: LambdaVpcEndpoint
  • 関数コード
import json
import boto3
ec2 = boto3.client('ec2')

def lambda_handler(event, context):
    print( 'event: ', event )
    vpcendpoint_id=event['detail']['requestParameters']['ModifyVpcEndpointRequest']['VpcEndpointId']
#    vpcendpoint_id=event['requestParameters']['ModifyVpcEndpointRequest']['VpcEndpointId']
    res_endpoint_desc = ec2.describe_vpc_endpoints(VpcEndpointIds=[vpcendpoint_id])
    service_name=res_endpoint_desc['VpcEndpoints'][0]['ServiceName']
    policy_doc=res_endpoint_desc['VpcEndpoints'][0]['PolicyDocument']
    if service_name.endswith(".s3") and policy_doc!='{"Version":"2008-10-17","Statement":[{"Effect":"Allow","Principal":"*","Action":"*","Resource":"*"}]}':
        res_mod_endpoint = ec2.modify_vpc_endpoint(
            DryRun=False,
            VpcEndpointId=vpcendpoint_id,
            ResetPolicy=True
        )
    return 'rollbackEndpointPolicy finished!'
CloudWatch Events
  • [CloudWatch]-[イベント]-[ルール]を選択し、[ルールの作成]をクリックしてルールを作成する。
  • [イベントパターン]を選択する。
  • サービス名: EC2
  • イベントタイプ: AWS API Call via CloudTrail
  • 特定のオペレーション: ModifyVpcEndpoint
  • Lambda関数の機能で " rollbackEndpointPolicy" を指定する。
  • 名前: rollbackEndpointPolicy
{
  "source": [
    "aws.ec2"
  ],
  "detail-type": [
    "AWS API Call via CloudTrail"
  ],
  "detail": {
    "eventSource": [
      "ec2.amazonaws.com"
    ],
    "eventName": [
      "ModifyVpcEndpoint"
    ]
  }
}

実行してみる

VPCエンドポイントポリシーを変更する
  • [VPC]-[エンドポイント]で、エンドポイントを選択して[ポリシー]タブを選択して[ポリシーの編集]をクリックする。
  • [カスタム]を選択して以下の通り変更して、[保存]をクリックする。

{
  "Id": "Policy1538445504510",
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1538445501263",
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": "*",
      "Principal": "*"
    }
  ]
}
CloudWatch Logs
  • [CloudWatc]-[ログ]で "/aws/lambda/rollbackEndpointPolicy" をクリックし、最新のログ(一番上)をクリックする。
02:44:47 START RequestId: 1fab2160-c5ed-11e8-aa66-db2cfffe3c67 Version: $LATEST
02:44:47 ('event: ...
02:44:47 END RequestId: 1fab2160-c5ed-11e8-aa66-db2cfffe3c67
02:44:47 REPORT RequestId: 1fab2160-c5ed-11e8-aa66-db2cfffe3c67	Duration: 406.19 ms	Billed Duration: 500 ms Memory Size: 128 MB	Max Memory Used: 46 MB
02:44:54 START RequestId: 2495fb78-c5ed-11e8-868c-1debbeb114d2 Version: $LATEST
02:44:54 ('event: ', ...
02:44:54 END RequestId: 2495fb78-c5ed-11e8-868c-1debbeb114d2
02:44:54 REPORT RequestId: 2495fb78-c5ed-11e8-868c-1debbeb114d2	Duration: 228.92 ms	Billed Duration: 300 ms Memory Size: 128 MB	Max Memory Used: 46 MB
  • [VPC]-[エンドポイント]で、エンドポイントを選択して[ポリシー]タブを選択し、ポリシーが元に戻っていることを確認する。


CloudTrail
  • マネジメントコンソールでVPCエンドポイントポリシーを変更した際のイベント

{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "...:yoheia",
        "arn": "arn:aws:sts::...:assumed-role/AdminRole/yoheia",
        "accountId": "...",
        "accessKeyId": "...",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2018-10-02T02:06:37Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "...",
                "arn": "arn:aws:iam::...:role/AdminRole",
                "accountId": "...",
                "userName": "AdminRole"
            }
        }
    },
    "eventTime": "2018-10-02T02:43:45Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "ModifyVpcEndpoint",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "**.*.*.145",
    "userAgent": "console.ec2.amazonaws.com",
    "requestParameters": {
        "ModifyVpcEndpointRequest": {
            "PolicyDocument": "{\n    \"Id\": \"Policy1538445504510\",\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Sid\": \"Stmt1538445501263\",\n            \"Action\": [\n                \"s3:*\"\n            ],\n            \"Effect\": \"Allow\",\n            \"Resource\": \"*\",\n            \"Principal\": \"*\"\n        }\n    ]\n}",
            "VpcEndpointId": "vpce-..."
        }
    },
    "responseElements": {
        "ModifyVpcEndpointResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "requestId": "22bc133d-997b-4686-b5d7-1c6189a79006",
            "return": true
        }
    },
    "requestID": "22bc133d-997b-4686-b5d7-1c6189a79006",
    "eventID": "cccfde87-22b8-4862-858d-00954013e814",
    "eventType": "AwsApiCall",
    "recipientAccountId": "..."
}
  • Lambda で自動修正された際のイベント


{
    "eventVersion": "1.05",
    "userIdentity": {
        "type": "AssumedRole",
        "principalId": "...:rollbackEndpointPolicy",
        "arn": "arn:aws:sts::...:assumed-role/LambdaVpcEndpoint/rollbackEndpointPolicy",
        "accountId": "...",
        "accessKeyId": "...",
        "sessionContext": {
            "attributes": {
                "mfaAuthenticated": "false",
                "creationDate": "2018-10-02T02:44:46Z"
            },
            "sessionIssuer": {
                "type": "Role",
                "principalId": "...",
                "arn": "arn:aws:iam::...:role/LambdaVpcEndpoint",
                "accountId": "...",
                "userName": "LambdaVpcEndpoint"
            }
        }
    },
    "eventTime": "2018-10-02T02:44:47Z",
    "eventSource": "ec2.amazonaws.com",
    "eventName": "ModifyVpcEndpoint",
    "awsRegion": "ap-northeast-1",
    "sourceIPAddress": "13.230.96.217",
    "userAgent": "Boto3/1.7.74 Python/2.7.12 Linux/4.14.67-66.56.amzn1.x86_64 exec-env/AWS_Lambda_python2.7 Botocore/1.10.74",
    "requestParameters": {
        "ModifyVpcEndpointRequest": {
            "ResetPolicy": true,
            "VpcEndpointId": "vpce-..."
        }
    },
    "responseElements": {
        "ModifyVpcEndpointResponse": {
            "xmlns": "http://ec2.amazonaws.com/doc/2016-11-15/",
            "requestId": "86bc748b-e09c-4ac2-acb1-081be51434cc",
            "return": true
        }
    },
    "requestID": "86bc748b-e09c-4ac2-acb1-081be51434cc",
    "eventID": "527fc03f-39f1-47a8-906a-273d36bfcd51",
    "eventType": "AwsApiCall",
    "recipientAccountId": "..."
}