概要
IAMユーザーに「直接」と「グループ」の両方で同じポリシーをアタッチしているユーザーがおり、直接アタッチのポリシーのみをデタッチしたい。
なぜ「直接」アタッチポリシーのみデタッチしたいのか
既存プロジェクトでIAMユーザーの見直しを行いました。
AWSのベストプラクティスに則り、「IAMユーザーへポリシーを直接アタッチしない」という対応を行いたかったのですが、コンソールからの作業だとどうしても一時的にポリシーがなくなってしまう時間ができてしまうことがわかりました(理由は後述します)
高頻度でアクセスキーを使用しているIAMユーザーがおり、本来あるべきポリシーが1秒でも外れてしまうことを避けたかったため、直接アタッチのポリシーのみをデタッチする方法を調べました。
IAM でのセキュリティのベストプラクティス – AWS Identity and Access Management
こんな人に役立つ
- IAMユーザーにアタッチしたポリシーをCLIから変更したい人
- IAMユーザーにポリシーを直接・グループ両方でアタッチしており、直接アタッチしたポリシーのみ削除したい人
AWSコンソールからのポリシーデタッチの挙動
IAMユーザーの許可ポリシーからAmazonECS_FullAccess のポリシーを確認すると、「次を経由してアタッチ」の項目に「直接」「グループ」の両方が表示されています。
これは「直接アタッチ」と「グループアタッチ経由」の両方でAmazonECS_FullAccess がセットされていることになります。
こちらの「直接」のみ削除したいと思います。

試しに、コンソールから削除を行ってみましょう。
今回はAmazonECS_FullAccess を削除したいので、対象にチェックを入れて削除ボタンを押します。

すると、IAMグループまで削除しようとしてきます。

このまま削除を進めると実際にグループからもデタッチされるため、グループに紐づく他のポリシーもユーザーからデタッチされることになります。
ということで解決方法を次で紹介します。
AWS CLIからIAMユーザーにアタッチされているポリシーを確認してみる
AWS CLIのlist-attached-user-policies を使って、IAMユーザーに直接アタッチしているポリシー一覧を見てみます。AmazonECS_FullAccess が付与されていることがわかりますね。
 $ aws iam list-attached-user-policies --user-name  {IAM ユーザー名}
 
 {
    "AttachedPolicies": [
        {
            "PolicyName": "AmazonECS_FullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AmazonECS_FullAccess"
        }
    ]
}
次は list-groups-for-user を使ってIAMユーザーにアタッチしているグループ一覧を見てみます。
直接アタッチされているポリシーとは別で管理されていますね。
今回は省略していますが、「Test-engineer」グループにもAmazonECS_FullAccess がアタッチされているため、「直接」「グループ」の両方が表示されている状態になっているというわけです。
$ aws iam list-groups-for-user --user-name {IAM ユーザー名}
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "Test-engineer",
            "GroupId": "xxxxxx",
            "Arn": "arn:aws:iam::xxxxxx:group/Test-engineer",
            "CreateDate": "YYYY-MM-DDTHH:MM:SS+00:00"
        }
    ]
}直接アタッチのポリシーのみをデタッチしたい
CLIからポリシーをデタッチしてみます。detach-user-policy コマンドを使います。
aws iam detach-user-policy 
--user-name { IAM ユーザー名}
--policy-arn {削除したいPolicyArn}今回だと AmazonECS_FullAccess を削除したいので、list-attached-user-policies で取得できたPolicyArn部分をセットします
aws iam detach-user-policy 
--user-name { IAM ユーザー名}
--policy-arn arn:aws:iam::aws:policy/AmazonECS_FullAccessもう一度直接アタッチされているポリシーを確認してみると、なくなっていますね。
$  aws iam list-attached-user-policies --user-name {IAM ユーザー名}
{
    "AttachedPolicies": []
}念の為グループ側も確認してみますが、きちんと残っています。
$ aws iam list-groups-for-user --user-name {IAM ユーザー名}
{
    "Groups": [
        {
            "Path": "/",
            "GroupName": "Test-engineer",
            "GroupId": "xxxxxx",
            "Arn": "arn:aws:iam::xxxxxx:group/Test-engineer",
            "CreateDate": "YYYY-MM-DDTHH:MM:SS+00:00"
        }
    ]
}コンソールでも確認してみると、「直接」が消えて、「グループ」のみになっています。これで想定している状態になりました。

まとめ
今回はIAMユーザーに直接アタッチされているポリシーをCLIからデタッチする方法を紹介しました。
AWS CLIはコンソールに比べてできることが多いので、困ったときはAWS CLIを調べてみましょう!

 
			 
			 
			