0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

諸事用により、アクセスキーが流出した際に自動検知するシステムを作ることになりました。
今回はその手順を記載していきます。

概要

アクセスキーがWEBサイト等に間違って漏洩してしまった場合に、自動検出し
メールで管理者に通知するシステム
さらに、漏洩したアクセスキーを自動削除まで行います。

アーキテクチャ

image.png

解説

・Trusted Advisorを利用し、漏洩をチェック
・EventBridgeにて更新イベントを検知
・SNSとStep Functionsを起動
・SNSにて管理者にメール通知
・Step FunctionsからLambdaを動かしアクセスキー削除

手順

注意点 すべてバージニアリージョンで作成すること

・SNSにて通知先を登録する

SNSの設定方法については割愛します。

・Lambdaを作成する
ランタイム:Python 3.12

import boto3

iam = boto3.client('iam')


def lambda_handler(event, context):
    account_id = event['account']
    time_discovered = event['time']
    details = event['detail']['check-item-detail']
    username = details['User Name (IAM or Root)']
    access_key_id = details['Access Key ID']
    exposed_location = details['Location']
    print('Deleting exposed access key pair...')
    delete_exposed_key_pair(username, access_key_id)
    return {
        "account_id": account_id,
        "time_discovered": time_discovered,
        "username": username,
        "deleted_key": access_key_id,
        "exposed_location": exposed_location
    }


def delete_exposed_key_pair(username, access_key_id):
    """ Deletes IAM access key pair identified by access key ID for specified user.
    Args:
        username (string): Username of IAM user to delete key pair for.
        access_key_id (string): IAM access key ID to identify key pair to delete.
    Returns:
        (None)
    """
    try:
        iam.delete_access_key(
            UserName=username,
            AccessKeyId=access_key_id
        )
    except Exception as e:
        print(e)
        print('Unable to delete access key "{}" for user "{}".'.format(access_key_id, username))
        raise(e)

・Step Functionsを以下で作成する

{
  "Comment": "Deletes exposed IAM access keypairs and notifies security",
  "StartAt": "DeleteAccessKeyPair",
  "States": {
    "DeleteAccessKeyPair": {
      "Type": "Task",
      "Resource": "<LambdaのARNを指定>",
      "End": true
    }
  }
}

・EventBridgeルールにて以下を設定する
イベントパターン

{
  "source": ["aws.trustedadvisor"],
  "detail-type": ["Trusted Advisor Check Item Refresh Notification"],
  "detail": {
    "status": ["ERROR"],
    "check-name": ["漏洩したアクセスキー"]
  }
}

ターゲット
先ほど作成したStep FunctionsとSNSを指定

参考

以下記事を参考にしました。
https://qiita.com/sato928/items/5fe7a01b1a5fdaea7fdb

まとめ

以上の設定で、動作することを確認しました。
最初東京リージョンに作成してしまい、四苦八苦しておりました。
どうも、バージニアで集積しているようでこちらに変更したところ
成功しました。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?