年中アイス

いろいろつらつら

awscliを使って、VPC向けsecurity groupを作成する

以下が完了していること前提になっています。

  • awscliのインストール(確認環境は、aws-cli/1.4.2 Python/2.7.5 Darwin/13.3.0です)
  • AccessKeyのセットアップ
  • VPCの作成(例として、10.0.0.0/16を用います)

手順としては、以下になります。

  • SecurityGroup(以下SG)の作成
  • Inboundのルール設定
  • Outboundのルール設定(必要ないケースもあります)

SGの作成

SGの作成には、create-security-groupを使います。vpc-id(vpc-16進数8桁)が必要なので、事前に調べておいてください。コマンド例では、VPC_IDという変数に入れているので、シェルで入れておくとそのまま動きます。

aws ec2 create-security-group --vpc-id $VPC_ID --group-name internal-ssh --description "for internal ssh."

以下の結果が返ってきます

{
    "return": "true",
    "GroupId": "作成されたSecurityGroupのID(sg-16進数8桁)"
}

作成されたSGの確認

SGの確認は、describe-security-groupsを使います。
先ほどの作成結果のSGのID(sg-16進数8桁)を指定します。以降、コマンド例ではSG_IDという変数を使っているので、VPC_ID同様、シェルで入れておくとそのまま動きます。

aws ec2 describe-security-groups --group-ids $SG_ID

# 結果JSON
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": 
                }
            ],
            "Description": "for internal ssh.",
            "IpPermissions": ,
            "GroupName": "internal-ssh",
            "VpcId": "$VPC_ID",
            "OwnerId": "$OWNER_ID",
            "GroupId": "$SG_ID"
        }
    ]
}

作成されたばかりのセキュリティグループにはOutboundのIpPermissionsEgressしかありません。InboundのIpPermissionsは空になっていて、外からのアクセス(Inbound)はすべて拒否です。逆に外へのアクセス(Outbound)はすべて許可されています。

Inboundのルール設定

Inboundは、外部からインスタンスに対するアクセスを制御するルールです。例えば、SSHや、HTTPが該当します。authorize-security-group-ingressを使用して追加します。

aws ec2 authorize-security-group-ingress --group-id $SG_ID --cidr 10.0.0.0/16 --port 22 --protocol tcp

# 結果JSON
{
    "return": "true"
}

別のルールを複数回実行すると追加されます。洗い替えではありません。

aws ec2 authorize-security-group-ingress --group-id $SG_ID --cidr 10.0.0.0/16 --port 2222 --protocol tcp

# 結果JSON
{
    "return": "true"
}

再度describe-security-groupsで確認します。

aws ec2 describe-security-groups --group-ids $SG_ID

# 結果JSON
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": 
                }
            ],
            "Description": "for internal ssh.",
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "10.0.0.0/16"
                        }
                    ],
                    "UserIdGroupPairs": ,
                    "FromPort": 22
                },
                {
                    "ToPort": 2222,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "10.0.0.0/16"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "FromPort": 2222
                }
            ],
            "GroupName": "internal-ssh",
            "VpcId": "$VPC_ID",
            "OwnerId": "$OWNER_ID",
            "GroupId": "$SG_ID"
        }
    ]
}

IpPermissionsに22と2222のルールが追加されています。

Inboundルールの削除

2222のほうは適当に作ったので、削除します。inboundルールの削除にはrevoke-security-group-ingressを使います。

aws ec2 revoke-security-group-ingress --group-id $SG_ID --port 2222 --cidr 10.0.0.0/16  --protocol tcp

# 結果JSON
{
    "return": "true"
}

※cidrがなくてもtrueが返ってきますが、実際には消えていないので注意。

確認

aws ec2 describe-security-groups --group-ids $SG_ID

# 結果JSON
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": 
                }
            ],
            "Description": "for internal ssh.",
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "10.0.0.0/16"
                        }
                    ],
                    "UserIdGroupPairs": ,
                    "FromPort": 22
                }
            ],
            "GroupName": "internal-ssh",
            "VpcId": "$VPC_ID",
            "OwnerId": "$OWNER_ID",
            "GroupId": "$SG_ID"
        }
    ]
}

IpPermissionsから2222が消えています。

Outboundのルール設定

Outboundは、インスタンスから外部に対するアクセスを制御するルールです。Outboundルールの設定には、authorize-security-group-egressを使います。

インスタンスから外部にsshする時に、接続先を特定のネットワークに対してのみ許可する場合は、以下のように設定します。*1

aws ec2 authorize-security-group-egress --group-id $SG_ID --cidr 10.0.0.0/16 --port 22 --protocol tcp

# 結果JSON
{
    "return": "true"
}

確認

aws ec2 describe-security-groups --group-ids $SG_ID

# 結果JSON
{
    "SecurityGroups": [
        {
            "IpPermissionsEgress": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "10.0.0.0/16"
                        }
                    ],
                    "UserIdGroupPairs": ,
                    "FromPort": 22
                },
                {
                    "IpProtocol": "-1",
                    "IpRanges": [
                        {
                            "CidrIp": "0.0.0.0/0"
                        }
                    ],
                    "UserIdGroupPairs": 
                }
            ],
            "Description": "for internal ssh.",
            "IpPermissions": [
                {
                    "ToPort": 22,
                    "IpProtocol": "tcp",
                    "IpRanges": [
                        {
                            "CidrIp": "10.0.0.0/16"
                        }
                    ],
                    "UserIdGroupPairs": [],
                    "FromPort": 22
                }
            ],
            "GroupName": "internal-ssh",
            "VpcId": "$VPC_ID",
            "OwnerId": "$OWNER_ID",
            "GroupId": "$SG_ID"
        }
    ]
}

IpPermissionsEgressに22が追加されています。

Outboundルールの削除

削除する場合は、revoke-security-group-egressを使います。ingressと同じなので省略。

*1:実際に外部へのSSHが制御できてるか確認できてないので、あくまでOutbound設定例としてご覧ください