如何在Ubuntu 22.04上使用Vuls作为漏洞扫描工具
引言
Vuls是一个使用Go语言编写的开源、无代理的漏洞扫描工具。它可以自动分析系统上安装的软件的安全漏洞,这对于系统管理员来说手动在生产环境中完成这项任务是一项繁重的工作。Vuls使用了多个漏洞数据库,包括国家漏洞数据库(NVD)。Vuls占用资源较少,可以同时扫描多个系统并通过邮件或Slack发送报告。它有三种扫描模式(快速、快速Root和深度),您可以根据情况选择。
Vuls并不是一个广泛的IT安全扫描仪;例如,它不监控网络流量,也不能防范暴力登录攻击。然而,Vuls提供了一种自动化Linux软件包漏洞报告的方式。当Vuls使用的数据库收到针对某些漏洞的修复信息时,Vuls也将此修复信息引入其报告中。在生成报告时,Vuls使用数据库中既定的排名系统对最紧急的漏洞进行优先处理。
在本教程中,您将在Ubuntu 22.04服务器上部署Vuls。该过程包括从源代码构建Vuls及其依赖项,配置扫描并将结果报告到Slack,并可选择连接目标机器以启用远程扫描。最终,您将拥有一个自动化的漏洞报告系统,它会提醒您存在的漏洞,并消除手动检查的需要。
先决条件
要完成本教程,您需要:
- A server with at least 2 GB RAM running Ubuntu 22.04 with root access, and a secondary, non-root account. You can set this up by following this initial server setup guide. For this tutorial, the non-root user is james.
- A Slack workspace you’re a member of. To learn how to create a workspace, visit the official docs.
- (Optional) Multiple servers running (preferably) Ubuntu 22.04 with root access and a secondary, non-root account, if you want to set up Vuls to scan them remotely. In this tutorial, the secondary account is james-shark.The secondary account must have an SSH key configured for authentication, which you can do by following the Vuls product docs.
第一步——安装依赖项
在这一部分,您将创建一个文件夹来存储Vuls数据,安装最新版本的Go编程语言,并安装Vuls及其依赖所需的其他包。
在这个教程中,您将把与Vuls相关的所有数据存储在/usr/share/vuls-data目录中。通过运行以下命令来创建该目录:
- sudo mkdir /usr/share/vuls-data
要使它对萨米可访问,请运行以下命令:
- 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:安装 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
通过运行导航到它。
- 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的数据库中。
Note
在这个部分,您下载并安装了go-cve-dictionary,然后获取了NVD数据供Vuls使用。现在,您将下载并安装goval-dictionary,然后获取Ubuntu的OVAL数据。
安装和运行goval-dictionary
在本节中,您将下载并编译goval-dictionary,这是一个Go软件包,可提供对Ubuntu操作系统的OVAL数据库的访问。然后,您将运行它并获取Vuls使用的漏洞数据。OVAL代表开放式漏洞和评估语言,是一种用于表达检查给定系统上是否存在软件漏洞的开放性语言。
前往 `$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,使其在全局范围内可访问。
- 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
请记住,这个命令可能需要一些时间来完成。
将其复制到/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
请输入以下配置信息:
[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 (default) scans without root privileges, has no dependencies, and is very light on the target server.
- Fast root mode scans with root privileges and can detect upgraded but not yet restarted processes.
- Deep scan mode is the same as fast root mode but checks changelogs, which can lead to a high load on the target server.
- Offline mode scans the machine without internet access and can be used in conjunction with other modes.
保存并关闭文件。
为了验证配置文件的有效性,请运行以下命令。
- vuls configtest
你将会收到类似这样的输出。
Output[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, located on the upper left, lists machines that Vuls scanned.
- Found vulnerabilities, located right of the machine list, shows the vulnerabilities Vuls found in installed packages.
- Detailed information, taking up the left part of the screen, shows detailed information about the vulnerability, pulled from the databases.
- Affected packages, located right of the detailed information, shows what the affected package versions are, and if there is a fixed version.
按下回车键可以在每个面板之间循环光标。你可以使用键盘箭头在每个面板内导航。完成后,按下CTRL+C退出。
在这一步中,您运行了本地扫描并检查了结果。在下一个(可选)章节中,您将配置Vuls来扫描多个目标机器。
第四步 – (可选)配置多个目标机器
在这个部分,您将配置 Vuls 来扫描多台目标机。这个过程包括在目标机器上配置 /etc/sudoers,并配置 Vuls 扫描该目标。
只要你有目标服务器的IP地址、目标服务器的root访问权限和一个可用的目标服务器帐户(在本教程中为james-shark),你可以添加任意数量的服务器。
在快速模式下,您只能使用目标服务器上的非root用户帐户进行扫描。要启用快速根和深度模式的扫描,您需要编辑目标机器上的/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会告知您并提供重新编辑或退出的选项。
Note
Vuls 使用 checkrestart 工具来检查已更新但需要重新启动的软件包。为了确保目标服务器具备此功能,请在您的辅助服务器上运行以下命令来安装它:
- apt install debian-goodies -y
这就是你在目标服务器上所需要做的一切。你现在可以注销目标服务器,返回到你的初始服务器上。
要添加一个新的扫描服务器,请打开config.toml文件,在[servers]标记下添加以下行:
/usr/share/vuls-data/config.toml
翻译结果:
/usr/share/vuls-data/config.toml
[servers.target_name]
host = "target_ip"
port = "22"
user = "account_username"
keyPath = "/home/james/.ssh/id_rsa"
scanMode = [ "deep" ] # "fast", "fast-root" or "deep"
上述内容是用于添加新服务器的模板。请记住将target_name替换为您想要的名称,将target_ip替换为目标服务器的IP地址,将account_username替换为用户名(本教程使用james-shark),并提供用户james的私有RSA密钥路径。Vuls不支持SSH密码验证,因此指定keyPath是必要的。
保存并关闭文件。
接下来,对于每个添加的目标服务器,您将在本地机器上确认RSA密钥。为了实现这一点,您将使用适当的密钥从第一台服务器登录目标服务器,如下所示:
- ssh james-shark@target_ip -i /home/james/.ssh/id_rsa
请记得输入您的私钥文件路径。当询问是否继续连接时,请输入”是”,然后通过按下CTRL + D退出登录。
Note
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 = "your_hook_url"
channel = "#your_channel_name"
authUser = "your_username"
#notifyUsers = ["@username"]
请将 your_hook_URL 替换为您记下的 webhook URL,your_channel_name 替换为所需频道的名称,your_username 替换为创建 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访问的需求。