脆弱性スキャナー「Vuls」による脆弱性収集

■導入

現在、弊社ではOSSサポートサービスの一環として、取り扱いのある主要なプロダクトの更新情報及び脆弱性情報をまとめ、「OSS-News」として毎月情報配信を行っています。

こちらはコミュニティやNVDなどからの情報収集をすべて手作業で行っているため、時間や労力がかかる上にミスも起きやすいような状況となっています。

そこで、コチの記事で取り上げたVuls(Vulnerability Scanner)のレポート機能やVuls Repoなどを利用して脆弱性情報の収集を効率化できないかと考え、環境を改めて構築し検討を行いました。

■環境

Vulsサーバリモートスキャン対象のサーバ
OSAlmaLinux 9.4AlmaLinux 9.2
IP10.14.210.2010.14.210.33

■構築の流れ

  • Vulsのインストール
  • Vuls Repoのインストール
  • リモートスキャンサーバの設定
  • スキャンとレポートの作成
  • cronの登録

■構築方法

Vulsのインストール

  • ユーザの作成

sudo権限を付与するためにVuls用のユーザを「wheel」グループに所属させます。

# useradd vuls -G wheel
# passwd vuls
  • 必要パッケージのインストール

Vulsをインストールする際にはGitのクローンなどを行うためそういった必要になるパッケージをインストールします。

# dnf install -y git dnf-utils
  • Vulsインストーラのgitをクローン

Vulsのセットアップ簡略化のためにコミュニティによってVulsctlが作成されているのでこちらをクローンします。

# su - vuls
$ git clone https://github.com/vulsio/vulsctl.git
※RockyLinux、AlmaLinuxの場合は、install.shを編集する
$ vi vulsctl/install-host/install.sh
        "rhel" | "centos")
        ↓
        "rhel" | "centos" | "rocky" | "almalinux")
  • インストール

Vulsインストール用のスクリプトファイルをカレントディレクトリにコピーしインストールを行います。

$ cp -p vulsctl/install-host/* .
$ sudo ./install.sh
  • 脆弱性データベースのアップデート

Vulsのスキャン時に使用する脆弱性データべースを最新のものへとアップデートを行います。尚、デフォルトでは様々なOS向けの脆弱性情報が含まれていますが、スクリプトの該当行を削除するなどして不要な情報の削減が可能です。

$ ./update-all.sh
  • ローカルサーバをスキャンする為の設定ファイルを作成
$ cat << EOF | tee config.toml
[servers]

[servers.localhost]
host = "localhost" 
port = "local" 
EOF
  • コンフィグテスト
$ vuls configtest
  • スキャン実行
$ vuls scan
  • レポート作成
$ vuls report
  • レポート確認

Vulsでは以下のコマンドによってターミナルベースでレポートの確認が可能です。

$ vuls tui

Vuls Repoのインストール

  • Vuls Repoのgitをクローン
$ cd
$ sudo git clone https://github.com/ishiDACo/vulsrepo.git
  • Vuls Repoの設定ファイル作成
$ cd vulsrepo/server
$ cat << EOF | sudo tee vulsrepo-config.toml

[Server]
rootPath = "/home/vuls/vulsrepo" 
resultsPath  = "/home/vuls/results" 
serverPort  = "5111" 
EOF
  • ユニットファイル作成

systemdで管理できるようにユニットファイルを作成します。

$ sudo cp -p /home/vuls/vulsrepo/server/scripts/vulsrepo.service /lib/systemd/system/vulsrepo.service
$ sudo vi /lib/systemd/system/vulsrepo.service

[Unit]
Description=vulsrepo daemon
Documentation=https://github.com/ishiDACo/vulsrepo

[Service]
ExecStart = /home/vuls/vulsrepo/server/vulsrepo-server
ExecRestart = /bin/kill -WINCH ${MAINPID} ; /home/vuls/vulsrepo/server/vulsrepo-server
ExecStop = /bin/kill -WINCH ${MAINPID}
Restart = no
Type = simple
User = vuls
Group = vuls

[Install]
WantedBy = multi-user.target
  • 自動起動設定
$ sudo systemctl daemon-reload
$ sudo systemctl enable --now vulsrepo
$ sudo systemctl status vulsrepo
$ ss -nltup
  • Firewall設定

Vuls Repoの設定ファイルで指定したポートの開放を行います。

$ sudo firewall-cmd --add-port=5111/tcp --permanent
$ sudo firewall-cmd --reload
  • ブラウザアクセス確認

ブラウザにて以下のような画面が確認できればOKです。

リモートスキャンサーバの設定

※以下リモートスキャン対象のサーバを対象サーバと呼称。

Vulsサーバ側作業

  • SSHキーを作成(パスフレーズなし)

Vulsは対象サーバにSSH接続してスキャンを行うため、その時に使用する鍵を作成します。

$ ssh-keygen -t rsa
$ cat ~/.ssh/id_rsa.pub
※公開鍵の内容をコピーする。

対象サーバ側作業

  • 必要パッケージインストール
# dnf install dnf-utils
  • ユーザの作成
# useradd vuls
# passwd vuls
  • 公開鍵登録

対象サーバに認証済みの鍵としてさきほどVulsサーバ側で作成した公開鍵を登録します。

# su - vuls
$ mkdir ~/.ssh
$ chmod 700 ~/.ssh
$ touch ~/.ssh/authorized_keys
$ chmod 600 ~/.ssh/authorized_keys
$ vi ~/.ssh/authorized_keys
※先ほどコピーした公開鍵を張り付け

Vulsサーバ側作業

  • 対象サーバにSSHログインして、$HOME/.ssh/known_hostsに登録
$ ssh -i ~/.ssh/id_rsa vuls@10.14.210.14
  • config.tomlへ対象サーバ情報を追記
$ vi config.toml

[servers.client_hostname]
host = "10.14.210.14"
port = "22"
user = "vuls"
keyPath = "/home/vuls/.ssh/id_rsa"

※[]内はFQDNではない。「.」を含むホスト名等を入れるとエラーになる。
  • コンフィグテスト
$ vuls configtest client_hostname
※引数はconfig.tomlに記載した[servers.client_hostname]の"client_hostname"の部分

スキャンとレポートの作成

  • スキャン実行
$ vuls scan
※引数にconfig.tomlに記載した[servers.client_hostname]の"client_hostname"の部分を引数として追加して対象を指定することが可能
  • レポート作成
$ vuls report
  • レポート確認

Vuls Repoでは作成したレポートを以下のようにブラウザベースで確認することができます。

cron登録

脆弱性データベースのアップデートとスキャン、レポート作成をcronに登録し定期的に実行することで、最新の状況をVuls Repoにて確認できるようになります。

# crontab -e -u vuls
PATH=/home/vuls/.local/bin:/home/vuls/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
0 0 * * * cd /home/vuls/; ./update-all.sh && /usr/local/bin/vuls scan -quiet && /usr/local/bin/vuls report -quiet

■Vulsを利用した脆弱性情報収集についての検討事項


上記で環境の構築が完了しましたので、次は実際にVuls RepoをOSS-Newsに活かした利用が可能であるかといったことを調査しました。

しかし結論から言うと、Vuls Repoでは現在サーバにインストールされているプロダクトに対し、該当するバージョンで影響の可能性がある脆弱性のみ表示されるため、発表されている脆弱性情報をすべて収集するなどのOSS-Newsに活かした利用はできないということがわかりました。

実際に行った調査の内容は以下の通りです。

まず、DNSサーバとして攻撃対象となることも多く、脆弱性がクリティカルなものになりやすいといった点から、監視対象のサーバにISC BINDをインストールし、Vuls Repoにて確認できる脆弱性を調査しました。

  • 調査対象サーバ毎のBINDインストール情報
調査対象サーバ①調査対象サーバ②
OSAlmaLinux 9.2AlmaLinux 8.5
bindバージョンbind-9.16.23-11.el9bind-9.11.26-6.el8

その結果、Vuls Repoではプルダウン選択によってサーバ毎に脆弱性情報の確認を行うことが可能なのですが、調査対象サーバ①を選択した時と調査対象サーバ②を選択した時では表示される脆弱性情報が異なることがわかりました。

それぞれのサーバで表示されなかった脆弱性は以下の通りです。

調査対象サーバ①調査対象サーバ②
共通脆弱性識別子CVE-2022-38178
CVE-2022-38177
CVE-2022-3094
など
CVE-2023-6516
CVE-2023-5679
CVE-2023-5517
など

次に、これらがなぜ一方では表示されなくなったのかを調査したところ、どうやら影響のあるバージョンによって表示の有無が変化するということがわかりました。

例えば、調査対象サーバ①で表示されなかったCVE-2022-3094ですが、コミュニティで影響のあるバージョンは以下のように記載しています。[参考情報(1)]

  • 9.16系: 9.16.0 から 9.16.36
  • 9.18系: 9.18.0 から 9.18.10
  • 9.19系: 9.19.0 から 9.19.8
  • 9.11.37 より前のバージョンは未調査だが、9.11系の全バージョンが脆弱である可能性あり。さらに古いバージョンも脆弱である可能性あり。

そのため調査対象の両サーバとも該当のバージョンのように思えますが、Red Hat Customer Portalによると「bind-9.11.36-11.el8」にてこの脆弱性は修正されており、調査対象サーバ①では「bind-9.16.23-11.el9」とこれより新しいバージョンのパッケージを利用していたため表示されなかったものと思われます。[参考情報(2)]

これは、CVE-2023-6516などの調査対象サーバ②で表示されなかった脆弱性についても同様であることを確認しました。

よって上記のことから、発表されている脆弱性情報をすべて収集したいといった要件を満たすのは難しく、OSS-Newsでの脆弱性情報収集に活かすことはできないということがわかりました。

■まとめ

今回は残念な結果となりましたが、既存サーバに潜在する脆弱性情報を収集するという点において「Vuls」はとても便利なツールかと思われますので、現在のセキュリティリスクを確認する意味でも利用を検討してみてはいかがでしょうか。

[参考情報] (2024/07/18執筆時点)

(1) ISC - BIND 9 Security Advisories- CVE-2022-3094
(2) Red Hat Customer Portal - RHSA-2023:7177 - Security Advisory

お問い合わせ

弊社では様々なサービスを取り扱っております。
詳細はサービス一覧からご覧ください。

お気軽にお問い合わせください。応対時間 9:30-17:30 [ 土・日・祝日除く ]

お問い合わせ
  • X