AWS環境において本番環境と開発環境を分ける場合にVPCを分けて作成した方が良いか?それとも同一VPCに、サブネットを複数作成してネットワークACLで制限した方が良いか? それぞれ既存環境だったり、要件や条件によって変わってくるかと思います。今回は、検証用のVPCのサブネットの範囲をClass Bで取っているので、単一のVPC内でサブネット単位で分けてネットワークACLでサブネット単位でのアクセス制限を簡易的に確認をして見ました。
Default設定の場合VPC内のサブネット間は接続可能
何もしないと、新規作成したサブネット間はアクセス可能 (VPC DefaultのネットワークACLが適用される)
※ この検証ではネットワークレベルの確認なので、サーバー側に鍵は登録していません。
[ec2-user@ip-172-30-2-38 ~]$ ssh 172.30.200.220
The authenticity of host '172.30.200.220 (172.30.200.220)' can't be established.
ECDSA key fingerprint is SHA256:/x5grKqiJjFxBi**************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '172.30.200.220' (ECDSA) to the list of known hosts.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
新たにネットワークACLを作成して、上記で作成したサブネットに適用
ACLで通信が拒否されているのでサーバーに到達出来ない。
[ec2-user@ip-172-30-2-38 ~]$ ssh 172.30.200.220 /**** ネットワークACLでDEVサブネット拒否 ***/
^C
上記で作成したネットワークACLに特定サブネットからのアクセスを許可
アクセス可能になりました
[ec2-user@ip-172-30-2-38 ~]$ ssh 172.30.200.220 /**** ネットワークACLでDEVサブネット許可 ***/
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
[ec2-user@ip-172-30-2-38 ~]$
基本的には、全体のシステム数、ネットワーク要件、セキュリティ要件だったりによって変わってくると思いますが、きちんと設計して運用ルールを決めておけばどちらでも問題無さそうでした。👌
参考
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-network-acls.html#nacl-examples
https://xpertstec.com/how-to-configure-network-acl-in-aws/
AWS Network ACL and subnets: network level security
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-08_AWS_Summit_Online_2020_NET01.pdf
備考:AWSコマンドでの確認
こちらは、Dockerを使ってますがawsコマンドで構成の確認も出来るので利用しやすいフォーマットでデータをダウンロードして整理すれば見やすくて便利なデータとして活用出来そうです。
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-vpcs --output text --query "Vpcs[].[Tags[?Key=='Name'] | [0].Value,VpcId,CidrBlock,DhcpOptionsId,State,OwnerId,InstanceTenancy]" | sort
None vpc-9999c9c99f34aaa99 172.16.0.0/16 dopt-15d58371 available 777775517777 default
None vpc-aca9a9d9 172.30.0.0/16 dopt-15d58371 available 777775517777 default
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-vpcs --query "Vpcs[].[Tags[?Key=='Name'] | [0].Value,VpcId,CidrBlockAssociationSet[0].CidrBlock,CidrBlockAssociationSet[1].CidrBlock,CidrBlockAssociationSet[2].CidrBlock]" --output text
None vpc-9999c9c99f34aaa99 172.16.0.0/16 None None
None vpc-aca9a9d9 172.30.0.0/16 None None
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-subnets --query "Subnets[].[Tags[?Key=='Name'] | [0].Value,VpcId,CidrBlock,AvailableIpAddressCount,SubnetId,AvailabilityZone,MapPublicIpOnLaunch,State,OwnerId]" --output text | sort
development-subnet vpc-aca9a9d9 172.30.200.0/24 250 subnet-00306c0f43eae0dda ap-northeast-1b False available 777775517777
None vpc-9999c9c99f34aaa99 172.16.0.0/24 251 subnet-0999c9d9f99f99e9d ap-northeast-1c False available 777775517777
None vpc-9999c9c99f34aaa99 172.16.1.0/24 251 subnet-9999b9ae5edef999d ap-northeast-1b False available 777775517777
None vpc-aca9a9d9 172.30.1.0/24 251 subnet-9999999f ap-northeast-1c True available 777775517777
None vpc-aca9a9d9 172.30.2.0/24 249 subnet-0f99bc99 ap-northeast-1b True available 777775517777
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-route-tables --query "RouteTables[].Associations[].[SubnetId,RouteTableId,Main]" --output text | sort | column -t
subnet-0999c9d9f99f99e9d rtb-04aeb82551d0e8365 False
None rtb-015476577ac48a41a True
None rtb-8b02aaec True
subnet-9999b9ae5edef999d rtb-04aeb82551d0e8365 False
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-internet-gateways --query "InternetGateways[].{InternetGatewayId:InternetGatewayId,VpcId:Attachments[0].VpcId}" --output table
----------------------------------------------------
| DescribeInternetGateways |
+------------------------+-------------------------+
| InternetGatewayId | VpcId |
+------------------------+-------------------------+
| igw-0550005f5559dd555 | vpc-9999c9c99f34aaa99 |
| igw-d05da1b5 | vpc-aca9a9d9 |
+------------------------+-------------------------+
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-network-acls --query "NetworkAcls[].Associations[].{NetworkAclId:NetworkAclId,SubnetId:SubnetId}" --output table
-------------------------------------------------------
| DescribeNetworkAcls |
+------------------------+----------------------------+
| NetworkAclId | SubnetId |
+------------------------+----------------------------+
| acl-09169185ed9999999 | subnet-0999c9d9f99f99e9d |
| acl-09169185ed9999999 | subnet-9999b9ae5edef999d |
| acl-99a99999 | subnet-9999999f |
| acl-99a99999 | subnet-0f99bc99 |
| acl-99ed9fffc9999f999 | subnet-00306c0f43eae0dda |
+------------------------+----------------------------+
root@DESKTOP-8BDL7KA:/# docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli ec2 describe-security-groups --query "SecurityGroups[].[VpcId,GroupName,GroupId,Description]" --output text | tr "\t" "?" | column -s? -t
column: line too long
None default sg-ce1aa1cf default group
None quicklaunch-1 sg-e99aa9e9 quicklaunch-1
vpc-aca9a9d9 launch-wizard-2 sg-999cbf99db9d99d99 launch-wizard-2 created 2021-10-22T09:46:40.731+09:00
vpc-9999c9c99f34aaa99 default sg-11e01d0ffd1111ca9 default VPC security group
vpc-aca9a9d9 launch-wizard-1 sg-1e1c1111 launch-wizard-1 created 2018-04-11T15:11:07.423+09:00
vpc-aca9a9d9 default sg-dc9ec5ba default VPC security group