⚒️

【AWS】セキュリティグループのルール設定をCSVで効率化

2021/09/27に公開

趣旨

AWS SG(セキュリティグループ)のルールを、CSVで一気に追加/削除する方法を紹介します。
大量の通信要件を追加する場合や、複数のグループへの変更を適用する場合は、こちらの方法が参考になるかと思います。

使用するサービス/ツール

  • AWS CLI
  • CloudShell
  • PowerShell

前提

  • コマンドラインで操作可能な環境が整備されていること。
    端末にAWS CLI[1]をインストールしている、またCloud Shell[2]を利用できる等。
  • 対象のセキュリティグループが存在していること

1. CSVファイルの作成

1-1. フォーマットの作成

まずフォーマットを作成します。
下記の値をExcelの一列目に記載し、CSVファイルとして保存します。
※「GroupName」はログ出力などの管理目的です。省略しても問題ありません。

GroupID GroupName Protocol Port Cidr

1-2. パラメータシートの作成

1.で作成したフォーマットに、希望の通信要件を追記していきます。
各項目ごとの記載ルールは下記の通りに認識しておりますが、詳細はコマンドリファレンスをご確認ください。

項目 ルール
全体 一つのセルに一つの値を指定。複数は不可能。
GroupID 対象のセキュリティグループID(sg-から始まる)を指定。
GroupName 対象のセキュリティグループ名を指定。
Protocol tcp,udp,icmp,allのいずれかを指定。
Port ポート番号を指定。Anyは-1を指定。
Cidr IPアドレスを指定。プレフィックス長をつける。

※記入例
「launch-wizard-1」と「default」というグループに、10.0.0.0/32からのicmpとhttpsを許可します。

ここまで記載出来たら、フォーマットとは別のCSVファイルとして保存します。
CloudShellを利用される方は、この段階でファイルをアップロードしておきましょう。


2. コマンドラインで設定

2-1. Powershell立ち上げ

AWS CLIをインストールされている場合は、Powershellを立ち上げるだけです。
CloudShellを使われている場合は、下記「pwsh」コマンドを実行し、Powershellに切り替えます。

[cloudshell-user@ip-10-0-0-0 ~]$ pwsh
PowerShell 7.0.6
Copyright (c) Microsoft Corporation. All rights reserved.

https://aka.ms/powershell
Type 'help' to get help.

# powershellに切り替わる
PS /home/cloudshell-user> 
PS /home/cloudshell-user> 

2-2. CSV取り込み

環境変数「CSV」を定義し、作成したCSVファイル(パラメータシート)を取り込み、内容を確認します。
本記事では、作成したパラメータシートを「test.csv」として保存しています。
※コマンドを実行するディレクトリにCSVファイルがない場合は、ディレクトリを移動するか、パスを指定する必要があります。

# 環境変数に取り込み
> $CSV = Import-CSV test.csv -Encoding UTF8

# 内容確認
> $CSV

GroupID   : sg-0ae2894c0e704a315
GroupName : launch-wizard-1

Protocol  : icmp
Port      : -1
Cidr      : 10.0.0.0/32

GroupID   : sg-7692fa37
GroupName : default
Protocol  : tcp
Port      : 443
Cidr      : 10.0.0.0/32

2-3.事前コンフィグの取得

変更前の設定内容をファイルとして取得したい場合は、下記コマンドを実行します。
ここでは、「before.txt」に対象の「launch-wizard-1」と「default」の設定内容をテーブル形式で出力しています。

# 「Sort-Object GroupName -Unique」によって、グループ名の重複排除を行っていますので、同じグループの設定内容が出力されることはありません。
> $CSV | Sort-Object GroupName -Unique | foreach{
aws ec2 describe-security-groups --output table `
--group-ids $_.GroupID `
| tee before.txt -a }

# 下記のようなテーブル形式で、それぞれのセキュリティグループの設定が出力されます。
> cat before.txt
-------------------------------------------------
|            DescribeSecurityGroups             |
+-----------------------------------------------+
||               SecurityGroups                ||
|+--------------+------------------------------+|
||  Description |  default VPC security group  ||
||  GroupId     |  sg-7692fa37                 ||
||  GroupName   |  default                     ||


2-4-1. インバウンドルールとして追加

環境変数「CSV」に取り込んだ内容を、インバウンド(受信)ルールに追加していきます。
下記コマンドを実行します。

> $CSV | foreach{
aws ec2 authorize-security-group-ingress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}

# 何も表示されなければOK

2-4-2. インバウンドルールとして削除

削除の場合は、下記コマンドを実行します。

> $CSV | foreach{
aws ec2 revoke-security-group-ingress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}

#下記が表示されればOK
{
    "Return": true
}

2-5-1. アウトバウンドルールとして設定

環境変数「CSV」に取り込んだ内容を、アウトバウンド(送信)ルールに追加していきます。
下記コマンドを実行します。

> $CSV | foreach{
aws ec2 authorize-security-group-egress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}

# 何も表示されなければOK

2-5-2. アウトバウンドルールとして削除

削除の場合は、下記コマンドを実行します。

> $CSV | foreach{
aws ec2 revoke-security-group-egress `
--group-id $_.GroupID `
--protocol $_.Protocol `
--port $_.Port `
--cidr $_.Cidr
}

#下記が表示されればOK
{
    "Return": true
}

2-6. 事後確認

作業通りに設定されているか確認します。方法の指定はありません。
WebUIで直接確認するか、「3. 事前コンフィグの取得」の要領と同じく、別ファイルに出力し、diffツールで比較する方法も考えれます。
※例 「after.txt」へ出力

> $CSV | Sort-Object GroupName -Unique | foreach{
aws ec2 describe-security-groups --output table `
--group-ids $_.GroupID `
| tee after.txt -a }

3. 終わりに

今回はIPアドレスを指定しましたが、Cidrの欄にプレフィックスリストやSGを指定することも可能です。項目自体も変更可能ですので、色々とアレンジしていただければと思います(コマンド文も変更することをお忘れなく)。

脚注
  1. AWS CLI ユーザガイド ↩︎

  2. CloudShell ユーザガイド (こっちの方が簡単) ↩︎

Discussion