AWS Step FunctionsでIAMユーザーを削除してみた
はじめに
Amazon EventBridgeをトリガーとして、AWS Step FunctionsでIAMユーザーを自動削除したい要件がありました。
そこで、今回はAWS Step FunctionsでIAMユーザーを自動削除する方法について検証してみました。
自動削除は、以下の2つの方法が考えられます。
- AWS Step Functionsで直接IAM API の DeleteUserを実行する
- AWS Systems Manager(以降、SSM)ドキュメント
AWSConfigRemediation-DeleteIAMUser
を利用したSSMオートメーションを実行する
前者の場合、IAM API の DeleteUserを実行するには、IAMユーザーのパスワードやアクセスキー、インラインポリシー、管理ポリシーなどを全て削除する必要があります。以下のドキュメントに記載されている通り、9つの手順を実行した後に、ようやく削除できます。
これをステートマシンで実装する場合、例えばIAMユーザーのアクセスキーを削除するステートでは、以下の処理が必要になります。
- アクセスキーを所持しているかチェック(ListAccessKeys API実行)
- 所持していない場合は次のステートに進む
- 所持している場合はアクセスキーを削除(DeleteAccessKey API実行)
この処理を9つのリソースそれぞれに対して実装する必要があります。
実装の複雑さを考慮し、直接IAM API DeleteUserを実行する方法は採用しません。
後者のSSMオートメーションを実行する場合、SSMドキュメントAWSConfigRemediation-DeleteIAMUser
では、先ほどの9つの手順を全て実行した後に、IAMユーザーを削除してくれます。
AWSConfigRemediation-DeleteIAMUser ランブックは指定した AWS Identity and Access Management (IAM) ユーザーを削除します。このオートメーションは、IAM ユーザーに関連付けられた次のリソースを削除またはデタッチします。
- アクセスキー
- アタッチされた管理ポリシー
- Git 認証情報
- IAM グループメンバーシップ
- IAM ユーザーパスワード
- インラインポリシー
- 多要素認証 (MFA) デバイス
- 証明書への署名
- SSH 公開キー
そこで、Step FunctionsでSSMオートメーションを実行してIAMユーザーを削除する方法を実装してみます。
SSMオートメーション用IAMロール作成
SSMオートメーションを実行するためのIAMロールを作成します。
必要な権限は、SSMドキュメントの公式ドキュメントに記載されています。
以下のCloudFormationテンプレートを使用してスタックを作成します。
AWSTemplateFormatVersion: '2010-09-09'
Description: 'AWS Config Remediation IAM Role for AWSConfigRemediation-DeleteIAMUser'
Parameters:
AWSConfigRemediationDeleteIAMUserRoleName:
Type: String
Default: AWSConfigRemediation-DeleteIAMUserRole
Description: Name for the IAM role used by AWSConfigRemediation-DeleteIAMUser automation
AWSConfigRemediationDeleteIAMUserPolicyName:
Type: String
Default: AWSConfigRemediation-DeleteIAMUserPolicy
Description: Name for the policy attached to the remediation role
Resources:
AWSConfigRemediationDeleteIAMUserRole:
Type: AWS::IAM::Role
Properties:
RoleName: !Ref AWSConfigRemediationDeleteIAMUserRoleName
AssumeRolePolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Principal:
Service:
- ssm.amazonaws.com
- states.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: !Ref AWSConfigRemediationDeleteIAMUserPolicyName
PolicyDocument:
Version: '2012-10-17'
Statement:
- Effect: Allow
Action:
- iam:DeactivateMFADevice
- iam:DeleteAccessKey
- iam:DeleteLoginProfile
- iam:DeleteServiceSpecificCredential
- iam:DeleteSigningCertificate
- iam:DeleteSSHPublicKey
- iam:DeleteVirtualMFADevice
- iam:DeleteUser
- iam:DeleteUserPolicy
- iam:DetachUserPolicy
- iam:GetUser
- iam:ListAttachedUserPolicies
- iam:ListAccessKeys
- iam:ListGroupsForUser
- iam:ListMFADevices
- iam:ListServiceSpecificCredentials
- iam:ListSigningCertificates
- iam:ListSSHPublicKeys
- iam:ListUserPolicies
- iam:ListUsers
- iam:RemoveUserFromGroup
Resource: '*'
- Effect: Allow
Action:
- ssm:GetAutomationExecution
- ssm:StartAutomationExecution
Resource: '*'
このテンプレートから、AWSConfigRemediation-DeleteIAMUserRole
という名前のIAMロールが作成されます。
ステートマシン作成
以下のステートマシン定義を使用します。アカウントIDの箇所は各自変更してください。
{
"Comment": "IAMユーザー削除ワークフロー - SSM Automationを使用したユーザー削除",
"QueryLanguage": "JSONata",
"StartAt": "GetUserDetails",
"States": {
"GetUserDetails": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:iam:getUser",
"Arguments": {
"UserName": "{% $states.input.username %}"
},
"Assign": {
"userId": "{% $states.result.User.UserId %}"
},
"Comment": "指定されたユーザー名からユーザーIDを取得し、削除処理に必要な情報を準備",
"Next": "StartDeletionAutomation"
},
"StartDeletionAutomation": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:ssm:startAutomationExecution",
"Arguments": {
"DocumentName": "AWSConfigRemediation-DeleteIAMUser",
"Parameters": {
"AutomationAssumeRole": [
"arn:aws:iam::アカウントID:role/AWSConfigRemediation-DeleteIAMUserRole"
],
"IAMUserId": [
"{% $userId %}"
]
}
},
"Assign": {
"automationExecutionId": "{% $states.result.AutomationExecutionId %}"
},
"Comment": "SSM Automationを使用してIAMユーザー削除処理を開始",
"Next": "WaitForAutomation"
},
"WaitForAutomation": {
"Type": "Wait",
"Seconds": 15,
"Comment": "Automation実行の進行を待機(15秒間隔でポーリング)",
"Next": "CheckAutomationExecution"
},
"CheckAutomationExecution": {
"Type": "Task",
"Resource": "arn:aws:states:::aws-sdk:ssm:getAutomationExecution",
"Arguments": {
"AutomationExecutionId": "{% $automationExecutionId %}"
},
"Assign": {
"executionStatus": "{% $states.result.AutomationExecution.AutomationExecutionStatus %}"
},
"Comment": "SSM Automation実行の現在のステータスを取得",
"Next": "EvaluateExecutionStatus"
},
"EvaluateExecutionStatus": {
"Type": "Choice",
"Comment": "Automation実行ステータスに基づいて次のアクションを決定",
"Choices": [
{
"Condition": "{% $executionStatus = 'Success' %}",
"Comment": "削除処理が正常に完了した場合",
"Next": "DeletionCompleted"
},
{
"Condition": "{% $executionStatus = 'Failed' %}",
"Comment": "削除処理が失敗した場合",
"Next": "DeletionFailed"
},
{
"Condition": "{% $executionStatus in ['InProgress', 'Waiting'] %}",
"Comment": "削除処理が進行中または待機中の場合は継続監視",
"Next": "WaitForAutomation"
}
],
"Default": "DeletionFailed"
},
"DeletionCompleted": {
"Type": "Succeed",
"Comment": "IAMユーザーの削除が正常に完了"
},
"DeletionFailed": {
"Type": "Fail",
"Cause": "SSM Automation実行が失敗しました。ログを確認してください。",
"Error": "IAMUserDeletionFailed",
"Comment": "IAMユーザーの削除処理が失敗"
}
}
}
処理の流れ
このステートマシンは、以下の流れでIAMユーザーを削除します。
- GetUserDetails: 入力されたユーザー名からユーザーIDを取得
- StartDeletionAutomation: SSMオートメーション(AWSConfigRemediation-DeleteIAMUser)を開始
- WaitForAutomation: 15秒間待機
- CheckAutomationExecution: SSMオートメーションの実行状況を確認
- EvaluateExecutionStatus: 実行ステータスを評価して次のアクションを決定
- 成功の場合: DeletionCompletedで正常終了
- 失敗の場合: DeletionFailedでエラー終了
- 実行中/待機中の場合: WaitForAutomationに戻ってポーリング継続
Step Functions実行ロールの権限設定
マネジメントコンソール上でステートマシンを作成する際、実行ロールのポリシーを手動で追加する必要があります。
以下のポリシーを追加してください。アカウントIDは各自変更してください。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "IAMUserOperations",
"Effect": "Allow",
"Action": [
"iam:GetUser"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "ssm:StartAutomationExecution",
"Resource": "arn:aws:ssm:*::automation-definition/AWSConfigRemediation-DeleteIAMUser:*"
},
{
"Effect": "Allow",
"Action": "ssm:GetAutomationExecution",
"Resource": "arn:aws:ssm:*:アカウントID:automation-execution/*"
},
{
"Effect": "Allow",
"Action": "iam:PassRole",
"Resource": "arn:aws:iam::アカウントID:role/AWSConfigRemediation-DeleteIAMUserRole"
}
]
}
実行してみる
作成したステートマシンを実行して、IAMユーザーの自動削除を検証します。
削除対象となるIAMユーザー名を入力パラメータとして指定し、ステートマシンを実行します。
{
"username": "test8"
}
ステートマシンは正常に実行完了し、IAMユーザーの自動削除に成功しました。
SSMオートメーションの実行履歴を確認すると、こちらも正常に完了していることが確認できます。なお、IAMユーザーの自動削除には20〜30秒程度の時間がかかります。