2020年11月16日月曜日

AWS LambdaでKMSをDisableする

 ベストプラクティスにはKMSの無効化についてLambdaを使うとか書かれています。


AWS KMS のセキュリティの自動化

CMK の監視中に、特定のアクションが検出された場合、CMK を無効にするか、ローカルのセキュリティポリシーで指示されているその他のインシデント対応アクションを実行するように AWS Lambda 関数を設定することができます。AWS 内の自動化ツールを活用することにより、人間の介入なしで潜在的な露出を数分で遮断することができます。


ということで作りました。LambdaはPython3.8です。

KMSを作る

Create Key
-> Symmetric
-> Next
-> Alias
-> Next
-> Define key admin permissions
-> Define key usage premissions

KMSのIDを後で使います。

LambdaのRoleにつけるPolicy

DisableKMS: ManagedPolicyから作ります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "kms:DisableKey"
            ],
            "Resource": "*"
        }
    ]
}
InlineはLambdaのARNが必要なので、あとでつけました。 Region, AccountIDを変えます。

環境変数を取得するためのポリシー(inline policy)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "lambda:GetFunctionConfiguration",
            "Resource": "arn:aws:lambda:Region:AccountID:function:DisableKMS"
        }
    ]
}

CloudWatchにつなぐためのポリシー。Region, AccountIDを変えます。(inline policy)
※Lambdaを作るときにポリシーを作ると、これが同時にできるはず。
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "logs:CreateLogGroup",
            "Resource": "arn:aws:logs:Resion:AccountID:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": [
                "arn:aws:logs:Resion:AccountID:log-group:/aws/lambda/DisableKMS:*"
            ]
        }
    ]
}

DisableKMSという名前のLambdaを作ります。Lambdaのcodeは以下です。環境変数にKMSID=ターゲットKMSのIDを指定します。
import botocore
import boto3
from botocore.exceptions import ClientError


def lambda_handler(event, context):
    client = boto3.client('kms')
    lambdaFunc = boto3.client('lambda')
    print('Trying to get Environment variable')
    try:
        funcResponse = lambdaFunc.get_function_configuration(
            FunctionName='DisableDMS'
        )
        KMSID = funcResponse['Environment']['Variables']['KMSID']
        print('Disabling KMD id: ' + KMSID)
    except ClientError as e:
        print(e)
    try:
        response = client.disable_key(
            KeyId=KMSID
        )
        print('Success :: ')
        return response
    except ClientError as e:
        print(e)
    return
    {
        'message': "Script execution completed. See Cloudwatch logs for complete output"
    }

とりあえずは動作するのですが、ベストかというと謎ですが・・・。


おまけ

LambdaからCloudWatchへのアクセスのポリシーがないとき、CloudWatchコンソールを開くとこんなエラーが出ていました。



0 件のコメント:

コメントを投稿