脆弱性スキャナ [Vuls] のinstallと使い方 @ RedHat系(CentOS,Rocky,Alma Linux) | SEの道標
サーバセキュリティ

脆弱性スキャナ [Vuls] のinstallと使い方 @ RedHat系(CentOS,Rocky,Alma Linux)

vuls の概要

vuls とは、Linux に特化した脆弱性スキャナです。サーバ内にどんな脆弱性が内包されているか、検知された脆弱性がそれぞれどのくらいのリスクなのか (CVSS の基本値) や PoC (攻撃コード) が公開されているか、等をレポートとして表示してくれます。攻撃コードについては exploit-db の情報が使われます。

Main Features · Vuls
## Scan for any vulnerabilities in Linux...

Windows サーバはスキャンできません。

今回やりたいこと

今回は Rocky Linux 8.5 (minimal install) に vuls をインストールし、リモートにある古い CentOS 7.0.1406 (minimal install) に対して Deep スキャンを試みます。(2021.12.29 現在、Deep Scan と Fast-root Scan は同じだそうです。)

一般ユーザ権限で ssh 接続し、sudo で root 権限で中を見ていくため、/etc/sudoers に設定追加されている必要があります。また、スキャン対象サーバには yum-utils と lsof がインストールされている必要があります。

構成は以下の通り。

vuls インストール手順

必要なパッケージインストール

[root@vulssv ~]# dnf install -y git dnf-utils tar

グループとユーザ作成

グループ vuls を新規作成、さらにユーザ vuls を新規作成し、sudo 可能な wheel に所属させ、パスワードも変更します。

[root@vulssv ~]# groupadd vuls
[root@vulssv ~]# useradd vuls -g vuls -G wheel
[root@vulssv ~]# passwd vuls

vuls ユーザになり git からダウンロード、インストール

[root@vulssv ~]# su - vuls
[vuls@vulssv ~]$ git clone https://github.com/vulsio/vulsctl.git
[vuls@vulssv ~]$ mv vulsctl/install-host/* .
[vuls@vulssv ~]$ sudo bash ./install.sh

RHEL や CentOS の場合は問題ありませんが、rocky の場合は以下のようにダメだと言われます。

"rocky" is not supported distro, so please install packages manually.

とはいえ Rocky も RedHat 系ですし、そもそも vuls の Supported OS の中にしっかり Rocky Linux 8 が含まれています。install.sh の最後のあたりに rhel centos が並んでいるのでここに rocky も追加すればいけます。Almalinux もここだけ変えれば行けそうな気がしますね。

[vuls@vulssv ~]$ vi install.sh
 ⇒ "rhel" | "centos") の行を "rhel" | "centos"| "rocky") に変更
[vuls@vulssv ~]$ sudo bash ./install.sh

まあまあ時間かかります。

ややこしいことに、/root の配下に go ディレクトリが作成され、この配下に脆弱性データベースの情報などが格納されます。

脆弱性データベースのアップデート

日々更新される脆弱性データベースを最新版にしたい場合は update-all.sh を実行します。これは初回時にも必要です。

[vuls@vulssv ~]$ ./update-all.sh

かなり時間かかります。途中で止まったように感じますが耐えます。プロンプトが戻れば準備は完了です。

試しにローカルホストをスキャンしてみる

スキャンを行うコマンドは vuls scan ですが、その前に config.toml という設定ファイルにスキャンするサーバの情報を記入する必要があります。

[vuls@vulssv ~]$ cat << EOF | tee config.toml
[servers]

[servers.localhost]
host = "localhost"
port = "local"
EOF

[vuls@vulssv ~]$ vuls scan
[vuls@vulssv ~]$ vuls report
[vuls@vulssv ~]$ vuls tui

以下のように表示されればOKです。

リモートサーバへのスキャンの準備

vulssv の vuls ユーザで SSH 鍵ペア生成

まずは vulssv 側で vuls ユーザにて ssh 鍵ペアを作成します。(リモートサーバ centos ではなく、vulssv 側の作業です。)

[vuls@vulssv ~]$ ssh-keygen -t rsa
: (全て空欄で Enter)

次に、公開鍵のほう (id_rsa.pub) をコンソール (TeraTerm 等コピペできるもの) に表示します。

[vuls@vulssv ~]$ cat .ssh/id_rsa.pub

表示された文字列をコピーします。

リモートサーバ centos に vuls ユーザを作成し公開鍵をセット

次は、リモートサーバ centos 側で作業をします。まずは vuls ユーザを作成します。

[root@centos ~]# useradd vuls
[root@centos ~]# passwd vuls

そして vuls ユーザで公開鍵認証をするため、先ほどの公開鍵をセットします。

[root@centos ~]# su - vuls
[vuls@centos ~]$ mkdir -m 700 .ssh
[vuls@centos ~]$ vi .ssh/authorized_keys
(先ほどコピーした公開鍵文字列を張り付け)
[vuls@centos ~]$ chmod 600 .ssh/authorized_keys

vulssv から centos へ ssh 公開鍵認証で接続

-i オプションで秘密鍵 (id_rsa) を指定して接続します。

[vuls@vulssv ~]$ ssh vuls@192.168.1.14 -i .ssh/id_rsa
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes

ip a や hostname 等のコマンドで centos へ接続できていることを確認します。

centos で sudoers の設定

centos にて vuls ユーザに対する /etc/sudoers 設定を追加 (コマンドとしては visudo で編集) します。以下を参考。

configtest · Vuls
```bash
[root@centos ~]# visudo
(最終行に以下を追記し、:wq)
vuls ALL=(ALL) NOPASSWD:SETENV: /usr/bin/stat, /usr/bin/needs-restarting, /usr/bin/which, /bin/ls -l /proc/*/exe, /bin/cat /proc/*/maps, /usr/sbin/lsof -i -P -n

vulssv 側で config.toml にリモートサーバ情報を追加

[vuls@vulssv ~]$ cat << EOF | tee config.toml
[servers]

[servers.centos]
host = "192.168.1.14"
port = "22"
user = "vuls"
keyPath = "/home/vuls/.ssh/id_rsa"
scanMode = ["deep"]
EOF

[vuls@vulssv ~]$ vuls scan centos
[vuls@vulssv ~]$ vuls report
[vuls@vulssv ~]$ vuls tui

vulsrepo でレポートを WebUI で見る

レポートを WebUI で見るためには vulsrepo をインストールし、vulsrepo-config.toml を設定します。

[vuls@vulssv ~]$ cd /opt
[vuls@vulssv opt]$ sudo git clone https://github.com/ishiDACo/vulsrepo.git
[vuls@vulssv opt]$ cd vulsrepo/server
[vuls@vulssv server]$ cat << EOF | sudo tee vulsrepo-config.toml
[Server]
rootPath = "/opt/vulsrepo"
resultsPath  = "/home/vuls/results"
serverPort  = "5111"
EOF

次に、自動起動するようにします。

[vuls@vulssv ~]$ cat << EOF | sudo tee /etc/systemd/system/vulsrepo.service
[Unit]
Description=vulsrepo daemon
Documentation=https://github.com/ishiDACo/vulsrepo

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

[Install]
WantedBy = multi-user.target
EOF

[vuls@vulssv ~]$ sudo systemctl daemon-reload
[vuls@vulssv ~]$ sudo systemctl enable --now vulsrepo

状態を確認します。vulsrepo が起動しているか、port 5111/tcp が Listen になっているかを見ます。

[vuls@vulssv ~]$ sudo systemctl status vulsrepo
[vuls@vulssv ~]$ sudo ss -nltup

これで OK なら firewalld を開けます。

[vuls@vulssv ~]$ sudo firewall-cmd --add-port=5111/tcp --permanent
[vuls@vulssv ~]$ sudo firewall-cmd --reload

これでブラウザで http://:5111 へアクセスしてみましょう。以下のように表示されます。

例えば最新のレポートだけにチェックを入れて Submit をクリックすると、以下のようにレポートが表示されます。

運用

vuls のバージョンアップ

インストール済の vuls を最新バージョンにしたい場合は upgrade.sh を実行しますが、例によって rocky を追加します。

[vuls@vulssv ~]$ vi upgrade.sh

"ubuntu" | "debian" | "pop" | "raspbian" | "rhel" | "centos") の最後の括弧閉じの前に | "rocky" を入れます。

そして upgrade.sh を実行しますが、環境変数など色々の問題により、以下の手順になりました。

[vuls@vulssv ~]$ cat << EOF | sudo tee -a /etc/profile.d/goenv.sh
export GOROOT=/usr/local/go
export GOPATH=/root/go
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin
EOF

[vuls@vulssv ~]$ source /etc/profile.d/goenv.sh
[vuls@vulssv ~]$ sudo -s
[root@vulssv vuls]# ./upgrade.sh

コメント

タイトルとURLをコピーしました