CI2部 技術2課の山﨑です。
AWS OrganizationsのSCPを利用する際、一からポリシー設計をするのは簡単ではありません。
それはSCPはIAM Policyとは用途が異なることが多い(拒否リスト、AWSアカウント全体のアクセス統制として利用することが多い)ため、同じ設計思想をそのまま適用することが難しいためです。
そこで今回はSCPを設計する上で参考になりそうなサンプルポリシーを作成してみました。
おさらい
Organizations SCP
SCPとはマルチアカウント管理でとても便利なサービスとして知られるAWS Organizations で利用可能なService Control Policy を示しています。SCPではOrganizations配下のOU(Organizational Unit)、AWSアカウントに対する権限を規定します。これによりOUやAWSアカウントはSCPで規定した権限以上のことは何もできなくなります。AWSのIAMのベストプラクティス (最小権限の許可)にしたがって細かい制御を行うのは運用負荷が高いので、SCPでは許可したいことではなく、拒否させたいことを規定する方が良いと思います。
SCPについては以下のブログをご参照ください
Organizations については以下のブログをご参照ください
注意点としては、SCPの有効範囲はIAM UserとIAM Roleのみであるという点です。評価ロジックに記載されているリソースベースのポリシー等をSCPで制御することはできず、アイデンティティベースのポリシーのみ制御ができます。
※参考:サービスコントロールポリシー (SCPs) - AWS Organizations
つまりSCPを適用している場合は、「SCPで明示的な許可」かつ「アイデンティティベースのポリシーで明示的な許可」をしている操作のみが最終的な許可される権限になります。
※参考: Policy evaluation logic - AWS Identity and Access Management
SCPのサンプルポリシー
AWSリソース構築時のストレージ暗号化を強制するSCP
- EBS構築時にストレージ暗号化を強制
- RDS構築時にストレージ暗号化を強制
- EFS構築時にストレージ暗号化を強制
{ "Version": "2012-10-17", "Statement": [ { "Sid": "ForceRDSStorageEncryption", "Effect": "Deny", "Action": [ "rds:CreateDBInstance", "rds:CreateDBCluster" ], "Resource": [ "*" ], "Condition": { "Bool": { "rds:StorageEncrypted": "false" } } }, { "Sid": "ForceEBSStorageEncryption", "Effect": "Deny", "Action": [ "ec2:RunInstances", "ec2:CreateVolume" ], "Resource": [ "*" ], "Condition": { "Bool": { "ec2:Encrypted": "false" } } }, { "Sid": "ForceEFSStorageEncryption", "Effect": "Deny", "Action": [ "elasticfilesystem:CreateFileSystem" ], "Resource": [ "*" ], "Condition": { "Bool": { "elasticfilesystem:Encrypted": "false" } } } ] }
IAMの一部操作を禁止するSCP
- アクセスキーの作成を禁止
- IAMのパスワードポリシーの削除を禁止
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyIAMOperations", "Effect": "Deny", "Action": [ "iam:CreateAccessKey", "iam:DeleteAccountPasswordPolicy" ], "Resource": [ "*" ] } ] }
監査ログ、機密情報が格納されているS3への操作を制限するSCP
- S3バケットの削除を禁止
- バケットポリシーの削除を禁止
- オブジェクトの削除を禁止
- オブジェクトバージョンの削除を禁止
- レプリケーションを禁止
- レプリケーション設定の変更を禁止
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyS3Operations", "Effect": "Deny", "Action": [ "s3:DeleteBucket", "s3:DeleteObject", "s3:DeleteObjectVersion", "s3:DeleteBucketPolicy", "s3:ReplicateObject", "s3:PutReplicationConfiguration" ], "Resource": [ "*" ] } ] }
指定のAWSアカウント以外で、マネジメントコンソールにログイン可能なIAM Userの作成を禁止するSCP
- マネジメントコンソールにログイン可能なIAM Userの作成(CreateLoginProfile)を禁止
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyCreateLoginProfile", "Effect": "Deny", "Action": [ "iam:CreateLoginProfile" ], "Resource": [ "*" ], "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": [ "arn:aws:iam::*:root", "arn:aws:iam::アカウントID:*" ] } } } ] }
サービス影響が大きいネットワークコンポーネントの削除を禁止するSCP
- TGWの削除
- DXGWの削除
- DXの接続の削除
- VIFの削除
- VPCの削除
- Route53 Resolver Endpoint の削除
- NetworkFirewall の削除
{ "Version": "2012-10-17", "Statement": [ { "Sid": "DenyNWComponentsOperations", "Effect": "Deny", "Action": [ "ec2:DeleteTransitGateway", "directconnect:DeleteDirectConnectGateway", "directconnect:DeleteConnection", "directconnect:DeleteVirtualInterface", "ec2:DeleteVpc", "route53resolver:DeleteResolverEndpoint", "network-firewall:DeleteFirewall" ], "Resource": [ "*" ] } ] }
まとめ
今回はSCPを設計する上で参考になりそうなサンプルポリシーをいくつか作成してみました。
企業内で規定されているセキュリティポリシーやシステム要件によって制御すべき操作は異なるため、汎用的なSCPのポリシーを定義することはできませんが、SCP設計における一助となれば幸いです
山﨑 翔平 (Shohei Yamasaki) 記事一覧はコチラ
カスタマーサクセス部所属。2019年12月にインフラ未経験で入社し、AWSエンジニアとしてのキャリアを始める。2023 Japan AWS Ambassadors/2023-2024 Japan AWS Top Engineers