コーヒーが好きな木谷映見です。
インバウンド通信を制限するためにセキュリティグループのインバウンドルールを設定することはよくありますが、アウトバウンドは制限しないことが多いと思います。
しかし、企業のセキュリティ基準が厳しく、セキュリティグループのアウトバウンド通信を制限したいケースもあります。
全てのアウトバウンド通信を許可するのは不安だ、しかし S3 へのアクセスは許可したい、そんなときに役立つ記事です。
S3 のマネージドプレフィックスリストの確認
S3 へのアクセスだけを許可するには、セキュリティグループのアウトバウンドルールに、S3 のマネージドプレフィックスリストを設定します。
マネージドプレフィックスリストとは、AWS サービスの IP アドレス範囲一式をまとめたものです。
東京リージョンの S3 バケットに使用されるパブリック IP アドレスの範囲は pl-61a54008
というプレフィックスリストにまとめられています。
VPC コンソールの「マネージドプレフィックスリスト」メニューから確認できます。
東京リージョンの S3 バケットはこんな IP アドレス範囲なんですね、ふむふむ。
AWS CLI からも確認できます。
describe-managed-prefix-lists — AWS CLI 2.9.2 Command Reference
実行例
[cloudshell-user@ip-10-0-164-145 ~]$ aws ec2 describe-managed-prefix-lists { "PrefixLists": [ { "PrefixListId": "pl-0b03d185a97164807", "AddressFamily": "IPv4", "State": "create-complete", "PrefixListArn": "arn:aws:ec2:ap-northeast-1:aws:prefix-list/pl-0b03d185a97164807", "PrefixListName": "com.amazonaws.global.groundstation", "Tags": [], "OwnerId": "AWS" }, { "PrefixListId": "pl-58a04531", "AddressFamily": "IPv4", "State": "create-complete", "PrefixListArn": "arn:aws:ec2:ap-northeast-1:aws:prefix-list/pl-58a04531", "PrefixListName": "com.amazonaws.global.cloudfront.origin-facing", "Tags": [], "OwnerId": "AWS" }, { "PrefixListId": "pl-61a54008", "AddressFamily": "IPv4", "State": "create-complete", "PrefixListArn": "arn:aws:ec2:ap-northeast-1:aws:prefix-list/pl-61a54008", "PrefixListName": "com.amazonaws.ap-northeast-1.s3", "Tags": [], "OwnerId": "AWS" }, { "PrefixListId": "pl-78a54011", "AddressFamily": "IPv4", "State": "create-complete", "PrefixListArn": "arn:aws:ec2:ap-northeast-1:aws:prefix-list/pl-78a54011", "PrefixListName": "com.amazonaws.ap-northeast-1.dynamodb", "Tags": [], "OwnerId": "AWS" } ] } [cloudshell-user@ip-10-0-164-145 ~]$
設定
以下のアウトバウンドルールを追加してやれば OK です。
タイプ | プロトコル | ポート範囲 | 送信先 |
---|---|---|---|
HTTPS | TCP | 443 | pl-61a54008 |
マネジメントコンソールでの設定
セキュリティグループの作成画面で、アウトバウンドルールを追加します。
タイプ・プロトコル・ポート範囲を入力します。
送信先の検索画面では pl
と入力すると、使用できるプレフィックスリストの候補が出てきますので、 S3 のプレフィックスリスト pl-61a54008
を選択します。
できました。
AWS CLI での設定
セキュリティグループの作成
まずセキュリティグループを作成します。
create-security-group — AWS CLI 2.9.2 Command Reference
VPC は作成済の想定で、--vpc-id
に VPC ID(vpc-xxxxxxxxxxxxxxxx
)をコピーして貼り付けて実行してください。
- 実行コマンド
aws ec2 create-security-group \ --description "s3-managed-prefixlist-test-cli" \ --group-name s3-managed-prefixlist-test-cli \ --vpc-id vpc-09937a1073ab8d7d3 \ --tag-specifications "ResourceType=security-group,Tags=[{Key=Name,Value=s3-managed-prefixlist-test-cli}]"
- 実行結果
[cloudshell-user@ip-10-0-165-66 ~]$ aws ec2 create-security-group \ > --description "s3-managed-prefixlist-test-cli" \ > --group-name s3-managed-prefixlist-test-cli \ > --vpc-id vpc-09937a1073ab8d7d3 \ > --tag-specifications "ResourceType=security-group,Tags=[{Key=Name,Value=s3-managed-prefixlist-test-cli}]" { "GroupId": "sg-05d58a0dfebf2ca4b", "Tags": [ { "Key": "Name", "Value": "s3-managed-prefixlist-test-cli" } ] } [cloudshell-user@ip-10-0-165-66 ~]$
作成したセキュリティグループのセキュリティグループ ID をコピーしておいてください。
デフォルトで作成される全許可アウトバウンドルールの削除
デフォルトでは以下のように、全許可アウトバウンドルールが付属してきてしまいます。
以下のコマンドでルール一覧を表示できます。
describe-security-group-rules — AWS CLI 2.9.2 Command Reference
--filters
にセキュリティグループ ID(sg-xxxxxxxxxxxxxxxxx
)を貼り付けて実行してください。
- 実行コマンド
aws ec2 describe-security-group-rules \ --filters 'Name=group-id,Values=sg-05d58a0dfebf2ca4b'
- 実行結果
[cloudshell-user@ip-10-0-165-66 ~]$ aws ec2 describe-security-group-rules \ > --filters 'Name=group-id,Values=sg-05d58a0dfebf2ca4b' { "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-01fbd15aea1e65bac", "GroupId": "sg-05d58a0dfebf2ca4b", "GroupOwnerId": "123456789012", "IsEgress": true, "IpProtocol": "-1", "FromPort": -1, "ToPort": -1, "CidrIpv4": "0.0.0.0/0", "Tags": [] } ] } [cloudshell-user@ip-10-0-165-66 ~]$
表示された全許可アウトバウンドルールのルール ID をコピーします。
以下のコマンドで全許可アウトバウンドルールを削除します。
revoke-security-group-egress — AWS CLI 2.9.2 Command Reference
--security-group-rule-ids
に全許可アウトバウンドルール ID(sgr-xxxxxxxxxxxxxxxxx
)を貼り付けて実行してください。
- 実行コマンド
aws ec2 revoke-security-group-egress \ --group-id sg-05d58a0dfebf2ca4b \ --security-group-rule-ids sgr-01fbd15aea1e65bac
- 実行結果
[cloudshell-user@ip-10-0-165-66 ~]$ aws ec2 revoke-security-group-egress \ > --group-id sg-05d58a0dfebf2ca4b \ > --security-group-rule-ids sgr-01fbd15aea1e65bac { "Return": true } [cloudshell-user@ip-10-0-165-66 ~]$
消えました。
アウトバウンドのルールを追加
以下のコマンドでアウトバウンドのルールを追加します。
authorize-security-group-egress — AWS CLI 2.9.2 Command Reference
--ip-permissions
の PrefixListIds
セクションに、コピーしたセキュリティグループ ID を入力してコマンドを実行してください。
- 実行コマンド
aws ec2 authorize-security-group-egress \ --group-id sg-05d58a0dfebf2ca4b \ --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,PrefixListIds='[{Description="S3 access",PrefixListId="pl-61a54008"}]' \ --tag-specifications "ResourceType=security-group-rule,Tags=[{Key="Name",Value="s3-access-rule"}]"
- 実行結果
[cloudshell-user@ip-10-0-165-66 ~]$ aws ec2 authorize-security-group-egress \ > --group-id sg-05d58a0dfebf2ca4b \ > --ip-permissions IpProtocol=tcp,FromPort=443,ToPort=443,PrefixListIds='[{Description="S3 access",PrefixListId="pl-61a54008"}]' \ > --tag-specifications "ResourceType=security-group-rule,Tags=[{Key="Name",Value="s3-access-rule"}]" { "Return": true, "SecurityGroupRules": [ { "SecurityGroupRuleId": "sgr-0d106abb94140266f", "GroupId": "sg-05d58a0dfebf2ca4b", "GroupOwnerId": "123456789012", "IsEgress": true, "IpProtocol": "tcp", "FromPort": 443, "ToPort": 443, "PrefixListId": "pl-61a54008", "Description": "S3 access", "Tags": [ { "Key": "Name", "Value": "s3-access-rule" } ] } ] } [cloudshell-user@ip-10-0-165-66 ~]$
できました。
CLI でセキュリティグループルールを作成する際の嬉しさは 作成と同時にName タグが付与できる ところですね。
CloudFormation での設定
簡単ではありますが、S3 へのアウトバウンド通信だけ許可したセキュリティグループを作成する CloudFormation テンプレートの yaml を掲載します。
VPC は作成済の想定で、CloudFormation スタックの展開時にパラメータで VPC を選択するようにしています。
AWSTemplateFormatVersion: "2010-09-09" Description: "SecurityGroups for S3 access" Parameters: VpcId: Description: "Select VPC" Type: "AWS::EC2::VPC::Id" Resources: ################################################## ## s3-access-test-cfn-sg ################################################## S3AccessTestSg: Type: "AWS::EC2::SecurityGroup" Properties: GroupDescription: "s3-managed-prefixlist-test-cfn" GroupName: "s3-access-test-sg" Tags: - Key: "Name" Value: "s3-access-test-sg" - Key: Environment Value: dev VpcId: !Ref VpcId ################################################## ## s3-access-test-cfn-sg-rule ################################################## # outbound S3AccessTestSgEgress: Type: "AWS::EC2::SecurityGroupEgress" DeletionPolicy: "Delete" Properties: Description: "S3 access" FromPort: "443" ToPort: "443" GroupId: !Ref S3AccessTestSg IpProtocol: "tcp" DestinationPrefixListId: pl-61a54008
できました。
以上、小ネタでした。
参考
AWS マネージドプレフィックスリストの提供 - Amazon Virtual Private Cloud
emi kitani(執筆記事の一覧)
AS部LX課。2022/2入社、コーヒーとサウナが好きです。執筆活動に興味があります。AWS認定12冠。