こんにちはますのです。
先日、複数のAWSアカウントを1つのIAMアカウントで跨いでアクセス出来るようにする方法を調べました。
【AWS SSO】【Switch Role】複数のAWSアカウントでログインを簡単に!
結果としてSwitch Roleを実装するようになり、IAMロールを触っていたのですが1つ問題が。。。
初期設定だとスイッチ元となる全IAMユーザ(正確にはAWSアカウントのroot権限)にアクセス権限を渡してしまうのです。
わたしの考えとしては「管理者グループに所属しているIAMユーザだけ」スイッチロールが出来るようにしたいのに…。
まぁ、グループを指定すれば余裕やで。と思い、信頼関係の編集からIAMロールのJSONを編集したところエラーが出ました。
エラーが発生しました: Invalid principal in policy: “AWS”:”arn:aws:iam::<スイッチ元AWSアカウントID>:group/<管理者グループ名>”
2020/9/26追記
検証アカウントに「AdministratorAccess」がついていたので、全IAMユーザと勘違いしていました…。
正確には「sts:AssumeRole」の権限をスイッチ元の各IAMグループに設定すれば行けることを確認しましたので訂正します。
【Switch Role】特定のIAMグループのみに権限を付与する
検証アカウントに「AdministratorAccess」がついていたので、全IAMユーザと勘違いしていました…。
正確には「sts:AssumeRole」の権限をスイッチ元の各IAMグループに設定すれば行けることを確認しましたので訂正します。
【Switch Role】特定のIAMグループのみに権限を付与する
目次
JSON:principalに対してIAMグループを設定することは出来ない
どうやら2020年8月時点では、JSONの要素「principal」にグループを指定することは出来ないようです。
指定出来るPrincipal一覧
ポリシーでは、次のいずれかのプリンシパルを指定できます。
- AWS アカウントと ルートユーザー
- IAM ユーザー
- フェデレーティッドユーザー(ウェブ ID または SAML フェデレーションを使用)
- IAM ロール
- ロールを引き受けるセッション
- AWS サービス
- 匿名ユーザー(非推奨)
管理者のIAMグループにどうにかして付与出来るものは無いかと考えましたが、ポリシーしか当てられなさそうなので筆者の知識では「無い」と結論になりました。
IAMユーザを指定する方法
運用上、IAMポリシーを管理する必要が出てしまうので避けたかったのです。
そこまで人数が多くない、頻度は少ないということもあり色々なものを天秤にかけた結果、今回はIAMユーザを設定する方法を取りました。
参考:https://dev.classmethod.jp/articles/cross-account-iam-role-tips/
2020/9/26追記
筆者の環境では、スイッチ元のIAMグループに「sts:AssumeRole」の権限を付与して管理する方法を採用しました。
ここから先の設定はIAMユーザを個別に指定するやり方になります。
筆者の環境では、スイッチ元のIAMグループに「sts:AssumeRole」の権限を付与して管理する方法を採用しました。
ここから先の設定はIAMユーザを個別に指定するやり方になります。
変更する場所
- スイッチ先のAWSアカウントにログイン
- IAM>ロール>スイッチ用の作成したIAMロールを選択
- タブ:信頼関係>信頼関係の編集をクリック
変更前のJSON(デフォルト状態)
このJSONは指定したAWSアカウント(123456789012)のrootにスイッチロールの権限が付与されます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:root"
},
"Action": "sts:AssumeRole",
"Condition": {"Bool": { "aws:MultiFactorAuthPresent": "true"}}
}
]
}
変更後のJSON(IAMユーザを指定)
指定したAWSアカウント(123456789012)のIAMユーザ1~3に対してのみ、スイッチロールの権限を付与します。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789012:user/<iamユーザ名1>",
"AWS": "arn:aws:iam::123456789012:user/<iamユーザ名2>",
"AWS": "arn:aws:iam::123456789012:user/<iamユーザ名3>"
},
"Action": "sts:AssumeRole",
"Condition": {"Bool": { "aws:MultiFactorAuthPresent": "true"}}
}
]
}
MFAを設定しなくても良い場合は、「Condition」の中身を全部消しましょう。
“Condition”: {}
“Condition”: {}
棚卸は面倒ですが、スイッチ元のIAMユーザのみ消してしまえば良いので良しとしましょう。
JSON側の許可設定が残っていても対象のIAMユーザを消していれば効果は発揮しませんからね。監査の時に何か言われるのでIAMユーザ削除とセットにしたほうが良いのは町が無い無いですが。。。
JSON側の許可設定が残っていても対象のIAMユーザを消していれば効果は発揮しませんからね。監査の時に何か言われるのでIAMユーザ削除とセットにしたほうが良いのは町が無い無いですが。。。