とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
読者登録と各種SNSのフォローもよろしくお願いいたします。

OSSの脆弱性スキャナー「Vuls」を使ってみる

今回は脆弱性スキャナーであるVulsを取り上げます。 弊社内でもVulsを使って本番環境や社内環境のサーバーの脆弱性検査を行い、結果を毎日Slackに通知しています。

Slackやメールで通知するには設定ファイルへの記述が必要です。詳細は以下をご覧ください。

Vulsとは

脆弱性の把握、分析をするためのツールです。 レポートをSlackやメールなどを通じてユーザーに通知することができます。 対象サーバーの脆弱性の検出やレポートの通知はCRONなどを使って自動化できます。

Vulsのインストール方法

Vulsをインストールするには、Dockerコンテナーとして実行する方法とサーバーにインストールする方法があります。 サーバーにインストールする場合は、シェルスクリプトを使う方法とすべて手動でセットアップする方法があります。

install.sh シェルスクリプトを見ると、いくつかのLinixディストリビューションがサポートされていることがわかります。 書かれていないLinuxディストリビューションでVulsを動かしたい場合はマニュアルインストールが必要です。

今回はVulsをUbuntu Server 22.04 LTSで動かすことにしました。なお、Fedora 36 Serverでも同じ流れでセットアップすることで動作を確認できています。

Vulsを実行するための環境のセットアップ

まずはVulsを実行するための環境をセットアップします。 今回はUbuntu Server 22.04 LTSをインストールします。再起動後にアップデートを行っておきます。

Ubuntu Server 22.04ではデフォルトでgitパッケージが入っていたような気がしますが、インストールされていない場合はapt-get install gitでインストールしておきます。

次にキーペアを作っておきます。このキーを使って、ノードにSSSHアクセスして脆弱性検査をサーバーから行います。 パスフレーズはなしでキーペアを作ります。新しいOSではRSA鍵が使えない場合があるので注意してください。

# ssh-keygen -t ed25519  -C "me@example.com"

実行すると、秘密鍵id_ed25519と公開鍵id_ed25519.pubのペアが作成されているはずです。 公開鍵の内容をcatコマンドで確認して、対象サーバーの$HOME/.ssh/authorized_keysにペーストします。

公開鍵認証とパスワード認証が有効化されている環境では、ssh-copy-idコマンドを使うとラクです。

設定後、該当のサーバーに用意した秘密鍵を使ってログインできるようになったことを確認します。

# ssh -i  ~/.ssh/id_ed25519  cloud-user@192.168.0.100
[cloud-user@vuls-test3 ~]$

Vulsのインストール

Dockerコンテナーとして動かすか、ホストにVulsをインストールするかを選択します。 今回はホストにインストールすることにします。

実行するコマンドは次の3つだけです。実行後は処理が終わるのを待ちます。

# git clone https://github.com/vulsio/vulsctl.git
# cd vulsctl/install-host
# bash install.sh

公式のセットアップ手順のドキュメントによると、インストール後は脆弱性DBのデータをダウンロードするために以下を実行するとあります。

# update-all.sh

update-all.sh」の中身を確認するとわかりますが、色々なソースから脆弱性DBをダウンロードするために時間がかかります。 利用していないLinuxディストリビューションがあれば、取り除くと良いでしょう。筆者の場合は「update-select.sh」みたいなファイルを作って、そちらに必要なものを記述して使うことにしました。

# cat update-select.sh
#!/bin/sh

./oval.sh --redhat && \
./oval.sh --debian && \
./oval.sh --ubuntu && \
./oval.sh --oracle && \
./oval.sh --fedora && \
./gost.sh --redhat && \
./gost.sh --debian && \
./gost.sh --ubuntu && \
./cvedb.sh && \
./exploitdb.sh && \
./msfdb.sh && \
./kev.sh && \
./cti.sh

この中のoval.shではLinuxディストリビューションのバージョンが書かれた記述がありました。デフォルトのままだと必要ないバージョンの情報も取得してしまうので、適宜修正します。 筆者の場合は、redhat, debian, ubuntuのバージョン部分を必要なものだけに絞り込みました(注: Fedora 36は未だサポートされていないようです)。

脆弱性DBの情報は頻繁に更新されているので、定期的に更新が必要です。自動化するならcronなどでアップデートすると良さそうですね。

次にVulsモジュールのアップデートを行います。これもそれなりに時間がかかります。

# bash upgrade.sh

Vulsの設定ファイルの作成

次のような内容の設定ファイルを作成します。今回は通知関連の設定は記述していません。 設定ファイルの内容はAnsibleのhostsファイルみたいな感じですね。

ポートと秘密鍵は同じものを使う前提で書いています。サーバーごとに違う場合はdefaultではなく個別に指定します。

[default]
port = "22"
keyPath     = "/root/.ssh/id_ed25519"

[servers]

[servers.ubuntu]
host         = "172.16.214.188"
user        = "ubuntu"

[servers.rocky]
host         = "172.16.214.182"
user        = "rocky"

[servers.oracle]
host         = "172.16.214.190"
user        = "cloud-user"

Vulsの実行

早速、実行してみます。OSによってサマリ情報に出てくる内容は異なります。

# vuls scan
[Aug 18 03:08:42]  INFO [localhost] vuls-v0.20.0-build-20220817_090203_1e45732
[Aug 18 03:08:42]  INFO [localhost] Start scanning
[Aug 18 03:08:42]  INFO [localhost] config: /root/vulsctl/install-host/config.toml
[Aug 18 03:08:42]  INFO [localhost] Validating config...
...
Scan Summary
================
ubuntu  ubuntu20.04 591 installed              
rocky   rocky8.6    418 installed, 38 updatable
oracle  oracle8.6   343 installed              

To view the detail, vuls tui is useful.
To send a report, run vuls report -h

次にレポートを表示してみます。

# vuls report

rocky (rocky8.6)
================
Total: 137 (Critical:7 High:43 Medium:84 Low:3 ?:0)
10/137 Fixed, 39 poc, 0 exploits, cisa: 0, uscert: 0, jpcert: 0 alerts
418 installed

+----------------+------+--------+-----+-----------+---------+--------------------------------+
|     CVE-ID     | CVSS | ATTACK | POC |   ALERT   |  FIXED  |            PACKAGES            |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-1292  |  9.8 |  AV:N  | POC |           |   fixed | openssl, openssl-libs          |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-1927  |  9.8 |  AV:L  | POC |           |   fixed | vim-minimal                    |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-2068  |  9.8 |  AV:L  |     |           |   fixed | openssl, openssl-libs          |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-27404 |  9.8 |  AV:N  | POC |           | unfixed | freetype                       |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-37434 |  9.8 |  AV:N  | POC |           | unfixed | rsync, zlib                    |
+----------------+------+--------+-----+-----------+---------+--------------------------------+
| CVE-2022-1012  |  9.1 |  AV:N  |     |           |   fixed | kernel, kernel-core,           |
...

デフォルトの出力はサマリー情報のあと、表形式でパッケージの脆弱性情報がそれぞれ出力されます。 最初のサマリーだけが欲しい場合は、例えば次のようなオプションを指定して実行します。

# vuls report -format-one-line-text
...
One Line Summary
================
oracle  Total: 25 (Critical:4 High:21 Medium:0 Low:0 ?:0)       25/25 Fixed     343 installed   13 poc  0 exploits  cisa: 0, uscert: 0, jpcert: 0 alerts
rocky   Total: 137 (Critical:7 High:43 Medium:84 Low:3 ?:0)     10/137 Fixed    418 installed   39 poc  0 exploits  cisa: 0, uscert: 0, jpcert: 0 alerts
ubuntu  Total: 163 (Critical:10 High:89 Medium:59 Low:5 ?:0)    18/163 Fixed    591 installed   80 poc  0 exploits  cisa: 0, uscert: 3, jpcert: 0 alerts

設定さえしておけば、vuls reportコマンドに-to-email-to-slack-to-chatwork-to-googlechatのようなオプションをつけて実行することで、それぞれに結果を飛ばすことができるようです。その他にも色々オプションがあるので、適宜指定して実行します。

脆弱性情報を一覧で表示するなら、vuls tuiコマンドを実行します。終了する場合は「CTRL+C」キーを入力します。

操作方法については次に書かれています。

vuls.io

脆弱性が見つかったパッケージ、修正されたバージョン、脆弱性の詳細情報、公開されたPoCについての情報などを確認できます。

まとめ

Vulsは脆弱性スキャナーとしてはかなり便利なツールです。 ではこれをどうCI/CDパイプラインに組み込むかというところですが、CI/CDではアプリケーション実行環境はコンテナーで動かすことが大半なので、 コンテナーのイメージやDockerfile、アプリケーションの脆弱性チェックは以前に取り上げたTrivyなどを使い、

一方、これらを動かすコンテナ実行環境(ホストOSレイヤー)では、Vulsを使うといった使い分けになると思います(現在のVulsはコンテナスキャン周りの実装はなくなっています)。 実行環境を自分で構築せずにSaaSのサービスを使っている場合は特にVulsの利用はなくてもいいかなと思います。

とはいえ、Vulsは結構簡単に動かすことができるので、現在どのような脆弱性が見つかっているのか、管理する環境にどのような脆弱性が見つかっているのか把握する際に便利だと感じました。 自分で全部の情報を収集するのは大変ですからね。

自分でVulsをメンテするのが大変なら、商用サービスもあるようです。

vuls.biz

ブログ記事も、ノウハウとか色々書かれていて有益です。

vuls.biz