セキュリティグループのアウトバウンドルールに S3 向けのルールを設定する

記事タイトルとURLをコピーする


コーヒーが好きな木谷映見です。

インバウンド通信を制限するためにセキュリティグループのインバウンドルールを設定することはよくありますが、アウトバウンドは制限しないことが多いと思います。
しかし、企業のセキュリティ基準が厳しく、セキュリティグループのアウトバウンド通信を制限したいケースもあります。
全てのアウトバウンド通信を許可するのは不安だ、しかし 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-permissionsPrefixListIds セクションに、コピーしたセキュリティグループ 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冠。