はじめに
こんにちは、株式会社シーエー・アドバンス技術統括本部の@sk888です。
今回はさくらクラウドの公認CLIクライアントのusacloudを使用して、コマンド一発でさくらクラウド環境に脆弱性診断環境(BurpSuite実行環境)を構築したり、消したりする事をやってみようと思います。
usacloudとは
オープンソースで開発されているさくらクラウドの公認CLIクライアントです。
さくらクラウド環境の操作を、Web管理画面ではなく手元の環境からCLIで実施できるようになります。
Windows、Linux、macOSで利用可能で、Dockerの実行用イメージもあるようです。
ちょっと古いですが、さくらのナレッジにも記事があります。
やりたいこと
脆弱性診断ではBurpSuiteなどの診断ツールによる自動Scan(ActiveScan)を実施すると思いますが、手元のPCでScanを行っているとCPUやメモリ、ディスクのリソースが割かれますし、最近はコロナの影響によるリモートワークで会社と自宅を行き来する等、会社にScan中のPCを置いたままに出来ないなどの事情がありました。
そんな時に、コマンド一発でクラウド上に自動Scan環境を立てられれば、手元では別の作業も出来るしとても便利だなと思いました。
環境・事前準備
「PC」
windows10 PRO
事前準備として、さくらクラウド環境上にubuntu22.04によるリモートデスクトップ環境を構築し、BurpSuiteなどのツールを導入してアーカイブ化してあります。
また、下記サイトを参考にさくらクラウドWebコンソール上でAPIキーを作成しておく必要が有ります。
usacloud導入
先ずは導入ガイドを参考に手元のPCにusacloudをインストールします。
Windowsはchocolateyでインストール出来ますが、今回はその他の手段として実行用バイナリファイルを使用します。
GitHub ReleasesページからWindows用のZIPファイル「usacloud_windows-amd64.zip」をダウンロードして展開し、任意のフォルダー内に配置します。
配置先のフォルダーを環境変数Pathに追加します。
コマンドプロンプトを起動して、usacloud -v
を打つことでバージョン情報を確認出来ます。
>usacloud -v
1.10.2 windows/amd64, build 74947b18
usacloud config
コマンドで事前準備で作成したアクセストークン・シークレット等を入力します。
操作対象のゾーンとコマンド実行時のデフォルトの出力形式も入力します。
>usacloud config
Setting SakuraCloud API Token =>
Enter token: [アクセストークンを入力]
Setting SakuraCloud API Secret =>
Enter secret: [アクセスシークレットを入力]
Setting SakuraCloud Zone =>
Enter Zone[tk1a/tk1b/is1a/is1b/tk1v]: [ゾーンを入力]
Setting Default Output Type =>
Enter Default Output Type[table/json/yaml]: [デフォルトの出力形式を入力]
Written your settings to ~\.usacloud\default\config.json
コマンドリファレンス
コマンドについては、日本語ドキュメントのページに基本的な利用方法やリファレンスが載っています。
基本的な構文は下記の様になっていて、各コマンドやオプション、引数の部分で--help
or -h
を打つことで利用可能なものを確認出来ます。
>usacloud -h
CLI to manage to resources on the SAKURA Cloud
Usage:
usacloud [global options] <command> <sub-command> [options] [arguments] [flags]
usacloud [command]
Available Commands:
completion Generate completion script
config Management commands for Configuration file/Profile
help Help about any command
iaas SubCommands for IaaS
rest Invoke SAKURA cloud API directly
update-self Update Usacloud to latest-stable version
version Show version info
web-accelerator SubCommands for WebAccelerator
Flags:
--profile string the name of saved credentials
--token string the API token used when calling SAKURA Cloud API
--secret string the API secret used when calling SAKURA Cloud API
--zones strings permitted zone names
--no-color disable ANSI color output
--trace enable trace logs for API calling
--fake enable fake API driver
--fake-store string path to file store used by the fake API driver
--process-timeout-sec int number of seconds before the command execution is timed out
--argument-match-mode string how to compare the argument and resource name when identifying the resource to be manipulated options: [partial/exact]
-v, --version show version info
-h, --help help for usacloud
Use "usacloud [command] --help" for more information about a command.
例えばサーバーに関する操作のusacloud server -h
では起動(boot
)や停止(shutdown
)、作成(create
)や削除(delete
)等が有ります。
>usacloud server -h
Usage:
usacloud server [flags]
usacloud server [command]
Available Commands:
boot
create
delete
list
monitor-cpu
rdp
read
reset
send-nmi
shutdown
ssh
update
vnc
wait-until-ready
wait-until-shutdown
Flags:
-h, --help help for server
Global Flags:
--profile string the name of saved credentials
--token string the API token used when calling SAKURA Cloud API
--secret string the API secret used when calling SAKURA Cloud API
--zones strings permitted zone names
--no-color disable ANSI color output
--trace enable trace logs for API calling
--fake enable fake API driver
--fake-store string path to file store used by the fake API driver
--process-timeout-sec int number of seconds before the command execution is timed out
--argument-match-mode string how to compare the argument and resource name when identifying the resource to be manipulated options: [partial/exact]
-v, --version show version info
Use "usacloud server [command] --help" for more information about a command.
サーバー作成
それではコマンドでサーバーを作成してみましょう。
作成の際にサーバープランやディスクの容量・タイプ等をオプションで選択していきます。
利用可能なオプションについてはusacloud server create -h
で確認出来ます。
作成元のアーカイブのスペックに合わせる形で必須(*required
)となっているパラメータについて値を指定しています。
ソースアーカイブの容量にもよると思いますが、大体5分~15分くらいで作成出来ます。
>usacloud server create --name TestScanServer --cpu 4 --memory 16 --commitment standard --generation default --interface-driver virtio --disk-connection virtio --disk-disk-plan ssd --disk-size 250 --disk-source-archive-id 「ディスクソースとなるアーカイブのID」 --disk-edit-host-name TestScanServer --disk-edit-password 「管理ユーザーログインパスワード」 --disk-edit-ip-address 「設定するIPアドレス」 --disk-edit-netmask 24 --disk-edit-gateway 「ゲートウェイIPアドレス」 --network-interface-upstream 「サーバーが接続するスイッチID(スイッチにつなぐ場合)」 --network-interface-user-ip-address 「設定するIPアドレス」 --zone tk1a
Are you sure you want to create?(y/n) [n]: y
[tk1a] server/create: started...
[tk1a] server/create: 10s elapsed
[tk1a] server/create: 20s elapsed
--name
- サーバー名
--cpu
- 仮想コア数
--memory
- メモリ容量(単位:GB)
--commitment
- プラン選択(通常 or コア占有)
--generation
- 世代?よく分からないので
default
--interface-driver
- インターフェイスドライバ(準仮想化の
virtio
を使用) --disk-connection
- ディスク接続タイプ(準仮想化の
virtio
を使用) --disk-disk-plan
- ディスクタイプ(
ssd
orhdd
) --disk-size
- ディスク容量(単位:GB)
--disk-source-archive-id
- 作成するサーバーの元にするアーカイブのID
- コマンド
usacloud archive list
でアーカイブIDを確認出来る --disk-edit-host-name
- ディスク修正機能にて変更するホスト名
--disk-edit-password
- ディスク修正機能にて変更する管理ユーザーパスワード
--disk-edit-ip-address
- ディスク修正機能にて変更するIPアドレス
--disk-edit-netmask
- ディスク修正機能にて変更するサブネットマスク
--disk-edit-gateway
- ディスク修正機能にて変更するゲートウェイIPアドレス
--network-interface-upstream
- ネットワーク接続先(共有セグメント or 接続するスイッチのID or 接続無し)
--network-interface-user-ip-address
- ネットワークインターフェースに設定するIPアドレス(OSには反映されない)
--zone
- 対象ゾーン指定(
tk1a
は東京第1ゾーン)
しばらく待って作成が完了すると、メッセージと共に作成したサーバーの情報が表示されます。
[tk1a] server/create: done
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
| Zone | ID | Name | Tags | CPU | Memory | GPU | IPAddress | Upstream(Mbps) | InstanceStatus | InstanceHost |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
| tk1a | XXXXXXXXXXXX | TestScanServer | - | 4 | 16 | 0 | XXX.XXX.XXX.XXX/24 | switch/1000 | down | - |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
下記コマンドでもサーバが作成されていることを確認出来ます。
>usacloud server read TestScanServer
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
| Zone | ID | Name | Tags | CPU | Memory | GPU | IPAddress | Upstream(Mbps) | InstanceStatus | InstanceHost |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
| tk1a | XXXXXXXXXXXX | TestScanServer | - | 4 | 16 | 0 | XXX.XXX.XXX.XXX/24 | switch/1000 | down | - |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
下記コマンドでサーバを起動します。
>usacloud server boot TestScanServer
Target resource IDs => [
[tk1a] XXXXXXXXXXXX
]
Are you sure you want to boot?(y/n) [n]: y
[tk1a] server/boot (ID:XXXXXXXXXXXX): started...
[tk1a] server/boot (ID:XXXXXXXXXXXX): 10s elapsed
[tk1a] server/boot (ID:XXXXXXXXXXXX): 20s elapsed
[tk1a] server/boot (ID:XXXXXXXXXXXX): 30s elapsed
[tk1a] server/boot (ID:XXXXXXXXXXXX): 40s elapsed
[tk1a] server/boot (ID:XXXXXXXXXXXX): 50s elapsed
起動したサーバーに対してWindowsのリモートデスクトップで接続します。
事前に用意したアーカイブにてリモートデスクトップトップ設定済みなので、
起動すれば直ぐにつながります。Burpの自動Scan(ActiveScan)実行も問題ありませんでした。
サーバー削除
診断で利用した後は、サーバーを削除します。
さくらのクラウドのサーバー料金計算はサーバー起動時間とサーバーに接続しているディスクの利用時間の金額の合計なので(Windowsは別途ライセンス料等も)、
サーバーを落としていてもディスクが存在する限りはディスク料金が発生します。
ただし、従量課金はきめ細かく時間割り・日割り・月額の少ない方が採用されるので、
使わない時はディスクも含めて削除しておくことで、使い方にもよりますが月額料金よりコストを抑える事が出来ます。
まずは起動しているサーバーを停止します。
>usacloud server shutdown TestScanServer
Target resource IDs => [
[tk1a] XXXXXXXXXXXX
]
Are you sure you want to shutdown?(y/n) [n]: y
[tk1a] server/shutdown (ID:XXXXXXXXXXXX): started...
[tk1a] server/shutdown (ID:XXXXXXXXXXXX): 10s elapsed
[tk1a] server/shutdown (ID:XXXXXXXXXXXX): 20s elapsed
[tk1a] server/shutdown (ID:XXXXXXXXXXXX): 30s elapsed
[tk1a] server/shutdown (ID:XXXXXXXXXXXX): done
停止後、サーバーを削除します。
>usacloud server delete TestScanServer --with-disks
Target resource IDs => [
[tk1a] XXXXXXXXXXXX
]
Are you sure you want to delete?(y/n) [n]: y
[tk1a] server/delete (ID:XXXXXXXXXXXX): started...
[tk1a] server/delete (ID:XXXXXXXXXXXX): 10s elapsed
--with-disks
- サーバーに接続されているディスクも削除
削除した「TestScanServer」が表示されないことを確認します。
>usacloud server read TestScanServer
target resource not found: query=["TestScanServer"]
これでアーカイブを元にしたサーバーの作成から削除までの一連の作業をコマンドのみで実行する事が出来ました。
最後に
いかがだったでしょうか?
今回はサーバ作成のパラメータについて全部コマンドオプションとして渡していましたが、ドキュメントの基本的な使い方ページに載っている様に、--example
オプションでJSONファイルを出力して編集し、コマンド実行時に--parameters
オプションにJSONファイルを渡す形がいいかと思います。
さくらクラウドでの環境構築については、usacloud以外にも直接APIを利用する形やTerraformなどもありますが、usacloudは導入が簡単でコマンドも直感的に理解しやすい形になっているので手軽に使えて便利だと思いました。