AWS Organizations でサービスコンロールポリシーを有効化・設定するまでの全体の流れを把握してみる
SCP(Service control policie)を有効化して、AWS Organizations で管理しているメンバーアカウントに適用するまでの流れを整理しました。
本記事で学べること
以下の設定手順を画面キャプチャをベースに設定の流れを把握できるように紹介します。
- SCP の有効化
- EC2 の起動できるインスタンスタイプを制限する SCP を作成
- SCP を OU にアタッチしてメンバーアカウントへ適用
- メンバーアカウントにサインインして EC2 作成できるか、できないか確認
SCP の有効化
ガードレールとして「やってはダメなこと」を本当に設定・操作できないように禁止する SCP を設定することになるかと思います。 たとえば CloudTrail や Config を停止したり、おもむろに GuardDuty も勝手に停止されたら管理者は困りますね。どうやって SCP を設定するのかキャプチャを追ってみていきます。
サービスコンロールポリシーをクリックします。
サービスコントロールポリシーを有効化にするをクリックします。
有効化はこれだけで完了です。
初期状態はFullAWSAccess
ポリシーのみ存在しています。ポリシーを作成をクリックしカスタマー管理ポリシーを作成してみます。
EC2 のインスタンスタイプに T系シリーズしか起動できない制限をしたカスタマー管理ポリシーを作成します。
ドキュメントに SCP のサンプル集がありますので気になった設定があれば試してみてください。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotLike": { "ec2:InstanceType": "t*.*" } } } ] }
カスタマー管理ポリシーが追加されました。
アクションからポリシーのアタッチを選択して、OU または AWS アカウントにカスタマー管理ポリシーを設定します。
Sandbox
OU にポリシーをアタッチします。
Sandbox
アカウントからポリシーを確認すると、作成したカスタマー管理ポリシーのInstanceTypeLaunchRestrictions
を確認できます。
AWS管理ポリシーのFullAWSAccess
もアタッチされています。アタッチされていないと暗黙のDenyによりなにも許可されたものがない状態になります。以下のリンクでは図解で暗黙のDenyを説明をしてありますので一読することをオススメします。
SCP を有効化しアカウントに適用する設定は以上です。ポリシーの作成を除けば簡単な操作ですね。
EC2起動テスト
AWS SSO からメンバーアカウントへサインインしました。サインインしているユーザーのアクセス許可セットはPowerUserAccess
の権限を持っています。
AWS managed policies for job functions - AWS Identity and Access Management
c6i.large
インスタンスタイプを選択して起動してみます。
以下のエラーメッセージが表示され、T系シリーズではないc6i
インスタンスタイプの EC2 を起動できませんでした。SCP が適用されている感じがしますね。次は T系シリーズは起動できるのかテストしてみます。
You are not authorized to perform this operation.
マネジメントコンソールから起動確認すると時間がかかるため、 AWS CLI で EC2 が起動できるかどうか--dry-run
オプションをつけてテストします。
Amazon Linux2 が起動できるかで確認します。まず AMI 名を確認します。以下ハイライト箇所のx86_64
とarm64
のAMIを使って検証します。
$ aws ssm get-parameters-by-path --path /aws/service/ami-amazon-linux-latest --query "Parameters[].Name" [ "/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-arm64", "/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-default-x86_64", "/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-arm64", "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-gp2", "/aws/service/ami-amazon-linux-latest/amzn-ami-hvm-x86_64-s3", "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2", "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2", "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.10-x86_64", "/aws/service/ami-amazon-linux-latest/al2022-ami-kernel-5.15-x86_64", "/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.10-x86_64", "/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-5.15-x86_64", "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-s3", "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-s3", "/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-s3", "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-arm64-gp2", "/aws/service/ami-amazon-linux-latest/amzn2-ami-kernel-5.10-hvm-x86_64-gp2", "/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-arm64-ebs", "/aws/service/ami-amazon-linux-latest/al2022-ami-minimal-kernel-default-x86_64", "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-hvm-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/amzn-ami-minimal-pv-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/amzn-ami-pv-x86_64-ebs", "/aws/service/ami-amazon-linux-latest/amzn2-ami-minimal-hvm-x86_64-ebs" ]
AWS CLI で EC2 作成をドライランしたときのメッセージから起動成功か、失敗か判断します。
起動判定 | メッセージ |
---|---|
成功 | An error occurred (DryRunOperation)... |
失敗 | An error occurred (UnauthorizedOperation)... |
m5.large
Tシリースではないので起動失敗です。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type m5.large --dry-run An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: 4duAMVH8XdoO3GWjTr8WoSrlWV9-0LO0ffa8_Tm9amQA1NB3xSfT2JrDUse8F2YpACnk5oYz2aQop_nCVfqFDS5dF1Fs1Mkaa4oFhMhpfLfCUPZjFjBGf6PWqtx9NTkdcyUCnBMZbZmkIkT8YQN3Lnva8Meorr2hApLwxdTOU5k7FXxmkjVn_iU3k2HjTr2Y3DFgAY9VYDD-HymLGRwsmgOuM64CkCAukPYSvOwDouJRkrd8IJzUht5dbQBS8J98HqpzOclNDO-qtg4ibehbAZQ4QRc4KKx9HhAqpTks5nQaJBnOLR6M8g0TfafXk75ttwsUru6nzRFI1sNiC0keQs--IG1kOM8vbzWnHfbdAl0Ho1hjS0vvC84P2kKHVIojFCMKnrLEgNr03wUMJhwG8BOo6d7aEebte4jxiO-0QA8rHU1aatzP38CqucKt40EbrmHmrkkD4AFnzvcZ2j-Xs9tVjuP3fnZnpjNTuRpsRBJKkZyNe99kPPoAXqJchwLgGS-EjVxVJA1StFgKvsr3nngR9Ajk36Y4YxdURXm_rH7v8xBJi3HJdxs_sq9h39imbbfMlABTJk3zzAtjCnNSVR-iJtLrxitZqjvQmJ-Ubb5ScBxX5hRPgKAN_vVdEYPkO4Y-AqfhI2QW9zXN5hl7Cbf52lPGoS_9qwpZcy2_JL5K8xET0_0WE0PsVeZ9RSFeuT5p38oUgmCnyiOzMuYlgxa5zIj4w9Lfe_Z1-rHShg7qBr3K-AuACq9k-lL2uOSDd91SKOpjrI9hkx7yAZXwDFG5EsA3ePEdjQyw6HgdHKsqf95MjDRDxBF4QCV7Mib3kw
t3.xlarge
Tシリースなので起動成功です。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type t3.xlarge --dry-run An error occurred (DryRunOperation) when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
t4g.large
Graviton2(ARM)のチップでもTシリーズなので起動成功です。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type t4g.large --dry-run An error occurred (DryRunOperation) when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
SCP を変更してみる
T系シリーズでも安価なインスタンスタイプのみしか許可しないように変更しました。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:aws:ec2:*:*:instance/*", "Condition": { "StringNotLike": { "ec2:InstanceType": [ "t*.nano", "t*.micro", "t*.small" ] } } } ] }
t4g.small
T系かつsmall
なので起動できます。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type t4g.small --dry-run An error occurred (DryRunOperation) when calling the RunInstances operation: Request would have succeeded, but DryRun flag is set.
t4g.large
T系でもlarge
は許可されていないので起動に失敗しました。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-arm64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type t4g.large --dry-run An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: k8a-ec9IQGdRpL5PZ3KRCakLBYl4OJWm94OoRiIMKYGW2mXG661yRNd5z2TrPumJgggAJ-JeDHf11mI97k8puq0eMjPZ7VSNxLk4cx2pDrxi0U-a2yaGtG3GRYQSJ_7zl_rcOyHQ8gFHGaC4v2Qul9UBcklJMoipCSasNgohkRzgBNctlFAn6k07CunTlULjCqjApT_Z7M5fpPCcy9Uy0eKB8Uj47ywnSg5gpEPgnAhiNQaN-XPv17nxcAR9P-7oB7M2BFZeeVJmTgsE4DqbWRHcTK4fv-jaTZ9W7zhSSiGLJqbfYzOR3eVW6Z7HWJ9bU51FJk0ceIEPuDVQUxfcmon9McxrE4EeMwMRokdJYT8Wk7Hs2RTtQ9bvzKTxFURtm_IeCOPd2sgFdv29ViZiDfJzXjOm28oKlSr2gteQRKFRY-XietCRPRCZiW-FVJjCIaqG15x4stRfcAN6rss4ZNpYzzLLM3bmGI9X9xmci2DW2l-0PfEMlUWTTDd1ju7LrDDwpBzncT-tGtIl8QaY1fAQ5u3izjnvjXpzgL1ib3Vw6l8UhDMxrHh61PUThZToObZ43TAxpcTNgV95mOTBOujrjPNiN71WYbWVnskfNh7RlOHOomyJvEC8QwQrJXbd_0eMSUVSj2vdRtQaVlWdQOEjmBpON3grQY0NcP-NvPKxavYJydal27o-krt2pugH9HeQc0EszIwrl_3LYS7Y0ze7hkCnXMy9Uf8AUVKPvX0WqJhF7fMGOWEq1jLJoXsJrK4Pq5A6K8nAMwmw-bjAaNwLtIjaVDVo1QLcJGFNWMt23AFIcKBJvXMyVxtLdJTDCTj56lmCP-vsMvWg6c8A
g4dn.xlarge
T系以外という意味では高価なG系も起動できないです。
$ aws ec2 run-instances --image-id $(aws ssm get-parameters --names /aws/service/ami-amazon-linux-latest/amzn2-ami-hvm-x86_64-gp2 --query 'Parameters[0].[Value]' --output text) --count 1 --instance-type g4dn.xlarge --dry-run An error occurred (UnauthorizedOperation) when calling the RunInstances operation: You are not authorized to perform this operation. Encoded authorization failure message: YxWBVCL4ob8C6z9zA0nRHeeT02pP4G6jVtnzSR8IfkWGPCQgeaHgg21jkhM_s1gDJW2vz6Q7RH-paSfp7U7y15F2FwwnMOujd9xELUUSnh5z4J7Q4dNQGns6S36I7grX9iCkUBZg-uTMDe_m6T-3V6CRpZ0JCYX4fxK4BNSWzDkcUOcjVPeS117RwhP3rQCfke_cQ2zW57nOds5paEfHddBd0cpVOjXPsbwq7ziV9joRnEqs6oHtSm1uw1mbHU2vPXBk9ioo13DwV63raRGEDXvmcm-5DMJRzSwpR1yC9ipK6yCYxq8zJJLXqM5X4AhbrZN7VJhAY4r3EsRLbSwSezdLWI2xFnCyCPXrSQ9R4vwh1hNbL-XOx11ZKctQRDGtkG6deakpbaKItnf9rKvURvVUMsMLCRf2QkuDiyoORER16-uqKKbqfSb9tpNApTJxV2hwwHQR6Bxc1pu81QtqLeNaiPtsGw5rwP1UqKzqROZiOKRmtKHH-TIYobvdn5gQ9Va69ia2JwfXmhy_w72hmjNFfslbrrMaN3V3sGC43FDtQVQQMuZrW3lTaBCmtne-hgQt06mkpLE0g3jG_vMfZnTKwtd3wpq5Uay-_w1lhhHGZ969PNx8rcqflbJo2FBC-DxLsE5ze6beLHgo9GRbsFERH8iM-eBhPWVEa0PU97Ix85qZcN2yb_AEwd2dCRl4enSHSNm6iOI-l67LIYa25gdSklVKuONndEQkokDoQSpn8jmYQxrT5-NoDpVQqhkrNf3Y93g8liTCuVxSG89ufuFQASeKZntHaGJQGP3lyU71CGp1hxrBk5F7aI-VTyiOffcDUp0E9wDaaZB4cn1irBp0GA
おわりに
SCP を有効化し OU または、AWS アカウントに適用させるのは簡単です。ポリシーの設定はある程度慣れが必要ですね。SCP 設定の雰囲気をざっと掴んだところで SCP には継承というものがあります。本文中にも同じリンクを紹介しておりますが、継承の仕組を図解されています。はじめて SCP を設定する前に一読することをオススメします。