AWSアカウント全体でやっていいこと、やっちゃいけないことをAWS OrganizationsのSCPで制限したいケースがあると思うのですが、ご作法が色々あるので、備忘録的にメモする。
Principal/NotPrincipal句をかけない。
- 代わりにConditionでがんばる
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyAssumeRoleToKeyMGRfromSSOuser",
"Effect": "Deny",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::*:role/testRole0*",
"Condition": {
"ArnLike": {
"aws:PrincipalArn": "arn:aws:iam::123456789012:role/aws-reserved/sso.amazonaws.com/ap-northeast-1/AWSReservedSSO_myTestAccessPermissions_*"
}
}
}
]
}
- Condition句でPrincipalを指定する場合は、PrincipalArnで指定するのがわかりやすいPrincipalArnで指定できるパターンは以下の4つ(ユーザガイド)
- IAM ロール(arn:aws:iam::123456789012:role/role-name)
- IAM ユーザー(arn:aws:iam::123456789012:user/user-name)
- AWS STS フェデレーションユーザーセッション(arn:aws:sts::123456789012:federated-user/user-name)
- AWS アカウント ルートユーザー(arn:aws:iam::123456789012:root)
⭕️ "aws:PrincipalArn": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/AWSReservedSSO_*" iamはユーザでもOK
⭕️ "aws:PrincipalArn": "arn:aws:sts::123456789012:federated-user/user-*" # sts/federated-userはOK
❌ "aws:PrincipalArn": "arn:aws:sts::*:assumed-role/AWSReservedSSO_*" # sts/assumed-roleはかけない
- IAM Identity CenterとかでSSOしてたり、踏み台AWSアカウントとかを使っているとassumed-roleのArnを使いたくなるが、aws:PrincipalArnではassumed-roleは指定できないので要注意。
Resource句はDenyでしか使えない。(Allowでは*としか書けない)
そして、NotResourceはAllowでもDenyでも使えない。
⭕️ できること
- このリソースはこの人しか使っちゃダメ(PrinsipalArnのStringNotEquals条件を使ったResouce指定Deny)
- このリソースタイプは使っちゃダメ(ワイルドカードResouce指定Deny)
❌ できないこと
- このリソースタイプだけなら使ってOK(Allow)
- この人はこのリソースのみ使ってOK(Allow)
- このリソース以外は使ってOK(Allow)
- このリソース以外は使っちゃダメ(NotResourceを使用したDeny)
以下はユーザガイドより
Effect 要素に Allow の値があるステートメントでは、SCP の Resource 要素の「*」のみを指定することができます。個々のリソースの Amazon リソースネーム (ARN) を指定することはできません。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_syntax.html#scp-syntax-resource
リソース要素でアスタリスク (*) や疑問符 (?) などのワイルドカード文字を使用することもできます。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_syntax.html#scp-syntax-resource
NotAction句はDenyでしか使えない。
普通にNotActionはDenyで使うことが多いと思うので、これはあまり気にならないはず。IAMポリシーとかだとNotActionを使ったAllow(このAction以外は使ってOK)という書き方はできるけど、無秩序な許可に繋がりやすいのでできるだけ使わない方が良い。
おすすめの使い方
おすすめの使い方がユーザガイドで公開されている。まずはそこから入るとよい。
https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_manage_policies_scps_examples_general.html
-
リージョン制限
特定リージョン以外でのAPI実行は禁止する -
特権管理者以外による重要リソースの変更禁止
特定のIAMロールやSSOユーザ以外は、全体統制に関わる重要リソースの操作ができないように制限する。たとえばアラート通知用SNS Topicの削除を禁止する。 -
ルートユーザの使用禁止
Control Towerで払い出したAWSアカウントとかではrootユーザを使うシーンはほとんどないので、rootユーザはSCPで何にもできないようにしておくのがおすすめ。ちなみに、rootユーザでないとできないオペレーションはユーザガイドにリストされている。