Ubuntu 22.04下Vuls漏洞扫描工具:安装、配置与使用教程
引言
Vuls是一个使用Go语言编写的开源、无代理的漏洞扫描工具。它可以自动分析系统上安装的软件的安全漏洞,这对于系统管理员来说,手动在生产环境中完成这项任务是一项繁重的工作。Vuls使用了多个漏洞数据库,包括国家漏洞数据库(NVD)。Vuls占用资源较少,可以同时扫描多个系统并通过邮件或Slack发送报告。它有三种扫描模式(快速、快速Root和深度),您可以根据情况选择。
Vuls并不是一个广泛的IT安全扫描仪;例如,它不监控网络流量,也不能防范暴力登录攻击。然而,Vuls提供了一种自动化Linux软件包漏洞报告的方式。当Vuls使用的数据库收到针对某些漏洞的修复信息时,Vuls也将此修复信息引入其报告中。在生成报告时,Vuls使用数据库中既定的排名系统对最紧急的漏洞进行优先处理。
在本教程中,您将在Ubuntu 22.04服务器上部署Vuls。该过程包括从源代码构建Vuls及其依赖项,配置扫描并将结果报告到Slack,并可选择连接目标机器以启用远程扫描。最终,您将拥有一个自动化的漏洞报告系统,它会提醒您存在的漏洞,并消除手动检查的需要。
先决条件
要完成本教程,您需要:
- 一台至少2GB内存的Ubuntu 22.04服务器,具有root权限和一个辅助的非root账户。您可以按照此初始服务器设置指南进行配置。在本教程中,非root用户名为james。
- 一个您是成员的Slack工作区。要了解如何创建工作区,请访问官方文档。
- (可选)多台运行(最好是)Ubuntu 22.04的服务器,具有root权限和辅助非root账户,如果您想设置Vuls远程扫描它们。在本教程中,辅助账户是james-shark。辅助账户必须配置SSH密钥进行身份验证,您可以按照Vuls产品文档进行操作。
第一步——安装依赖项
在这一部分,您将创建一个文件夹来存储Vuls数据,安装最新版本的Go编程语言,并安装Vuls及其依赖所需的其他软件包。
在这个教程中,您将把与Vuls相关的所有数据存储在/usr/share/vuls-data
目录中。通过运行以下命令来创建该目录:
- sudo mkdir /usr/share/vuls-data
要使其对用户james可访问,请运行以下命令:
- sudo chown -R james /usr/share/vuls-data
您现在已经创建了vuls-data
文件夹,这将成为您的工作区。在继续安装所需的软件包之前,请先更新软件包管理器缓存。
- sudo apt update
为了下载和编译依赖项,您需要安装git、gcc、make、sqlite、debian-goodies和wget。sqlite是一个数据库系统,您将在此处用它来存储漏洞信息。debian-goodies包含checkrestart实用程序,它提供了在任何给定时间点上哪些软件包可以或应该重启的信息。
您可以用一个命令将它们全部安装:
- sudo apt install sqlite git debian-goodies gcc make wget -y
您现在已经安装了所需的软件包,并可以继续安装Go语言以及Vuls将要使用的相关程序。
安装Go
通过运行以下命令,使用snap软件包管理器安装Go:
- sudo snap install go --classic
您使用Snap来安装Go语言,因为它安装的是最新版本的语言,而不像apt可能安装的是旧版本。使用旧版本不推荐,可能会导致您无法完成本教程。
为了使Go工作,需要设置几个环境变量:GOPATH和PATH。GOPATH指定了Go的工作目录。PATH中包含了程序所在的目录,必须扩展该变量以告诉系统如何找到Go本身。
用户每次登录都需要设置这些环境变量。为了自动化此过程,您将在/etc/profile.d
下创建一个名为go-env.sh
的新可执行文件。这将导致每当用户登录时,该目录都会执行。
使用您的文本编辑器创建go-env.sh
文件。
- sudo nano /etc/profile.d/go-env.sh
将以下命令添加到文件中。
export GOPATH=$HOME/go
export PATH=$PATH:$GOPATH/bin:/snap/bin
将给定的环境变量设置为所需的值的是export
命令。在这里,您使用它将GOPATH和PATH设置为适当的值。
保存并关闭文件。
目前,go-env.sh
不可执行。要修复此问题,请运行以下命令将其标记为可执行。
- sudo chmod +x /etc/profile.d/go-env.sh
为了避免需要重新登录,您可以通过运行以下命令重新加载go-env.sh
文件。
- source /etc/profile.d/go-env.sh
使用”source”命令可以重新加载给定的文件到当前shell中,同时保持其状态。
您现在已经安装了Go语言,并设置了其环境变量,并且安装了稍后需要的软件包。接下来,您需要下载并编译Vuls所需的Go程序。这些程序是go-cve-dictionary和goval-dictionary,Vuls用于查询漏洞数据库。
安装并运行go-cve-dictionary
在本部分中,您将下载并编译go-cve-dictionary,这是一个Go软件包,用于访问国家漏洞数据库。然后,您将运行它来获取Vuls可以使用的漏洞数据。NVD是美国政府公开报告的网络安全漏洞的存储库,包含漏洞ID(CVE – 通用漏洞和暴露)、摘要和影响分析,并且以机器可读的格式提供。
Go将存储的包放在$GOPATH/src/
目录下。您可以通过使用子目录扩展此功能以表示包的来源。例如,由用户example-user在GitHub上创建的包将存储在$GOPATH/src/github.com/example-user
下。
您首先需要通过克隆GitHub上的Go软件包并编译它,安装go-cve-dictionary。
按照例子路径先创建一个用来存放的目录。
- mkdir -p $GOPATH/src/github.com/vulsio
通过运行导航到它。
这是文章《如何在Ubuntu 22.04上使用Vuls作为漏洞扫描工具》的第2部分(共5部分)。
- cd $GOPATH/src/github.com/vulsio
现在,您可以通过运行以下命令从GitHub克隆go-cve-dictionary
到您的服务器上:
- git clone https://github.com/vulsio/go-cve-dictionary.git
然后,导航至该软件包的根目录。
- cd go-cve-dictionary
最后,通过运行以下命令进行编译和安装:
- make install
请记住,此命令可能需要一些时间才能完成。
要使其在整个系统中可用,请将其复制到/usr/local/bin
。
- sudo cp $GOPATH/bin/go-cve-dictionary /usr/local/bin
go-cve-dictionary
需要访问一个日志输出目录;默认情况下,该目录位于/var/log/vuls
。通过运行以下命令创建它:
- sudo mkdir /var/log/vuls
目前,日志目录对所有用户都可读。使用以下命令限制访问权限只供当前用户使用。
- sudo chmod 700 /var/log/vuls
将权限标志设置为700
将仅限制访问权限给所有者。
为了使其对Sammy或其他用户可访问,请运行以下命令。
- sudo chown -R james /var/log/vuls
接下来,您将从NVD获取漏洞数据并将其存储在您的Vuls工作区(/usr/share/vuls-data
)中。
- go-cve-dictionary fetch nvd --dbpath /usr/share/vuls-data/cve.sqlite3
这个命令将从2002年到当前年份获取NVD漏洞数据,并将其存储在/usr/share/vuls-data
的数据库中。
注意:
执行此命令可能需要很长时间,并且如果您的服务器内存少于2GB,可能会执行失败。
在这个部分,您下载并安装了go-cve-dictionary
,然后获取了NVD数据供Vuls使用。现在,您将下载并安装goval-dictionary
,然后获取Ubuntu的OVAL数据。
安装和运行goval-dictionary
在本节中,您将下载并编译goval-dictionary
,这是一个Go软件包,可提供对Ubuntu操作系统的OVAL数据库的访问。然后,您将运行它并获取Vuls使用的漏洞数据。OVAL代表开放式漏洞和评估语言(Open Vulnerability and Assessment Language),是一种用于表达检查给定系统上是否存在软件漏洞的开放性语言。
前往$GOPATH/src/github.com/vulsio
路径所在的文件夹。
- cd $GOPATH/src/github.com/vulsio
运行以下命令从GitHub上克隆软件包:
- git clone https://github.com/vulsio/goval-dictionary.git
进入软件包文件夹。
- cd goval-dictionary
使用make
编译并安装它。
- make install
将其复制到/usr/local/bin
目录下,以实现全局访问。
- sudo cp $GOPATH/bin/goval-dictionary /usr/local/bin
然后,通过运行以下命令获取Ubuntu 22的OVAL数据:
- sudo goval-dictionary fetch ubuntu --dbpath=/usr/share/vuls-data/oval.sqlite3 22
在这里,您下载并安装了goval-dictionary
,然后获取了Ubuntu的OVAL数据。接下来,您将下载并安装gost
,并获取Debian安全跟踪器的数据。
安装和运行gost
在本部分中,您将下载并编译gost
,这是一个Go软件包,用于访问Debian安全漏洞跟踪器。然后,您将运行它并获取供Vuls使用的漏洞数据。Ubuntu安全跟踪器收集了有关与Ubuntu一起分发的软件包的漏洞状态的所有信息。
您将会把这个软件包存放在之前的相同目录中。通过运行下面的命令来导航到此目录:
- cd $GOPATH/src/github.com/vulsio
通过运行命令在GitHub克隆该软件包。
- git clone https://github.com/vulsio/gost.git
当它完成时,进入软件包文件夹。
- cd gost
使用make
编译和安装它。
- make install
将其复制到/usr/local/bin
,使其在全局范围内可访问。
这是文章《如何在Ubuntu 22.04上使用Vuls作为漏洞扫描工具》的第3部分(共5部分)。
- sudo cp $GOPATH/bin/gost /usr/local/bin
然后,为gost创建一个日志文件目录。
- sudo mkdir /var/log/gost
使用以下命令限制当前用户的访问权限。
- sudo chmod 700 /var/log/gost
将权限标志设置为700会限制访问仅限于所有者。要使其对Sammy或另一个用户可访问,请运行以下命令:
- sudo chown -R james /var/log/gost
然后,运行命令来获取Ubuntu安全跟踪器的数据。
- gost fetch ubuntu --dbpath=/usr/share/vuls-data/gost.sqlite3
输出可能很长。有可能不会在终端中清除,如果出现这种情况,您可以运行clear
命令。
您刚刚下载并安装了Gost,然后获取了Debian的数据。接下来,您将要下载并安装Vuls。
第二步 – 下载和配置Vuls
当所有依赖都安装完毕后,您将从源代码中下载和编译Vuls。您还将配置它以扫描本地机器。
用以下命令创建一个包含Vuls存储库路径的新目录:
- mkdir -p $GOPATH/src/github.com/future-architect
前往它所在的位置。
- cd $GOPATH/src/github.com/future-architect
通过运行以下命令,从GitHub克隆Vuls仓库:
- git clone https://github.com/future-architect/vuls.git
进入包文件夹。
- cd vuls
通过运行make install
编译并安装它。
- make install
请记住,这个命令可能需要一些时间来完成。
将其复制到/usr/local/bin
目录下,以使其在全局范围内可访问。
- sudo cp $GOPATH/bin/vuls /usr/local/bin
现在,您将为Vuls创建一个配置文件。导航回/usr/share/vuls-data
。
- cd /usr/share/vuls-data
Vuls将其配置存储在一个TOML文件中,您可以将其称为config.toml
。请使用您的文本编辑器创建它。
- sudo nano config.toml
请输入以下配置信息:
/usr/share/vuls-data/config.toml
的中文本地化简洁版本是:配置文件.toml 位于 /usr/share/vuls-data/
目录下。
[cveDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/cve.sqlite3"
[ovalDict]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/oval.sqlite3"
[gost]
type = "sqlite3"
SQLite3Path = "/usr/share/vuls-data/gost.sqlite3"
[servers]
[servers.localhost]
host = "localhost"
port = "local"
scanMode = [ "fast" ]
#scanMode = ["fast", "fast-root", "deep", "offline"]
配置的前两个部分(cveDict
、ovalDict
和gost
)将Vuls指向您刚刚添加的漏洞数据库。servers
部分标记了与服务器相关的信息的开始。各个服务器的信息将被分别分组在不同的部分中。根据这份配置的要求,Vuls将只会扫描本地服务器:localhost
。
Vuls 提供了四种扫描模式:
- 快速模式(Fast mode)(默认):在没有root权限的情况下进行扫描,没有依赖项,对目标服务器的负载非常轻。
- 快速root模式(Fast root mode):使用root权限进行扫描,可以检测到已升级但尚未重启的进程。
- 深度扫描模式(Deep scan mode):与快速root模式相同,但会检查变更日志,这可能导致目标服务器的负载较高。
- 离线模式(Offline mode):在没有互联网访问的情况下扫描机器,可以与其他模式结合使用。
保存并关闭文件。
为了验证配置文件的有效性,请运行以下命令。
- vuls configtest
您将会收到类似这样的输出。
这是文章《如何在Ubuntu 22.04上使用Vuls作为漏洞扫描工具》的第4部分(共5部分)。
[Jan 5 20:24:29] INFO [localhost] vuls-v0.22.0-build-20230105_201926_554ecc4
[Jan 5 20:24:29] INFO [localhost] Validating config...
[Jan 5 20:24:29] INFO [localhost] Detecting Server/Container OS...
[Jan 5 20:24:29] INFO [localhost] Detecting OS of servers...
[Jan 5 20:24:29] INFO [localhost] (1/1) Detected: localhost: ubuntu 22.10
[Jan 5 20:24:29] INFO [localhost] Detecting OS of containers...
[Jan 5 20:24:29] INFO [localhost] Checking Scan Modes...
[Jan 5 20:24:29] INFO [localhost] Checking dependencies...
[Jan 5 20:24:29] INFO [localhost] Dependencies... Pass
[Jan 5 20:24:29] INFO [localhost] Checking sudo settings...
[Jan 5 20:24:29] INFO [localhost] sudo ... No need
[Jan 5 20:24:29] INFO [localhost] It can be scanned with fast scan mode even if warn or err messages are displayed due to lack of dependent packages or sudo settings in fast-root or deep scan mode
[Jan 5 20:24:29] INFO [localhost] Scannable servers are below...
localhost
您已成功配置Vuls,它已检测到可以扫描本地服务器。至此,您已完成Vuls的安装与配置,可以开始扫描本地服务器。在接下来的步骤中,您将运行本地扫描并查看生成的报告。
步骤三:运行本地扫描并查看报告
在这一步中,您将运行本地扫描,然后查看生成的漏洞报告。到目前为止,您仅配置了本地服务器,即Vuls在上一步中已正确检测到的服务器。如果未明确指定,默认的扫描模式是快速模式。
要运行扫描,请执行以下命令:
- vuls scan
输出结果会类似于:
[Jan 5 20:26:14] INFO [localhost] vuls-v0.22.0-build-20230105_201926_554ecc4
[Jan 5 20:26:14] INFO [localhost] Start scanning
[Jan 5 20:26:14] INFO [localhost] config: /usr/share/vuls-data/config.toml
[Jan 5 20:26:14] INFO [localhost] Validating config...
[Jan 5 20:26:14] INFO [localhost] Detecting Server/Container OS...
[Jan 5 20:26:14] INFO [localhost] Detecting OS of servers...
[Jan 5 20:26:14] INFO [localhost] (1/1) Detected: localhost: ubuntu 22.10
[Jan 5 20:26:14] INFO [localhost] Detecting OS of containers...
[Jan 5 20:26:14] INFO [localhost] Checking Scan Modes...
[Jan 5 20:26:14] INFO [localhost] Detecting Platforms...
[Jan 5 20:26:14] INFO [localhost] (1/1) localhost is running on other
[Jan 5 20:26:14] INFO [localhost] Scanning OS pkg in fast mode
[Jan 5 20:26:14] INFO [localhost] Scanning listen port...
[Jan 5 20:26:14] INFO [localhost] Using Port Scanner: Vuls built-in Scanner
Scan Summary
================
localhost ubuntu22.10 695 installed
To view the detail, vuls tui is useful.
To send a report, run vuls report -h.
为了查看Vuls识别到的漏洞报告,请运行以下命令:
- vuls tui
Vuls将报告视图分成四个面板:
- 已扫描机器 (Scanned machines):位于左上方,列出Vuls已扫描的机器。
- 发现的漏洞 (Found vulnerabilities):位于机器列表的右侧,显示Vuls在已安装软件包中发现的漏洞。
- 详细信息 (Detailed information):占据屏幕的左侧部分,显示从数据库中提取的漏洞详细信息。
- 受影响的软件包 (Affected packages):位于详细信息的右侧,显示受影响的软件包版本以及是否有修复版本。

按下回车键可以在每个面板之间循环光标。您可以使用键盘箭头在每个面板内导航。完成后,按下CTRL+C
退出。
在这一步中,您运行了本地扫描并检查了结果。在下一个(可选)章节中,您将配置Vuls来扫描多个目标机器。
第四步:(可选)配置多个目标机器
在这个部分,您将配置Vuls来扫描多台目标机器。这个过程包括在目标机器上配置/etc/sudoers
,并配置Vuls扫描该目标。
只要您有目标服务器的IP地址、目标服务器的root访问权限和一个可用的目标服务器账户(在本教程中为james-shark
),您可以添加任意数量的服务器。
在快速模式下,您只能使用目标服务器上的非root用户账户进行扫描。要启用快速根(fast-root)和深度(deep)扫描模式,您需要编辑目标机器上的/etc/sudoers
文件。sudoers
文件控制哪些用户可以运行哪些命令,以及是否需要密码来运行指定的命令。
visudo
是用于定义访问和特权访问规则的实用程序,只能以root身份运行。由于sudoers
文件的重要性,如果您尝试退出时出现错误,该文件会发出警告。
在目标服务器上,以root身份登录,并通过运行visudo
打开sudoers
文件进行编辑:
- visudo
将此行添加到文件的末尾:
james-shark ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart
此行指示sudo允许用户james-shark
运行apt-get update
、checkrestart
和所有可用的stat
命令,而无需提供密码。
保存并关闭文件。如果在过程中发生语法错误,visudo
会告知您并提供重新编辑或退出的选项。
注意:通过将james-shark
用户添加到sudoers
中,您可以允许Vuls使用快速根权限和深层扫描模式。如果您还想允许本地机器(localhost)使用这些模式,可以在localhost上编辑sudoers
。有关sudoers
的更多信息,请查阅我们的“如何编辑sudoers文件”教程。
Vuls使用checkrestart
工具来检查已更新但需要重新启动的软件包。为了确保目标服务器具备此功能,请在您的辅助服务器上运行以下命令来安装它:
- apt install debian-goodies -y
这就是您在目标服务器上需要做的所有配置。您现在可以注销目标服务器,返回到您的初始服务器上。
要添加一个新的扫描服务器,请打开config.toml
文件,在[servers]
标记下添加以下行:
仅需一个选项:
/usr/share/vuls-data/config.toml
[servers.目标名称]
host = "目标IP"
port = "22"
user = "账户用户名"
keyPath = "/home/james/.ssh/id_rsa"
scanMode = [ "deep" ] # "fast", "fast-root" 或 "deep"
上述内容是用于添加新服务器的模板。请记住将目标名称
替换为您想要的名称,将目标IP
替换为目标服务器的IP地址,将账户用户名
替换为用户名(本教程使用james-shark
),并提供用户james
的私有RSA密钥路径。Vuls不支持SSH密码验证,因此指定keyPath
是必要的。
保存并关闭文件。
接下来,对于每个添加的目标服务器,您将在本地机器上确认RSA密钥。为了实现这一点,您将使用适当的密钥从第一台服务器登录目标服务器,如下所示:
- ssh james-shark@目标IP -i /home/james/.ssh/id_rsa
请记得输入您的私钥文件路径。当询问是否继续连接时,请输入“是”,然后通过按下CTRL + D
退出登录。
注意:
chmod 600 account_rsa_key
将权限设置为600可以确保只有所有者才能读取和写入密钥文件。
运行以下命令来验证新配置的有效性。
- vuls configtest
输出将详细列出Vuls检查的所有内容,如依赖关系、超级用户访问权限和操作系统版本。如果有任何错误,请将您的config.toml
与本节中提供的配置进行对照检查。
在这一步中,您向您的Vuls配置添加了更多服务器,并标记它们用于扫描。在接下来的部分,您将配置Vuls定期扫描并发送报告到一个Slack工作空间。
步骤5 — 配置定时扫描和向Slack报告
您现在将配置Vuls将报告发送到Slack,并设置一个定时任务来定期运行Vuls扫描。
要使用Slack集成,您需要在工作区的Slack上有一个传入的Webhook。传入的Webhooks允许应用程序提供来自其他应用程序的实时信息。在这种情况下,您将配置Vuls以将报告发送到您的Slack频道。
如果您尚未创建Webhook,您首先需要为您的工作区创建一个应用程序。要这样做,首先登录到Slack并导航到Slack的应用创建页面。选择一个您能识别的名称,选择所需的工作区,然后点击“创建应用程序”。
您将会被重定向到新应用的设置页面。在左侧导航栏选择“传入网络钩子”选项。

通过切换标题“启用传入网络挂钩”旁边的开关按钮,将网络挂钩功能开启。

一经激活,页面将加载一个新的部分。滚动到并按下“添加新的Webhook到工作区”的按钮。一个新页面将打开以请求访问您的工作区。选择您想要将报告发送到的频道,然后按下“允许”。
您将被重定向回到Webhooks的设置页面,并且一个新的Webhook现在将显示在Webhook URL下的表格中。点击“复制”以复制该URL,并记下以备后用。
在您初始服务器的终端中,打开config.toml
进行编辑。
- sudo nano config.toml
请在下面添加以下行:
/usr/share/vuls-data/config.toml
-> /usr/share/vuls-data/配置文件.toml
[slack]
hookURL = "您的_hook_URL"
channel = "#您的_频道_名称"
authUser = "您的_用户名"
#notifyUsers = ["@username"]
请将 您的_hook_URL
替换为您记下的Webhook URL,您的_频道_名称
替换为所需频道的名称,您的_用户名
替换为创建Webhook的Slack用户的用户名。保存并关闭文件。
为了测试集成性,您可以通过运行vuls report
来生成报告。
- sudo vuls report -to-slack
漏洞扫描将需要一些时间来运行并退出。如果返回错误,请检查您输入的内容是否与前面的行匹配。
请检查您的Slack应用程序,确认Vuls已成功将报告发送到指定的频道。

现在您已经配置了报告,可以设置定时扫描了。cron是一个基于时间的作业调度程序,与每台Ubuntu机器一起内置。它通过crontab文件进行配置,该文件以精确的语法定义了命令应该何时运行。为了帮助编辑,您将使用crontab实用程序,它会将当前的crontab文件打开到编辑器中。
通过运行以下命令打开当前的crontab文件:
- crontab -e
在提示时,从列表中选择您首选的文本编辑器。
将以下一行内容添加到文件末尾:
0 0 * * * vuls scan -config=/usr/share/vuls-data/config.toml; vuls report -config=/usr/share/vuls-data/config.toml > /dev/null 2>&1
这行命令指示cron在每天午夜(使用cron语法的0 0 * * *
表示)运行Vuls扫描和Vuls报告,使用给定的配置。
保存并关闭文件。
在这个步骤中,您已将Vuls连接到您的Slack工作空间并配置cron,在每天午夜运行Vuls扫描并将结果报告到Slack上。
结论
您已成功在Ubuntu 22.04服务器上设置了自动扫描和报告的Vuls。要获取更多报告选项以及故障排除,请参阅Vuls文档。
使用Vuls可以使生产环境中的漏洞评估变得更加无缝。作为设置cron的替代方案,也可以在持续部署流程中使用Vuls,因为它的扫描工作量轻,可以根据需要运行。您还可以考虑使用Vuls实施防火墙,以限制访问并减少对root访问的需求。