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": "..." }