🗂

AWS CLIを使用したセキュリティグループの操作~マネコンの操作の制限を超える事例3選~

2023/09/25に公開

AWS CLIを使用したセキュリティグループの操作

セキュリティグループはAWSの仮想プライベートクラウド(VPC)内でのネットワークトラフィックのフィルタリングを行うためのツールです。ここでは、AWS CLIを使用してセキュリティグループを操作する方法を示します。

1. 基本操作

利用可能なVPCの一覧を表示:

aws ec2 describe-vpcs --query "Vpcs[*].{ID:VpcId,CidrBlock:CidrBlock,State:State}" --output table

特定のVPCを変数に格納:

上記のコマンドで表示されるVPCの一覧から、特定のVPCのIDを選択して以下のコマンドを実行します。

VPC_ID="ここにコピーしたVPCのIDを貼り付け"

セキュリティグループの作成:

aws ec2 create-security-group --group-name SecurityGroup1 --description "First security group" --vpc-id $VPC_ID
aws ec2 create-security-group --group-name SecurityGroup2 --description "Second security group" --vpc-id $VPC_ID

セキュリティグループの一覧表示:

aws ec2 describe-security-groups --query "SecurityGroups[*].{Name:GroupName,ID:GroupId,Description:Description}" --output table

インバウンドルールの追加:

  • SecurityGroup1にすべてのIPからのHTTP (port 80) トラフィックを許可:
aws ec2 authorize-security-group-ingress --group-name SecurityGroup1 --protocol tcp --port 80 --cidr 0.0.0.0/0
  • SecurityGroup2にすべてのIPからのHTTPS (port 443) トラフィックを許可:
aws ec2 authorize-security-group-ingress --group-name SecurityGroup2 --protocol tcp --port 443 --cidr 0.0.0.0/0
  • SecurityGroup1とSecurityGroup2に、すべてのIPからのSSH (port 22) トラフィックを許可:
aws ec2 authorize-security-group-ingress --group-name SecurityGroup1 --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 authorize-security-group-ingress --group-name SecurityGroup2 --protocol tcp --port 22 --cidr 0.0.0.0/0

インバウンドルールの一覧表示:

特定のセキュリティグループのインバウンドルールを表示するには、以下のコマンドを使用します。※結果を一時的なファイルにリダイレクトしてから、そのファイルを cat で表示

aws ec2 describe-security-groups --group-names SecurityGroup1 --query "SecurityGroups[*].IpPermissions" --output table > temp_output1.txt
cat temp_output1.txt
aws ec2 describe-security-groups --group-names SecurityGroup2 --query "SecurityGroups[*].IpPermissions" --output table > temp_output2.txt
cat temp_output2.txt

インバウンドルールの削除:

  • SecurityGroup1からすべてのIPからのHTTP (port 80) トラフィックのルールを削除:
aws ec2 revoke-security-group-ingress --group-name SecurityGroup1 --protocol tcp --port 80 --cidr 0.0.0.0/0
  • SecurityGroup2からすべてのIPからのHTTPS (port 443) トラフィックのルールを削除:
aws ec2 revoke-security-group-ingress --group-name SecurityGroup2 --protocol tcp --port 443 --cidr 0.0.0.0/0
  • SecurityGroup1とSecurityGroup2から、すべてのIPからのSSH (port 22) トラフィックのルールを削除:
aws ec2 revoke-security-group-ingress --group-name SecurityGroup1 --protocol tcp --port 22 --cidr 0.0.0.0/0
aws ec2 revoke-security-group-ingress --group-name SecurityGroup2 --protocol tcp --port 22 --cidr 0.0.0.0/0

2. 応用: CLIの特有の操作

2つのセキュリティグループのインバウンドルールの比較

用途: 異なる環境(例: 本番環境とステージング環境)でのセキュリティグループの設定の違いを迅速に確認する際に役立ちます。
メリット: 手動での比較よりも迅速かつ正確に差分を特定できる。

2つのセキュリティグループのインバウンドルールを比較するには、以下の手順を使用します。

  1. それぞれのセキュリティグループのインバウンドルールをファイルに出力します。
aws ec2 describe-security-groups --group-names SecurityGroup1 --query "SecurityGroups[*].IpPermissions" --output json > sg1_rules.json
aws ec2 describe-security-groups --group-names SecurityGroup2 --query "SecurityGroups[*].IpPermissions" --output json > sg2_rules.json

diff コマンドを使用して、2つのファイルの差分を比較します。

diff sg1_rules.json sg2_rules.json

この diff コマンドの結果は、2つのセキュリティグループのインバウンドルール間の違いを示しています。異なる行がコンソールに表示されるため、どのルールが異なるのかを簡単に確認できます。

$ diff sg1_rules.json sg2_rules.json
4c4
<             "FromPort": 80,
---
>             "FromPort": 22,
13c13
<             "ToPort": 80,
---
>             "ToPort": 22,
17c17
<             "FromPort": 22,
---
>             "FromPort": 443,
26c26
<             "ToPort": 22,
---
>             "ToPort": 443,

セキュリティグループ1(sg1_rules.json)がHTTPとSSHのトラフィックを許可しているのに対し、セキュリティグループ2(sg2_rules.json)がSSHとHTTPSのトラフィックを許可していることを示しています。

複数のセキュリティグループのインバウンドルールを追加

用途: 複数のセキュリティグループに同じルールを迅速に適用する際に役立ちます。
メリット: 一つ一つのセキュリティグループに対してマネジメントコンソールを使って手動でルールを追加するよりも効率的。

以下の手順で複数のセキュリティグループに同時にインバウンドルールを追加できます。

  1. セキュリティグループの一覧表示:
aws ec2 describe-security-groups --query "SecurityGroups[*].{Name:GroupName,ID:GroupId,Description:Description}" --output table
  1. 対象となるセキュリティグループIDのリストを作成:※sg-xxxxxxxxxはセキュリティーグループの一覧表示されたIDを入力する。2つでも3つでも4つでも複数sg-xxxxxxxxx追加できる。
SECURITY_GROUPS=("sg-xxxxxxxxx" "sg-xxxxxxxxx")
  1. 各セキュリティグループにインバウンドルールを追加:
for sg in "${SECURITY_GROUPS[@]}"; do
  aws ec2 authorize-security-group-ingress --group-id $sg --protocol tcp --port 80 --cidr 192.168.1.0/24  # HTTP
  aws ec2 authorize-security-group-ingress --group-id $sg --protocol tcp --port 443 --cidr 192.168.1.0/24 # HTTPS
  aws ec2 authorize-security-group-ingress --group-id $sg --protocol tcp --port 22 --cidr 192.168.1.0/24  # SSH
done

特定のIPアドレスを含むルールの検索

用途: 特定のIPアドレスや範囲を使用しているセキュリティグループを迅速に特定する際に役立ちます。例えば、不審なトラフィックの原因を特定したり、特定のIPアドレスがどのセキュリティグループで許可されているかを調べる際に使用します。
メリット: 複数のセキュリティグループの中から特定のIPアドレスを含むルールを持つものを迅速に検索できる。

特定のIPアドレス(例: '192.168.1.0/24')を含むセキュリティグループのルールを検索する方法を以下に示します。

aws ec2 describe-security-groups --query "SecurityGroups[?IpPermissions[?contains(IpRanges[].CidrIp, '192.168.1.0/24')]].{Name:GroupName,ID:GroupId}"
[
    {
        "Name": "SecurityGroup1",
        "ID": "sg-xxxxxxxxx"
    },
    {
        "Name": "SecurityGroup2",
        "ID": "sg-xxxxxxxxx"
    }
]

Discussion