はじめに
諸事用により、アクセスキーが流出した際に自動検知するシステムを作ることになりました。
今回はその手順を記載していきます。
概要
アクセスキーがWEBサイト等に間違って漏洩してしまった場合に、自動検出し
メールで管理者に通知するシステム
さらに、漏洩したアクセスキーを自動削除まで行います。
アーキテクチャ
解説
・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
まとめ
以上の設定で、動作することを確認しました。
最初東京リージョンに作成してしまい、四苦八苦しておりました。
どうも、バージニアで集積しているようでこちらに変更したところ
成功しました。