CloudShell VPC environment を SCP で制限してみる
こんにちは、AWS 事業本部の平木です!
みなさんは、CloudShell で最近アップデートのあった CloudShell を VPC 環境に作成できる機能を活用していますか?
初めて知った方はこちらのブログをご参照ください。
CloudShell を VPC 環境に作成できるようになったことで AWS 運用、特に踏み台サーバの運用方法がかなり変わってくるといった側面を持つ反面、場合によっては気軽に作成されては困るユーザーもいるかと思います。
今回はいくつか CloudShell VPC environment を SCP(サービスコントロールポリシー)で制限するパターンをご紹介します。
CloudShell VPC environment を一切作成させたくない
まずはそもそも作成させたくないパターンです。
この場合は下記ポリシーで実現可能です。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "DenyCloudShellVpcEnvironments",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"Null": {
"cloudshell:VpcIds": "false"
}
}
}
]
}
Condition 要素で条件演算子Null
を活用することで特定の条件キーがあるかどうかを判別できます。
条件演算子 Null については下記ブログをご参照ください。
VpcIds
が存在したら環境を作成させないようにしたいためfalse
となっています。
false
からtrue
に変更いただくと逆にパブリック CloudShell を使用不可にし、CloudShell VPC environment のみ使用可能にできます。
起動できる VPC を制限する
次は作成は許容するけど特定の VPC 以外には作成させないパターンです。
下記ポリシーで実現できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceOutOfVpc",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"ForAnyValue:StringNotEquals": {
"cloudshell:VpcIds": "vpc-ID"
}
}
}
]
}
vpc-ID
を任意の VPC ID に置換いただくと指定した VPC ID 以外では起動できないようになります。
パブリック CloudShell については制限していないため使用できます。
起動できるサブネットを制限する
次は起動できるサブネットを制限するパターンです。
パブリックサブネットには起動させずプライベートサブネットのみに起動させたいといったシチュエーションなどを想定しています。
下記ポリシーで実現できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceStayInSpecificSubnets",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"ForAllValues:StringNotEquals": {
"cloudshell:SubnetIds": [
"subnet-id1",
"subnet-id2"
]
}
}
}
]
}
subnet-id1
、subnet-id2
を置換いただくことで起動したいサブネットを制限できます。
付与できるセキュリティグループを制限する
続いては作成は許容するけど特定のセキュリティグループを関連付けないと許容しないパターンです。
セキュリティグループを自由に付与できてしまうと RDS への接続などが容易になってしまう恐れがあるためこちらを使用したいケースはあるかと思います。
下記ポリシーで実現できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceOutOfSecurityGroups",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"ForAnyValue:StringNotEquals": {
"cloudshell:SecurityGroupIds": "sg-ID"
}
}
}
]
}
sg-ID
を任意のセキュリティグループ ID に置換していただくことで指定したセキュリティグループを設定しないと起動不可にできます。
起動できるユーザー(IAM ロールや IAM ユーザーなど)を制限する
最後は CloudShell VPC environment を起動できるユーザーを制限するパターンです。
アカウントレベルで特定のロールなどを保持したユーザーに制限できます。
下記ポリシーで実現できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceOutOfUser",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"Null": {
"cloudshell:VpcIds": "false"
},
"ArnNotEquals": {
"aws:PrincipalArn": "USER_ARN"
}
}
}
]
}
USER_ARN
に任意の ARN を置換することで特定のロールやユーザーの場合にのみ利用可能なように制限できます。
IAM Identity Center を使用している場合は以下のように記載することでマルチアカウントにおいても柔軟に対応できます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnforceOutOfIICUser",
"Action": [
"cloudshell:CreateEnvironment"
],
"Effect": "Deny",
"Resource": "*",
"Condition": {
"Null": {
"cloudshell:VpcIds": "false"
},
"ArnNotLike": {
"aws:PrincipalArn": "arn:aws:iam::*:role/aws-reserved/sso.amazonaws.com/*/AWSReservedSSO_(許可セット名)_*"
}
}
}
]
}
パブリック CloudShell は継続して利用可能です。
参考
おわりに
今回は、CloudShell VPC environment を SCP でいろいろ制限してみました。
IP 制限をかける方法も検証してみましたが現時点では見つけられなかったため起動できるユーザーなどで制限をかけるなどを検討いただければと思います。
この記事がどなたかの役に立つと嬉しいです。