usacloudでさくらクラウド環境に脆弱性診断環境を構築する

はじめに
---
こんにちは、株式会社シーエー・アドバンス技術統括本部の@sk888です。


今回はさくらクラウドの公認CLIクライアントのusacloudを使用して、コマンド一発でさくらクラウド環境に脆弱性診断環境(BurpSuite実行環境)を構築したり、消したりする事をやってみようと思います。

usacloudとは
---
オープンソースで開発されているさくらクラウドの公認CLIクライアントです。
さくらクラウド環境の操作を、Web管理画面ではなく手元の環境からCLIで実施できるようになります。
Windows、Linux、macOSで利用可能で、Dockerの実行用イメージもあるようです。


https://github.com/sacloud/usacloud

https://docs.usacloud.jp/usacloud/

<br>ちょっと古いですが、さくらのナレッジにも記事があります。

https://knowledge.sakura.ad.jp/10875/

https://knowledge.sakura.ad.jp/11233/




やりたいこと
---
脆弱性診断ではBurpSuiteなどの診断ツールによる自動Scan(ActiveScan)を実施すると思いますが、手元のPCでScanを行っているとCPUやメモリ、ディスクのリソースが割かれますし、最近はコロナの影響によるリモートワークで会社と自宅を行き来する等、会社にScan中のPCを置いたままに出来ないなどの事情がありました。
そんな時に、コマンド一発でクラウド上に自動Scan環境を立てられれば、手元では別の作業も出来るしとても便利だなと思いました。


環境・事前準備
---
「PC」
windows10 PRO

:::note info
事前準備として、さくらクラウド環境上にubuntu22.04によるリモートデスクトップ環境を構築し、BurpSuiteなどのツールを導入してアーカイブ化してあります。

また、下記サイトを参考にさくらクラウドWebコンソール上でAPIキーを作成しておく必要が有ります。
:::

https://manual.sakura.ad.jp/cloud/api/apikey.html#id7




usacloud導入
---
先ずは[導入ガイド](https://docs.usacloud.jp/usacloud/installation/start_guide/)を参考に手元のPCにusacloudをインストールします。
Windowsはchocolateyでインストール出来ますが、今回はその他の手段として実行用バイナリファイルを使用します。
[GitHub Releases](https://github.com/sacloud/usacloud/releases/tag/v1.10.2)ページからWindows用のZIPファイル「usacloud_windows-amd64.zip」をダウンロードして展開し、任意のフォルダー内に配置します。
配置先のフォルダーを環境変数Pathに追加します。

コマンドプロンプトを起動して、`usacloud -v`を打つことでバージョン情報を確認出来ます。
```console
>usacloud -v
1.10.2 windows/amd64, build 74947b18
```

`usacloud config`コマンドで事前準備で作成したアクセストークン・シークレット等を入力します。
操作対象のゾーンとコマンド実行時のデフォルトの出力形式も入力します。
```console
>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

```

コマンドリファレンス
---
コマンドについては、日本語ドキュメントのページに基本的な利用方法やリファレンスが載っています。

https://docs.usacloud.jp/usacloud/guides/basic_usage/


基本的な構文は下記の様になっていて、各コマンドやオプション、引数の部分で`--help` or `-h`を打つことで利用可能なものを確認出来ます。

```console
>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`)等が有ります。

```console
>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`)となっているパラメータについて値を指定しています。
ソースアーカイブの容量にもよると思いますが、大体５分～１５分くらいで作成出来ます。

```console
>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
```

<dl>
  <dt><code>--name</code></dt>
  <dd>サーバー名</dd><br>
  <dt><code>--cpu</code></dt>
  <dd>仮想コア数</dd><br>
  <dt><code>--memory</code></dt>
  <dd>メモリ容量(単位：GB)</dd><br>
  <dt><code>--commitment</code></dt>
  <dd>プラン選択(通常 or コア占有)</dd><br>
  <dt><code>--generation</code></dt>
  <dd>世代？よく分からないので<code>default</code></dd><br>
  <dt><code>--interface-driver</code></dt>
  <dd>インターフェイスドライバ(準仮想化の<code>virtio</code>を使用)</dd><br>
  <dt><code>--disk-connection</code></dt>
  <dd>ディスク接続タイプ(準仮想化の<code>virtio</code>を使用)</dd><br>
  <dt><code>--disk-disk-plan</code></dt>
  <dd>ディスクタイプ(<code>ssd</code> or <code>hdd</code>)</dd><br>
  <dt><code>--disk-size</code></dt>
  <dd>ディスク容量(単位：GB)</dd><br>
  <dt><code>--disk-source-archive-id</code></dt>
  <dd>作成するサーバーの元にするアーカイブのID</dd>
  <dd>コマンド<code>usacloud archive list</code>でアーカイブIDを確認出来る</dd><br>
  <dt><code>--disk-edit-host-name</code></dt>
  <dd>ディスク修正機能にて変更するホスト名</dd><br>
  <dt><code>--disk-edit-password</code></dt>
  <dd>ディスク修正機能にて変更する管理ユーザーパスワード</dd><br>
  <dt><code>--disk-edit-ip-address</code></dt>
  <dd>ディスク修正機能にて変更するIPアドレス</dd><br>
  <dt><code>--disk-edit-netmask</code></dt>
  <dd>ディスク修正機能にて変更するサブネットマスク</dd><br>
  <dt><code>--disk-edit-gateway</code></dt>
  <dd>ディスク修正機能にて変更するゲートウェイIPアドレス</dd><br>
  <dt><code>--network-interface-upstream</code></dt>
  <dd>ネットワーク接続先(共有セグメント or 接続するスイッチのID or 接続無し)</dd><br>
  <dt><code>--network-interface-user-ip-address</code></dt>
  <dd>ネットワークインターフェースに設定するIPアドレス(OSには反映されない)</dd><br>
  <dt><code>--zone</code></dt>
  <dd>対象ゾーン指定(<code>tk1a</code>は東京第１ゾーン)</dd><br>
</dl>

しばらく待って作成が完了すると、メッセージと共に作成したサーバーの情報が表示されます。

```console
[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           | -            |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
```
<br>
下記コマンドでもサーバが作成されていることを確認出来ます。

```console
>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           | -            |
+------+--------------+----------------+------+-----+--------+-----+--------------------+---------------------+----------------+--------------+
```

<br>
下記コマンドでサーバを起動します。

```console
>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

```
<br>
起動したサーバーに対してWindowsのリモートデスクトップで接続します。

事前に用意したアーカイブにてリモートデスクトップトップ設定済みなので、
起動すれば直ぐにつながります。Burpの自動Scan(ActiveScan)実行も問題ありませんでした。

![スクリーンショット 2022-12-14 013003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/255483/2356ce86-1b28-c47e-20a8-eba9021e1fd3.png)
 

サーバー削除
---
診断で利用した後は、サーバーを削除します。
さくらのクラウドのサーバー料金計算はサーバー起動時間とサーバーに接続しているディスクの利用時間の金額の合計なので(Windowsは別途ライセンス料等も)、
サーバーを落としていてもディスクが存在する限りはディスク料金が発生します。
ただし、従量課金はきめ細かく時間割り・日割り・月額の少ない方が採用されるので、
使わない時はディスクも含めて削除しておくことで、使い方にもよりますが月額料金よりコストを抑える事が出来ます。
<br>
まずは起動しているサーバーを停止します。

```console
>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
```
<br>
停止後、サーバーを削除します。

```console
>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
```
<dl>
  <dt><code>--with-disks</code></dt>
  <dd>サーバーに接続されているディスクも削除</dd><br>
</dl>
<br>
削除した「TestScanServer」が表示されないことを確認します。

```console
>usacloud server read TestScanServer

target resource not found: query=["TestScanServer"]
```
<br>
これでアーカイブを元にしたサーバーの作成から削除までの一連の作業をコマンドのみで実行する事が出来ました。


最後に
---
いかがだったでしょうか？
今回はサーバ作成のパラメータについて全部コマンドオプションとして渡していましたが、ドキュメントの基本的な使い方ページに載っている様に、`--example`オプションでJSONファイルを出力して編集し、コマンド実行時に`--parameters`オプションにJSONファイルを渡す形がいいかと思います。
さくらクラウドでの環境構築については、usacloud以外にも直接APIを利用する形やTerraformなどもありますが、usacloudは導入が簡単でコマンドも直感的に理解しやすい形になっているので手軽に使えて便利だと思いました。