AWS Organizations でサービスコンロールポリシーを有効化・設定するまでの全体の流れを把握してみる

2022.04.04

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 アカウントにカスタマー管理ポリシーを設定します。

SandboxOU にポリシーをアタッチします。

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_64arm64の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 を設定する前に一読することをオススメします。

参考