🤖
[AWS IAM] マルチアカウント環境におけるスイッチロール
概要
- AWSアカウントが複数(例:DEV、STG、PRD)存在する場合、IAMユーザーの管理を最小限に抑えたい。
- 1つのAWSアカウント (例 DEV)にIAMユーザーを集約し、他のAWSアカウント (例 STG、PRD)にはIAMユーザーを作成せず、スイッチロールで対応することで、IAMリソースの管理負荷を軽減できる
- IAMユーザー、IAMユーザーグループ、および関連するIAMリソースの数を最小化できる可能性がある
スイッチロールの構成と制御
スイッチロール元の構成と制御(スイッチ元アカウント)(例 DEV)
- IAMユーザーがすでに作成されていれば、新たなIAMリソースの追加は不要
- IAMユーザーには、特定のタグ(例:
StgdAccess=SwitchRole:PowerUserやPrdAccess=SwitchRole:Admin|ReadOnlyなど)を付与して制御に利用する
スイッチロール先の構成と制御(ターゲットアカウント)(例 STG、PRD)
- 必要なIAMリソースは「スイッチロール用のIAMロール」のみ
- IAMロールの信頼関係ポリシー(Trust Policy)では、スイッチ元アカウントのIAMユーザーをどのように許可するかがポイントとなる
- 許可方法には主に以下2種類がある
- IAMユーザー単位
- 個別のARN(例:
arn:aws:iam::<スイッチ元アカウントID>:user/<IAMユーザー名>)を許可対象とする - この方法では、新しいIAMユーザーが追加されるたびに、信頼関係ポリシーの更新が必要となる
- 個別のARN(例:
- AWSアカウント単位で指定しつつ、IAMユーザーのタグで条件を絞る
- アカウント全体を許可対象としつつ、IAMユーザーの タグ(
aws:PrincipalTag) を条件にし制御する - この方法により、IAMロールの変更頻度を最小化できる
- アカウント全体を許可対象としつつ、IAMユーザーの タグ(
- IAMユーザー単位
- セキュリティ向上のため、MFA(多要素認証)が有効な場合のみスイッチロールを許可する
- 本記事ではIAMリソースの変更頻度を最初化するため2を採用している
スイッチロール設計
スイッチロール元の設計(スイッチ元アカウント)(例 DEV)
- 許可するスイッチロールに合わせて、IAMユーザーのタグを設定する
- 例1) STGのIAMロール1 (役割 読み取り専用)にスイッチロールする場合のIAMユーザーのタグは、キー
StgdAccess値SwitchRole:ReadOnly、 - 例2) STGのIAMロール2 (役割 パワーユーザー)にスイッチする場合のIAMユーザーのタグは、キー
StgdAccess値SwitchRole:PowerUser - 例3) PRDのIAMロール3 (役割 開発者)にスイッチロールする場合のIAMユーザーのタグは、キー
PrdAccess値SwitchRole:Develop - 例4) STGの複数のIAMロール (役割 読み取り専用と開発者)ににスイッチロールする場合のIAMユーザーのタグは、キー
StgdAccess値SwitchRole:ReadOnly|Developや値SwitchRole:Develop|ReadOnlyのようにする
- 例1) STGのIAMロール1 (役割 読み取り専用)にスイッチロールする場合のIAMユーザーのタグは、キー
スイッチロール先の設計(ターゲットアカウント)(例 STG、PRD)
- スイッチロール用のIAMロールを役割別に作成する
例 STGのPowerUserのIAMロール
- 信頼関係ポリシー
- 条件演算子
StringLikeの内容-
aws:PrincipalTag/StgdAccess(STG)、の箇所をaws:PrincipalTag/PrdAccess(PRD)のようにすることで環境を区別する -
SwitchRole:*PowerUser*やSwitchRole:*ReadOnly*のように役割を区別する -
StringLikeでワイルドカード(*や?)を使用できるようにし、IAMユーザーのタグ数を抑えている - キーに対して値を
SwitchRole:役割1|役割2にするため、SwitchRole:*PowerUser*のように役割部分をワイルドカードで囲む必要がある
-
- スイッチ元アカウントに対してすべてを信頼しつつ、スイッチロール可能な条件としてスイッチ元アカウントのIAMユーザーであり、そのIAMユーザーに指定のタグがあり、なおかつMFAが有効の場合のみとしている
- スイッチ元のIAMユーザーで合っても、指定したタグがない場合はスイッチロールはできない
- 条件演算子
信頼ポリシー(JSON)
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<スイッチ元アカウントID>:root"
},
"Action": "sts:AssumeRole"
"Condition": {
"ArnLike": {
"arn:aws:iam::<スイッチ元アカウントID>:user/*"
},
"StringLike": {
"aws:PrincipalTag/StgAccess": "SwitchRole:*PowerUser*"
},
"Bool": {
"aws:MultiFactorAuthPresent": "true"
}
}
}
]
}
- 許可ポリシーは AWS管理
PowerUserAccessを指定
スイッチロールの仕方
- スイッチ元アカウントのログイン
-
https://<元アカウント>.signin.aws.amazon.com/console/にアクセスし、IAMユーザーでログインする
-
- スイッチロール
- 元アカウントにログイン後、
https://signin.aws.amazon.com/switchrole?account=<ターゲットアカウントID>&roleName=<ターゲットのロール名>&displayName=<表示名>&color=<表示色>にアクセスし、スイッチロールする- 表示名や表示色はスイッチロール後にAWSマネジメントコンソールの右上に表示される文字や文字ハイライトなので、わかりやすい表示名にしておくと視認性があがる
- 表示名の例
ロール名@ターゲットアカウントID - 表示色はカラーコードで表す
表示色 カラーコード Red ea7158 Orange fbc8aa Yellow efda95 Green b4d699 Blue 83d4e8 - None - ブラウザの拡張機能 (
AWS Extend Switch Rolesなど)を使用するとスイッチロールが管理しやすいかも
- 元アカウントにログイン後、
Discussion