michimani.net

IAM ユーザーは自分自身を削除できるのか色んな方法で試してみた

2020-10-07

いきなりですが、 IAM ユーザーは自分自身を削除できるのでしょうか?ちょっとした疑問というか、どうなるんや?と思ったので、いくつかの方法で試してみました。

目次

やること

既存の IAM ユーザーで自分自身を削除することができるのか、いくつかの方法で試してみます。

方法としては、次のとおりです。

  1. マネジメントコンソールにログインして IAM のコンソールから削除
    • ログインした IAM ユーザー自身で削除
    • スイッチロールして削除
  2. AWS CLI の iam delete-user コマンドで削除
    • 自身のプロファイルで削除
    • スイッチロールして削除
  3. マネジメントコンソールにログインして CloudFormation のコンソールからスタックを削除
    • 事前に CloudFormation で IAM ユーザーを作成しておきます
    • ログインした IAM ユーザー自身で削除
    • スイッチロールして削除

やってみる

では、それぞれやっていきます。

1. マネジメントコンソールにログインして IAM のコンソールから削除

事前に will-be-deleted という IAM ユーザーを作成しておきます。作成する際に、今回 必要になる IAM ポリシーがアタッチされている IAM グループに所属させるものとします。

$ aws iam get-user \
--user-name will-be-deleted
{
    "User": {
        "Path": "/",
        "UserName": "will-be-deleted",
        "UserId": "XXXXXXXXXXXXXXXXMWMLT",
        "Arn": "arn:aws:iam::12345678XXXX:user/will-be-deleted",
        "CreateDate": "2020-10-07T09:21:20+00:00",
        "Tags": []
    }
}

ログインした IAM ユーザー自身で削除

まずは will-be-deleted ユーザーでマネジメントコンソールにログインして、 IAM のコンソールから削除を試してみます。

delete IAM user from IAM console

削除 ボタンを押すと削除が始まり、何事もなく削除できてしまいました。

削除後は一旦 IAM ユーザー一覧画面が表示されますが、その後他のページへ移動したり何らかの操作を行うと、ログイン画面へ遷移しました。念のため確認しておきます。

$ aws iam get-user \
--user-name will-be-deleted

An error occurred (NoSuchEntity) when calling the GetUser operation: The user with name will-be-deleted cannot be found.

ということで、もう結論が出てしまった感はありますが、一応 残りのパターンについても試してみます。

スイッチロールして削除

再度 IAM ユーザー will-be-deleted を作成・ログインして、 michimani-admin というロールにスイッチしてから will-be-deleted ユーザーを削除してみます。

delete IAM user from IAM console with switch role 1

この場合も問題なく削除できました。

delete IAM user from IAM console with switch role 2

当該 IAM ユーザー自身で削除する場合と違って、スイッチロールして削除する場合は IAM ユーザー削除後もスイッチ後のロールでマネジメントコンソールを操作することができました。

また、右上のスイッチロール名をクリックしたときに出るメニューから will-be-deleted に戻る を選択しても、元の IAM ユーザーに戻ることもできず、ログイン画面に遷移するわけでもなく、そのままスイッチロールした状態が継続する形となりました。

2. AWS CLI の iam delete-user コマンドで削除

続いては AWS CLI で削除を試してみます。

今回も事前に IAM ユーザー will-be-deleted を作成しておき、アクセスキーおよびシークレットを作成しておきます。そして、プロファイル名として be-del という名前をつけておきます。

~/.aws/credentials は下記のような内容。

[be-del]
aws_access_key_id=AKIA2FQK************
aws_secret_access_key=iis77+******************

自身のプロファイルで削除

まずは自身のプロファイルで削除してみます。

削除の前に確認。

$ aws iam get-user \
--user-name will-be-deleted \
--profile be-del
{
    "User": {
        "Path": "/",
        "UserName": "will-be-deleted",
        "UserId": "XXXXXXXXXXXXXXXXTXQKX",
        "Arn": "arn:aws:iam::12345678XXXX:user/will-be-deleted",
        "CreateDate": "2020-10-07T09:51:06+00:00"
    }
}

iam delete-user コマンドで削除します。

$ aws iam delete-user \
--user-name will-be-deleted \
--profile be-del

An error occurred (DeleteConflict) when calling the DeleteUser operation: Cannot delete entity, must remove users from group first.

まずは IAM グループから remove しなさいと言われました。ということで、 IAM グループから remove して、必要な IAM ポリシーを IAM ユーザー自身にアタッチし、再度試してみます。

$ aws iam delete-user \
--user-name will-be-deleted \
--profile be-del

An error occurred (DeleteConflict) when calling the DeleteUser operation: Cannot delete entity, must detach all policies first.

次はアタッチされているポリシーをすべて削除しなさいと言われました。ということで、アタッチされたポリシーを削除します。でもこうすると…

$ aws iam delete-user \
--user-name will-be-deleted \
--profile be-del

An error occurred (AccessDenied) when calling the DeleteUser operation: User: arn:aws:iam::12345678XXXX:user/will-be-deleted is not authorized to perform: iam:DeleteUser on resource: user will-be-deleted

iam:DeleteUser の権限がないと言われました。それはそう。

ということで、自身のプロファイルでは自分自身を削除することはできないようです。

スイッチロールして削除

では、 AWS CLI でスイッチロールして削除を試してみます。

CLI でスイッチロールするために、 ~/.aws/config に次の内容を記載します。

[profile michimani-admin]
role_arn=arn:aws:iam::12345678XXXX:role/michimani-admin
source_profile=be-del

--profilemichimani-admin を指定して削除を試します。

$ aws iam delete-user \
--user-name will-be-deleted \
--profile michimani-admin

An error occurred (AccessDenied) when calling the AssumeRole operation: User: arn:aws:iam::12345678XXXX:user/will-be-deleted is not authorized to perform: sts:AssumeRole on resource: arn:aws:iam::12345678XXXX:role/michimani-admin

sts:AssumeRole の権限がないと言われました。じゃあ sts:AssumeRole のポリシーをアタッチすればよいかと言うと、そうすると今度はアタッチしたポリシーを削除してと言われてしまいます。

ということで、スイッチロールしても削除することはできないようです。

3. マネジメントコンソールにログインして CloudFormation のコンソールからスタックを削除

続いては、 IAM ユーザーを CloudFormation で管理し、そのスタックを削除することで IAM ユーザーを削除してみます。今回用意した CloudFormation テンプレートは下記の内容です。

AWSTemplateFormatVersion: "2010-09-09"
Description: "IAM User"

Parameters:
  UserPassword:
    Type: String
  Group:
    Type: String

Resources:
  IAMUserForDelete:
    Type: "AWS::IAM::User"
    Properties:
      LoginProfile:
        Password: !Ref UserPassword
        PasswordResetRequired: false
      UserName: will-be-deleted
      Groups:
        - !Ref Group

このテンプレートで IAM ユーザ will-be-deleted を作成し、マネジメントコンソールからログインしてスタックを削除してみます。ちなみに、ここで所属させる IAM グループには必要な IAM ポリシーがアタッチされているものとします。

ログインした IAM ユーザー自身で削除

will-be-deleted でマネジメントコンソールにログインし、 CloudFormation のコンソールから該当のスタックを削除します。

delete IAM user by deleteing CFn stack

問題なく削除できました。そして、 IAM のコンソールから削除したときと同様に、別の操作を行うとログイン画面に遷移しました。

スイッチロールして削除

will-be-deleted を再度作成 (こういうとき CFn だとすぐに再現できて良いですね) 、マネジメントコンソールにログインして先程と同様に michimani-admin ロールにスイッチします。そして、 CloudFormation のコンソールから該当のスタックを削除します。

delete IAM user by deleteing CFn stack with switch role

こちらも問題なく削除できました。そして、 IAM のコンソールから削除したときと同様に、スイッチロールは継続、元の IAM ユーザに戻ることはできない という状態になりました。

まとめ

IAM ユーザーは自分自身を削除できるのか、いくつかの方法で試してみた話でした。今回試した方法とその結果のまとめは下記の表のようになります。

方法 削除可否 備考
IAM コンソールから 削除後に別の操作を行うとログイン画面に遷移する
IAM コンソールから with スイッチロール 削除後もスイッチロールは継続、元の IAM ユーザには戻れない
AWS CLI × 最終的に権限が足りなくなる
AWS CLI with スイッチロール × 最終的に権限が足りなくなる
CloudFormation のスタック削除 削除後に別の操作を行うとログイン画面に遷移する
CloudFormation のスタック削除
with スイッチロール
削除後もスイッチロールは継続、元の IAM ユーザには戻れない

そもそも自分自身を削除しようとする場面はあまりない (退職とプロジェクトから抜ける時くらい?) と思いますが、もしやるならマネジメントコンソールからの操作であれば削除できそうです。


comments powered by Disqus