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