CI部 佐竹です。
本日は AWS Organizations の SCP を活用し、ジャンプアカウントを除いたその他の AWS アカウントで「マネジメントコンソールにログイン可能な IAM ユーザ」の作成を組織レベルで禁止してみます。
はじめに
AWS Organizations の SCP を活用することで、組織単位で制御を行うことが可能です。以下のブログはその一例です。
本日は IAM のジャンプアカウント(踏み台アカウント)に関連する制御になります。
ジャンプアカウントとは

ジャンプアカウントとは、上図における「IAM Management Account」である 111122223333 のことを指しています。ここでは 111122223333 を「IAM管理アカウント」と呼ぶことにします。
「IAM管理アカウント」は、マネジメントコンソールにログインする IAM ユーザの管理を司るアカウントです。つまり、 111122223333 にのみマネジメントコンソールにログインすることが可能な IAM ユーザを作成します。

このような組織構成においては、AWS マネジメントコンソールにログインする場合は、常にジャンプアカウント(IAM管理アカウント)を経由することになります。

ジャンプアカウント(IAM管理アカウント)以外にアクセスする必要がある場合は、スイッチロールを行い権限とアカウントをセットで切り替えてログインします。
スイッチロールについては以下を参考ください。
IAM ユーザに許可できるアクセスタイプは2種
IAM ユーザに許可できるアクセスタイプは2種あり、プログラムによるアクセスと、AWS マネジメントコンソールへのアクセスです。
今回「マネジメントコンソールにログインする IAM ユーザ」と記載しているのは、後者のAWS マネジメントコンソールへのアクセスについて記載しているためです。プログラムによるアクセス、つまり Credentials 払い出しの必要性から各 AWS アカウント(メンバーアカウント)には IAM ユーザが払い出されることがありますので、そのような払い出しは許可することを想定する必要があります。
しかし「マネジメントコンソールにログインする IAM ユーザ」を各 AWS アカウントに作成されてしまっては、ジャンプアカウント(IAM管理アカウント)で IAM ユーザを管理している意味がなくなってしまいます。
他にも、ジャンプアカウント(IAM管理アカウント)では IAM パスワードポリシーを厳しく設定しているとしても、他のアカウントではされておらず初期設定のままということもあります。

このような背景から、マネジメントコンソールにログインすることが可能な IAM ユーザを各 AWS アカウントで作成できないように制御したいという要望が生まれます。
3種の API を理解する
CreateUser
1つ目は CreateUser です。これは IAM ユーザを払い出す API 操作です。
注意したいのが、マネジメントコンソールで IAM ユーザを作成すると、プログラムによるアクセスと、AWS マネジメントコンソールへのアクセスが同時に付与されるためこの CreateUser 1つで全てが完了しているように見えるのですが、裏では次の2つの API がコールされます。
CreateAccessKey, CreateLoginProfile
コールされるのは CreateAccessKey と CreateLoginProfile です。
このうち、マネジメントコンソールにログイン可能とする API が CreateLoginProfile です。つまり CreateLoginProfile を実行させないようにすれば、IAM ユーザの作成は許可するもののマネジメントコンソールにログインするユーザを作成させない、というきめ細やかな制御ができるとなります。
作成したSCP
実際に作成した SCP(サービスコントロールポリシー)は以下の通りです。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Deny",
"Action": [
"iam:CreateLoginProfile"
],
"Resource": [
"*"
],
"Condition": {
"ForAllValues:StringNotLike": {
"aws:PrincipalArn": [
"arn:aws:iam::*:root",
"arn:aws:iam::111122223333:*"
]
}
}
}
]
}
Condition において "arn:aws:iam::111122223333:*" を例外(StringNotLike)として指定しています。このため、この SCP を Root に紐づけることで全アカウントに継承されるとしても 111122223333 のアカウントでは IAM ユーザに対して「マネジメントコンソールにログインする権限」を付与可能となります。
※緊急回避が可能なように、各 AWS アカウントの root では作成可能としています
動作確認
実際にこの SCP を Root に紐づけた状態で動作確認を行いました。
IAM ユーザをコンソールアクセスありで新規に作成した場合

IAM ユーザをマネジメントコンソールから作成した場合、エラーが発生します。
Could not create login profile for user test1-satake@serverworks.co.jp:
User: arn:aws:sts::444455556666:assumed-role/ServerworksControlRolePU/satake@serverworks.co.jp is not authorized to perform: iam:CreateLoginProfile on resource: user test1-satake@serverworks.co.jp with an explicit deny
これは CreateUser 自体は成功し、IAM ユーザは作成されるものの CreateLoginProfile には失敗したというエラーになります。

ユーザの詳細を確認すると、マネジメントコンソールログインに必要なパスワードの設定が行われていないことが確認できました。

この状況で、コンソールのパスワードを有効化するとどうなるか見てみます。つまり作成済の IAM ユーザに対してのパスワード有効化のアップデートができないことを確認します。

この画面でも同様にパスワードの設定ができないことが確認できました。期待通りの動作です。
まとめ

本日は AWS Organizations の SCP を活用し、ジャンプアカウントを除いたその他の AWS アカウントで「マネジメントコンソールにログイン可能な IAM ユーザ」の作成を組織レベルで禁止する設定を行い、実際に動作検証も行いました。
iam:CreateUser ではなく iam:CreateLoginProfile を特定のアカウント以外で禁止することで、ジャンプアカウント(IAM管理アカウント)を正しく運用できるようになります。ジャンプアカウント(IAM管理アカウント)以外に直接マネジメントコンソールにログインさせたくないという運用をされてる方は参考にしてみてください。
それではまたお会いしましょう。
佐竹 陽一 (Yoichi Satake) エンジニアブログの記事一覧はコチラ
セキュリティサービス部所属。AWS資格全冠。2010年1月からAWSを業務利用してきています。主な表彰歴 2021-2022 AWS Ambassadors/2020-2025 Japan AWS Top Engineers/2020-2025 All Certifications Engineers。AWSのコスト削減やマルチアカウント管理と運用を得意としています。