
指定された日数よりも古いアクセスキーを無効にする小さなLambdaスクリプト。

AWS Key Disabler は、設定された期間が経過した後に AWS IAM ユーザーのアクセスキーを無効化することで、古いアクセスキーに関連するリスクを低減する Lambda 関数です。



/grunt/package.json ビルド設定ファイルの report_to 属性を参照してください。このスクリプトを実行するには、以下のコンポーネントが必要です。
また、SES が有効化された AWS アカウント(ドメインが確認済みでサンドボックスモードが解除されていること)があることを前提としています。
この手順は OSX 向けです。Windows やその他の *nix では動作が異なる場合があります。
/grunt フォルダに移動しますnpm install/grunt/package.json に以下の情報を入力します
aws_account_number の値を、https://portal.aws.amazon.com/gp/aws/manageYourAccount にある AWS アカウント ID に設定しますfirst_warning と last_warning を、警告をトリガーするキーの経過日数に設定します。これらの制限により、report_to へのメール送信がトリガーされますexpiry をキーの有効期限となる経過日数に設定します。この日数を超えるとキーは無効化され、report_to に変更を通知するメールが送信されますserviceaccount をスクリプトで無視するアカウントのユーザー名に設定しますexclusiongroup をスクリプトで無視するユーザーに割り当てられたグループの名前に設定しますsend_completion_report の値を に設定して、SES 経由のメール配信を有効にしますLambda 関数を名前 AccessKeyRotation で実行し、スキャンの出力を scan.report.log というファイルに記録します:
aws lambda invoke --function-name AccessKeyRotation scan.report.log --region us-east-1
{
"StatusCode": 200
}
jq を使用して scan.report.log の内容をコンソールに表示します:
jq '.' scan.report.log
{
"reportdate": "2016-06-26 10:37:24.071091",
"users": [
{
"username": "TestS3User",
"userid": "1",
"keys": [
{
"age": 72,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************Q3GA1"
},
{
"age": 12,
"changed": false,
"state": "key is still young",
"accesskeyid": "**************F3AA2"
}
]
},
{
"username": "BlahUser22",
"userid": "2",
"keys": []
},
{
"username": "LambdaFake1",
"userid": "3",
"keys": [
{
"age": 23,
"changed": false,
"state": "key is due to expire in 1 week (7 days)",
"accesskeyid": "**************DFG12"
},
{
"age": 296,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************4ZASD"
}
]
},
{
"username": "apiuser49",
"userid": "4",
"keys": [
{
"age": 30,
"changed": true,
"state": "key is now EXPIRED! Changing key to INACTIVE state",
"accesskeyid": "**************ER2E2"
},
{
"age": 107,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************AWQ4K"
}
]
},
{
"username": "UserEMRKinesis",
"userid": "5",
"keys": [
{
"age": 30,
"changed": false,
"state": "key is now EXPIRED! Changing key to INACTIVE state",
"accesskeyid": "**************MGB41A"
}
]
},
{
"username": "CDN-Drupal",
"userid": "6",
"keys": [
{
"age": 10,
"changed": false,
"state": "key is still young",
"accesskeyid": "**************ZDSQ5A"
},
{
"age": 5,
"changed": false,
"state": "key is still young",
"accesskeyid": "**************E3ODA"
}
]
},
{
"username": "ChocDonutUser1",
"userid": "7",
"keys": [
{
"age": 59,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************CSA123"
}
]
},
{
"username": "ChocDonut2",
"userid": "8",
"keys": [
{
"age": 60,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************FDGD2"
}
]
},
{
"username": "[email protected]",
"userid": "9",
"keys": [
{
"age": 45,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************BLQ5GJ"
},
{
"age": 71,
"changed": false,
"state": "key is already in an INACTIVE state",
"accesskeyid": "**************GJFF53"
}
]
}
]
}
key_disabler.keystates.<state>.message の値を変更することで設定できますkey_disabler.mask_accesskey_length で変更できます。アクセスキーの長さは20文字ですこのスクリプトは現状のまま提供されます。時間の許す限り質問に回答いたしますが、保証はできません。
うまく動作しない場合は、以下を確認してください:
Lambda 関数が正常にデプロイされた後、以下のコマンドを実行できます:
aws lambda list-functionsopenssl dgst -binary -sha256 ..\Releases\AccessKeyRotationPackage.1.0.18.zip | openssl base64aws lambda invoke --function-name AccessKeyRotation report.log --region us-east-1jq '.' report.logjq '.users[] | select(.username=="johndoe")' report.logjq '.' report.log | grep age | cut -d':' -f2 | sort -njq 'def maximal_by(f): (map(f) | max) as $mx | .[] | select(f == $mx); .users | maximal_by(.keys[].age)' report.logjq 'def minimal_by(f): (map(f) | min) as $mn | .[] | select(f == $mn); .users | minimal_by(.keys[].age)' report.logTruereport_to の値を、削除レポートを受信するメールアドレスに設定しますreport_from の値を、削除レポートの送信者アドレスとして使用するメールアドレスに設定します。このドメインは AWS SES で確認済みである必要がありますdeployment_region を Lambda をサポートするリージョンに設定しますemail_region を SES をサポートするリージョンに設定します。また、そのリージョンの SES サンドボックスモードが無効化されていることを確認してください
aws iam get-user を実行して接続を確認)/grunt ディレクトリから grunt bumpup && grunt deployLambda を実行してバージョン番号を上げ、Lambda 関数のビルド/デプロイを選択したリージョンに対して実行します