今回は脆弱性スキャナーである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」キーを入力します。
操作方法については次に書かれています。
脆弱性が見つかったパッケージ、修正されたバージョン、脆弱性の詳細情報、公開されたPoCについての情報などを確認できます。
まとめ
Vulsは脆弱性スキャナーとしてはかなり便利なツールです。 ではこれをどうCI/CDパイプラインに組み込むかというところですが、CI/CDではアプリケーション実行環境はコンテナーで動かすことが大半なので、 コンテナーのイメージやDockerfile、アプリケーションの脆弱性チェックは以前に取り上げたTrivyなどを使い、
一方、これらを動かすコンテナ実行環境(ホストOSレイヤー)では、Vulsを使うといった使い分けになると思います(現在のVulsはコンテナスキャン周りの実装はなくなっています)。 実行環境を自分で構築せずにSaaSのサービスを使っている場合は特にVulsの利用はなくてもいいかなと思います。
とはいえ、Vulsは結構簡単に動かすことができるので、現在どのような脆弱性が見つかっているのか、管理する環境にどのような脆弱性が見つかっているのか把握する際に便利だと感じました。 自分で全部の情報を収集するのは大変ですからね。
自分でVulsをメンテするのが大変なら、商用サービスもあるようです。
ブログ記事も、ノウハウとか色々書かれていて有益です。