こんにちは。AWS CLIが好きな福島です。
はじめに
今回は、Organizationsで管理している全AWSアカウントを対象にEC2へのパブリックIP付与を禁止したため、その方法をブログに記載いたします。
結論
結論から記載すると、以下のSCPで実現することが可能です。 ただし、以下2点が注意点となります。 (サブネットのパブリックIPv4 アドレスの自動割り当てが無効になっていることが前提で動くSCPのため。)
注意点
①SCP適用前のAWSアカウントが対象
パブリックIPv4 アドレスの自動割り当てが有効になっているサブネットは、全て無効にする必要があります。
②全AWSアカウントが対象
手動でデフォルトVPCの削除またはデフォルトVPC内のサブネットのパブリックIPv4 アドレスの自動割り当てを無効にする必要があります。 ※新規にAWSアカウントを払い出した場合、上記対応を管理者が実施する必要があります...
SCPのポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:*:ec2:*:*:network-interface/*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" }, "StringEquals": { "ec2:AssociatePublicIpAddress": "true" } } }, { "Effect": "Deny", "Action": "ec2:AssociateAddress", "Resource": [ "arn:*:ec2:*:*:instance/*", "arn:*:ec2:*:*:network-interface/*" ], "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } }, { "Effect": "Deny", "Action": [ "ec2:CreateDefaultVpc", "ec2:CreateDefaultSubnet" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } }, { "Effect": "Deny", "Action": "ec2:ModifySubnetAttribute", "Resource": "arn:*:ec2:*:*:subnet/*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } } ] }
解説
ポリシーのStatementは4つに分かれているため、1つずつ解説いたします。
◆ポリシーのStatement
①自動割り当てパブリック IPを有効にした場合、EC2を作成させない制限
②EC2にEIPをアタッチさせない制限
③デフォルトVPCおよびサブネットを作成させない制限
④サブネットの設定を変更させない制限
※今回は、Conditionにより、administratorユーザーは、この制限を受けないようにしております。
①自動割り当てパブリック IPを有効にした場合、EC2を作成させない制限
ポリシーは、以下の通りとなります。
{ "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:*:ec2:*:*:network-interface/*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" }, "StringEquals": { "ec2:AssociatePublicIpAddress": "true" } } }
まず、このポリシーの解説する前に、EC2の自動割り当てパブリックIPの設定について、ご説明いたします。
自動割り当てパブリックIPの設定には、以下の通り、3種類あります。
◆設定値
・サブネット設定を使用(有効or無効)
・有効
・無効
実は「サブネット設定を使用」が厄介で、上記ポリシーでは、自動割り当てパブリックIPの設定に「サブネット設定を使用」するとEC2を作成できてしまいます。
つまり、サブネットのパブリックIPv4 アドレスの自動割り当てが有効の場合、EC2にパブリックIPが付与できてしまいます。
ちなみに、サブネットのパブリックIPv4 アドレスの自動割り当てを明示的に無効にしなければ、 EC2を作成できないよう制限をかける(ポリシーは以下の通り。★が変更点)ことも可能ですが、ユーザービリティが下がるため、辞めました。
ただ、この場合、ポリシーが簡素化(③,④が不要)され、サブネットの自動割り当てパブリックIPの設定を気にする必要がないというメリットもあります。
自動割り当てパブリック IPを無効にしなければ、EC2を作成させない制限
{ "Effect": "Deny", "Action": "ec2:RunInstances", "Resource": "arn:*:ec2:*:*:network-interface/*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" }, ★ "StringNotEquals": { ★ "ec2:AssociatePublicIpAddress": "false" } } }
②EC2にEIPをアタッチさせない制限
①で十分と思いきや①だけでは、EC2をパブリックIPなしで作成した後に、 EIPをアタッチすると、EC2にパブリックIPを付与することができてしまうという抜け道があります。
そのため、以下のポリシーでEIPをアタッチさせないように制限いたします。
{ "Effect": "Deny", "Action": "ec2:AssociateAddress", "Resource": [ "arn:*:ec2:*:*:instance/*", "arn:*:ec2:*:*:network-interface/*" ], "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } }
③デフォルトVPCおよびサブネットを作成させない制限
なぜ、この制限が必要と思った方もいるかと存じます。
実は、デフォルトサブネットとそれ以外のサブネットでは、 パブリックIPv4 アドレスの自動割り当て設定のデフォルト値が異なります。
◆パブリックIPv4 アドレスの自動割り当て設定のデフォルト値
・デフォルトサブネット:有効
・デフォルト以外のサブネット:無効
デフォルトサブネットのデフォルト値が有効というのが厄介です。
そのため、冒頭で記載した通り、手動でデフォルトVPCの削除または デフォルトVPC内のサブネットのパブリックIPv4 アドレスの自動割り当てを無効にする必要があります。
ただし、上記対応だけでは、不十分でデフォルトVPCを再作成(削除→作成)すると、 パブリックIPv4 アドレスの自動割り当て設定が有効のサブネットができてしまうため、 以下のポリシーでデフォルトVPCおよびサブネットを作成させない制限をかけております。
{ "Effect": "Deny", "Action": [ "ec2:CreateDefaultVpc", "ec2:CreateDefaultSubnet" ], "Resource": "*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } }
④サブネットの設定を変更させない制限
③でも記載しましたが、デフォルトサブネット以外のサブネットは、 パブリックIPv4 アドレスの自動割り当て設定のデフォルト値が無効となります。
ということで、これを有効に変更できないように以下の通り、制限をかけております。
{ "Effect": "Deny", "Action": "ec2:ModifySubnetAttribute", "Resource": "arn:*:ec2:*:*:subnet/*", "Condition": { "ForAllValues:StringNotLike": { "aws:PrincipalArn": "arn:aws:iam::*:user/administrator" } } }
終わりに
いかがでしたでしょうか。
もっとスマートにやりたかったのですが、ちょっと複雑になってしまいました。
どなたかのお役に立てれば幸いです。