概要
さくらのクラウドのパケットフィルタルール一覧をCSVで保存したいけど、残念なことにそんな便利なボタンは存在しません。。。
そこで今回はさくらのクラウドで設定されているパケットフィルタのルールを、usacloud と jq を使ってCSV形式で保存する手順を紹介します。
パケットフィルタの棚卸し、設定差分の確認、Excelでの確認などを行いたい場合に使えます。
環境
今回の例では以下の環境で実行しています。
# usacloud version
1.14.0 linux/amd64
事前準備
必要なものは以下です。
- さくらのクラウドのAPIキー
usacloudjq
さくらのクラウドAPIキーについては下記を参照してください
usacloud の認証設定
まず、さくらのクラウドのAPIトークンとシークレットを usacloud に設定します。
usacloud config
対話形式で聞かれるので、以下を入力します。
Setting SakuraCloud API Token =>
Enter token:
ここには、さくらのクラウドの アクセストークン を入力します。
続いて、
Enter secret:
には、アクセストークンシークレット を入力します。
出力形式を聞かれた場合、今回はJSONを使うので json を指定しておくと便利です。
Setting Default Output Type=>
Enter Default Output Type[table/json/yaml]: json
パケットフィルタ一覧を確認する
まず、パケットフィルタの一覧を確認します。
usacloud packet-filter list --zone=all -o table
出力例です。
+------+--------------+-------------+-------------+------------+----------------------------------+
| Zone | ID | Name | Description | Expression | ExpressionHash |
+------+--------------+-------------+-------------+------------+----------------------------------+
| tk1a | xxxxxxx | test | - | 29 | xxxxxxxxxxx |
| tk1a | yyyyyyy | test_alma | - | 29 | yyyyyyyyyyy |
| tk1a | zzzzzzz | test_clone | - | 29 | zzzzzzzzzzz |
+------+--------------+-------------+-------------+------------+----------------------------------+
この例では、tk1a ゾーンに3つのパケットフィルタがあります。
-
ID: パケットフィルタのID -
Name: パケットフィルタ名 -
Expression: ルール数 -
ExpressionHash: ルール内容のハッシュ
ExpressionHash が同じものは、ルール内容が同一である可能性があります。
パケットフィルタの詳細をJSONで取得する
対象のパケットフィルタIDを指定して、詳細情報をJSONで取得します。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json
必要に応じてファイルに保存します。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json > packet-filter-test_alma.json
jqでCSV形式に変換する
パケットフィルタのルール本体は、JSON内の Expression 配列に入っています。
以下のコマンドでCSV化できます。
jq -r '
.Expression
| sort_by(.DestinationPort, .Protocol, .SourceNetwork, .Description)
| (["Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"] | @csv),
(.[] | [
.Action,
.DestinationPort,
.Protocol,
.SourceNetwork,
.SourcePort,
.Description
] | @csv)
' packet-filter-test_alma.json > packet-filter-test_alma.csv
これで、以下のようなCSVファイルが作成されます。
"Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"
"allow","80","tcp","","","HTTP"
"allow","443","tcp","","","HTTPS"
"allow","25","tcp","","","SMTP"
usacloudから直接CSVに変換する
JSONファイルを中間保存せず、直接CSVに変換することもできます。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json 2>/dev/null \
| jq -r '
.Expression
| sort_by(.DestinationPort, .Protocol, .SourceNetwork, .Description)
| (["Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"] | @csv),
(.[] | [
.Action,
.DestinationPort,
.Protocol,
.SourceNetwork,
.SourcePort,
.Description
] | @csv)
' > packet-filter-test_alma.csv
ターミナル上で見やすく表示する
CSV保存ではなく、ターミナル上で確認したいだけならTSV形式にして column で整形すると見やすいです。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json 2>/dev/null \
| jq -r '
.Expression
| sort_by(.DestinationPort, .Protocol, .SourceNetwork, .Description)
| (["Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"] | @tsv),
(.[] | [
.Action,
.DestinationPort,
.Protocol,
.SourceNetwork,
.SourcePort,
.Description
] | @tsv)
' | column -t -s $'\t'
複数のパケットフィルタをCSV保存する
複数のパケットフィルタを保存したい場合は、IDごとに実行します。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json > packet-filter-test.json
usacloud packet-filter read yyyyyyy --zone=tk1a -o json > packet-filter-test_alma.json
usacloud packet-filter read zzzzzzz --zone=tk1a -o json > packet-filter-test_clone.json
CSV化します。
for file in packet-filter-*.json; do
base="${file%.json}"
jq -r '
.Expression
| sort_by(.DestinationPort, .Protocol, .SourceNetwork, .Description)
| (["Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"] | @csv),
(.[] | [
.Action,
.DestinationPort,
.Protocol,
.SourceNetwork,
.SourcePort,
.Description
] | @csv)
' "$file" > "${base}.csv"
done
FAQ
table出力では詳細ルールが見えない
以下のように read -o table を実行しても、概要しか表示されない場合があります。
usacloud packet-filter read xxxxxxx --zone=tk1a -o table
その場合は、-o json または -o yaml を使います。
usacloud packet-filter read xxxxxxx --zone=tk1a -o json
まとめ
(さくらさん、ダウンロードボタンを管理画面に追加してください。)
一応今回やったことのおさらいです。
さくらのクラウドのパケットフィルタをCSV保存するには、以下の流れで対応できます。
usacloud packet-filter list --zone=all -o table
対象のIDを確認します。
usacloud packet-filter read <PACKET_FILTER_ID> --zone=<ZONE> -o json > packet-filter.json
jq でCSV化します。
jq -r '
.Expression
| sort_by(.DestinationPort, .Protocol, .SourceNetwork, .Description)
| (["Action","DstPort","Protocol","SourceNetwork","SourcePort","Description"] | @csv),
(.[] | [
.Action,
.DestinationPort,
.Protocol,
.SourceNetwork,
.SourcePort,
.Description
] | @csv)
' packet-filter.json > packet-filter.csv
パケットフィルタの棚卸しやExcelでの確認を行う場合、この方法でかなり扱いやすくなります。
