如何在Ubuntu18.04上使用Vuls作为漏洞扫描程序
作为 Write for DOnations 计划的一部分,作者选择了 Free and Open Source Fund 来接受捐赠。
介绍
Vuls 是用 Go 编写的开源无代理漏洞扫描程序。 它可以自动对系统上安装的软件进行安全漏洞分析,这对于系统管理员在生产环境中手动执行可能是一项繁重的任务。 Vuls 使用多个著名的漏洞数据库,例如国家漏洞数据库 (NVD)。 在资源方面,Vuls 能够一次扫描多个系统,并通过电子邮件或 Slack 发送报告。 具有fast、fast root、deep三种扫描模式,可根据情况选择。
Vuls 不是一个广泛的 IT 安全扫描器; 例如,它不监控网络流量或防止暴力登录攻击。 但是,Vuls 提供了一种自动报告 Linux 软件包漏洞的方法。 当 Vuls 使用的数据库被告知修复了某些漏洞时,Vuls 也会将此修复信息提取到其报告中。 在生成报告时,Vuls 使用数据库中已建立的排名系统对最紧急的漏洞进行优先排序。
在本教程中,您将部署 Vuls 到 Ubuntu 18.04 服务器。 这包括从源代码构建 Vuls 及其依赖项、配置扫描和向 Slack 报告,以及可选地将其连接到目标机器以启用远程扫描。 最后,您将拥有一个自动漏洞报告系统,可以提醒您注意漏洞并消除手动检查的需要。
先决条件
要完成本教程,您需要:
- 具有至少 2 GB RAM 的服务器,运行 Ubuntu 18.04,具有 root 访问权限,以及一个辅助的非 root 帐户。 您可以按照 这个初始服务器设置指南 进行设置。 对于本教程,非 root 用户是
sammy
。 - 您所属的 Slack 工作区。 要了解如何创建工作空间,请访问 官方文档 。
- (可选)如果您想设置 Vuls 以远程扫描它们,多台服务器运行(最好)具有 root 访问权限和辅助非 root 帐户的 Ubuntu 18.04。 在本教程中,二级账户为
sammy-shark
。二级账户必须配置 SSH 密钥以进行身份验证,您可以按照 Vuls 产品文档 进行操作。
第 1 步 — 安装依赖项
在本节中,您将创建一个用于存储 Vuls 数据的文件夹,安装最新版本的 Go 编程语言,并安装 Vuls 及其依赖项所需的其他包。
对于本教程,您将在 /usr/share/vuls-data
目录中存储所有与 Vuls 相关的数据。 通过运行以下命令创建它:
sudo mkdir /usr/share/vuls-data
要使其可供 sammy
访问,请运行以下命令:
sudo chown -R sammy /usr/share/vuls-data
您现在已经创建了 vuls-data
文件夹,这将是您的工作区。 在继续安装所需的包之前,首先更新包管理器缓存:
sudo apt update
要下载和编译依赖项,您将安装 git
、gcc
、make
、sqlite
、debian-goodies
和 [ X119X]。
sqlite
是一个数据库系统,您将在此处使用它来存储漏洞信息。 debian-goodies
包含 checkrestart
实用程序,它提供有关在任何给定时刻可以和应该重新启动哪些软件包的信息。
您可以在一个命令中安装它们:
sudo apt install sqlite git debian-goodies gcc make wget -y
您现在已经安装了所需的软件包。 接下来,通过运行以下命令,使用 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
将以下命令添加到文件中:
/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 使用它们来查询漏洞数据库。
第 2 步 — 安装和运行 go-cve-dictionary
在本节中,您将下载并编译 go-cve-dictionary
,这是一个提供对 NVD(国家漏洞数据库)访问权限的 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
现在,您将通过运行以下命令将 go-cve-dictionary
从 GitHub 克隆到您的服务器:
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 sammy /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
下的数据库中。
注意: 此命令需要很长时间才能完成,如果您的服务器内存小于 2 GB,则可能会失败。
在这一步中,您已经下载并安装了 go-cve-dictionary
,并为 Vuls 获取 NVD 数据以供以后使用。 在下一节中,您将下载并安装 goval-dictionary
并获取 Ubuntu 的 OVAL 数据。
第 3 步 - 安装和运行 goval-dictionary
在本节中,您将下载并编译 goval-dictionary
,这是一个提供对 Ubuntu 的 OVAL 数据库的访问的 Go 包。 然后,您将运行它并获取漏洞数据以供 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 18.x 的 OVAL 数据:
sudo goval-dictionary fetch ubuntu --dbpath=/usr/share/vuls-data/oval.sqlite3 18
在这一步中,您已经下载并安装了 goval-dictionary
,并获取了 Ubuntu 18.x 的 OVAL 数据。 在下一步中,您将下载并安装 gost
并获取 Debian 安全跟踪器数据。
第 4 步 — 安装和运行 gost
在本节中,您将下载并编译 gost
,这是一个提供对 Debian 安全漏洞跟踪器的访问的 Go 包。 然后,您将运行它并获取漏洞数据以供 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 sammy /var/log/gost
然后,通过运行以下命令获取 Ubuntu 安全跟踪器数据:
gost fetch ubuntu --dbpath=/usr/share/vuls-data/gost.sqlite3
输出会很长,并且可能无法正确清除。 您可以运行 clear
命令清除它。
在这一步中,您已经下载并安装了 gost 并获取了 Debian 的数据。 在下一步中,您将下载并安装 Vuls。
第 5 步 — 下载和配置 Vul
安装完所有依赖项后,现在您将从源代码下载并编译 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
输入以下配置:
/usr/share/vuls-data/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
)将 Vuls 指向您在最后两个步骤中创建的漏洞数据库。 下一部分 (servers
) 标志着服务器相关信息的开始。 单独的部分将对每个服务器的信息进行分组。 Vuls 将使用此概述的配置扫描的唯一服务器是本地服务器 (localhost
)。
Vuls 提供四种扫描模式:
- 快速模式(默认):无root权限扫描,无依赖,对目标服务器很轻。
- 快速root模式:以root权限扫描,可以检测到升级但尚未重启的进程。
- 深度扫描模式:与快速root模式相同,但检查更改日志,这可能导致目标服务器负载过高。
- 离线模式:不联网扫描机器,可与其他模式配合使用。
保存并关闭文件。
要测试配置文件的有效性,请运行以下命令:
vuls configtest
输出将类似于以下内容:
Output[Dec 14 09:07:28] INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a [Dec 14 09:07:28] INFO [localhost] Validating config... [Dec 14 09:07:28] INFO [localhost] Detecting Server/Container OS... [Dec 14 09:07:28] INFO [localhost] Detecting OS of servers... [Dec 14 09:07:28] INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04 [Dec 14 09:07:28] INFO [localhost] Detecting OS of containers... [Dec 14 09:07:28] INFO [localhost] Checking Scan Modes... [Dec 14 09:07:28] INFO [localhost] Checking dependencies... [Dec 14 09:07:28] INFO [localhost] Dependencies... Pass [Dec 14 09:07:28] INFO [localhost] Checking sudo settings... [Dec 14 09:07:28] INFO [localhost] sudo ... No need [Dec 14 09:07:28] 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 [Dec 14 09:07:28] INFO [localhost] Scannable servers are below... localhost
您已正确输入配置,并且 Vuls 检测到它可以扫描本地服务器。
你已经安装并配置了 Vuls 来扫描本地服务器。 在下一步中,您将运行本地扫描并查看生成的报告。
第 6 步 — 运行本地扫描
在本节中,您将运行本地扫描,然后查看生成的漏洞报告。 到目前为止,您只配置了 Vuls 在上一步中正确检测到的本地服务器。 如果没有明确指定,默认扫描模式是快速的。
要运行扫描,请执行以下命令:
vuls scan
输出将类似于以下内容:
[Dec 14 09:07:47] INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a [Dec 14 09:07:47] INFO [localhost] Start scanning [Dec 14 09:07:47] INFO [localhost] config: /usr/share/vuls-data/config.toml [Dec 14 09:07:47] INFO [localhost] Validating config... [Dec 14 09:07:47] INFO [localhost] Detecting Server/Container OS... [Dec 14 09:07:47] INFO [localhost] Detecting OS of servers... [Dec 14 09:07:47] INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04 [Dec 14 09:07:47] INFO [localhost] Detecting OS of containers... [Dec 14 09:07:47] INFO [localhost] Checking Scan Modes... [Dec 14 09:07:47] INFO [localhost] Detecting Platforms... [Dec 14 09:07:47] INFO [localhost] (1/1) localhost is running on other [Dec 14 09:07:47] INFO [localhost] Scanning OS pkg in fast mode [Dec 14 09:07:47] INFO [localhost] Scanning listen port... [Dec 14 09:07:47] INFO [localhost] Using Port Scanner: Vuls built-in Scanner Scan Summary ================ localhost ubuntu18.04 539 installed To view the detail, vuls tui is useful. To send a report, run vuls report -h.
Vuls 已经记录了它在此过程中所做的事情。 要查看已识别的漏洞报告,请运行:
vuls tui
Vuls 将报告视图分为四个面板:
- 扫描的机器:位于左上角,列出了 Vuls 扫描的机器。
- 发现漏洞:位于机器列表右侧,显示已安装包中发现的漏洞 Vul。
- 详细信息:占据屏幕左侧,显示有关漏洞的详细信息,从数据库中提取。
- 受影响的包:位于详细信息的右侧,显示受影响的包版本是什么,以及是否有固定版本。
您可以通过按 ENTER
在面板中循环光标,并使用键盘箭头进行导航。 完成后,按 CTRL+C
退出。
在此步骤中,您运行了本地扫描并检查了结果。 在下一个(可选)部分中,您将配置 Vuls 以扫描多台目标机器。
第 7 步 - (可选)配置多个目标机器
在本节中,您将配置 Vuls 以扫描多台目标机器。 这需要在目标上配置 /etc/sudoers
并配置 Vuls 以扫描目标。
在上一步中,您将 Vuls 配置为扫描本地计算机 (localhost
)。 您可以根据需要添加任意数量的服务器,前提是您具备以下条件:
- 目标服务器的IP
- 对目标服务器的 root 访问权限
- 目标服务器上的可用帐户(本教程中的
sammy-shark
)
您只能在目标服务器上使用非 root 用户帐户以快速模式进行扫描。 要在快速 root 和深度模式下启用扫描,您需要在目标机器上编辑 /etc/sudoers
文件。 sudoers
文件控制哪些用户可以运行哪些命令,以及您是否需要指定命令的密码。
由于 visudo
是用于定义访问和特权访问规则的实用程序,因此您只能将其作为 root
运行。 由于 sudoers
的重要性,文件不会出现错误退出而不给出警告。
在目标服务器上,以 root
身份登录并通过运行 visudo
打开 sudoers
进行编辑:
visudo
将此行添加到文件末尾:
/etc/sudoers
sammy-shark ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart
此行指示 sudo
允许用户 sammy-shark
运行 apt-get update
、checkrestart
以及 stat
提供的每个命令,而无需提供密码.
保存并关闭文件。 如果您在此过程中出现语法错误,visudo
将通知您并提供重新编辑或退出。
注意: 通过在 sudoers
中允许 sammy-shark
用户,您允许 Vuls 使用 fast root 和 deep 模式进行扫描. 如果您也想为本地机器 (localhost
) 允许这些模式,请如前所示在 localhost
上编辑 sudoers
。
Vuls 使用 checkrestart
实用程序来检查已更新但需要重新启动的软件包。 要确保目标服务器拥有它,请运行以下命令来安装它:
apt install debian-goodies -y
这就是您在目标服务器上需要做的所有事情; 您现在可以从目标注销并重新登录到您的第一台服务器。
要添加新服务器进行扫描,请打开 config.toml
并在 [servers]
标记下添加以下行:
/usr/share/vuls-data/config.toml
[servers.target_name] host = "target_ip" port = "22" user = "account_username" keyPath = "/home/sammy/.ssh/id_rsa" scanMode = [ "deep" ] # "fast", "fast-root" or "deep"
上面的行用作添加新服务器的模板。 请记住将 target_name
替换为所需的名称,将 target_ip
替换为目标服务器的 IP,将 account_username
替换为用户名,并提供您的私有 RSA 密钥的路径。 Vuls 不支持 SSH 密码验证,因此需要指定 keyPath
。
保存并关闭文件。
接下来,对于您添加的每个目标服务器,您将确认本地计算机上的 RSA 密钥。 为此,您将使用适当的密钥从您的第一台服务器登录到目标服务器,如下所示:
ssh sammy-shark@target_ip -i /home/sammy/.ssh/id_rsa
请记住输入您的私有 RSA 密钥的路径。 当询问您是否要继续连接时,输入 yes
,然后按 CTRL + D
注销。
如果您收到有关密钥文件权限太开放的错误,请通过运行以下命令将它们设置为 600
:
chmod 600 account_rsa_key
将权限设置为 600
可确保只有所有者才能读取和写入密钥文件。
要检查新配置的有效性,请运行以下命令:
vuls configtest
输出将详细说明 Vuls 检查的所有内容,例如依赖关系、超级用户访问权限和操作系统版本。 如果有任何错误,请根据教程中的配置检查您的 config.toml
。
在此步骤中,您将更多目标服务器添加到 Vuls 配置中,从而将它们标记为扫描。 在下一部分中,您将配置 Vuls 以定期扫描并将报告发送到已配置的 Slack 工作区。
第 8 步 — 配置定期扫描和向 Slack 报告
在本节中,您将配置 Vuls 以向 Slack 发送报告并制作 cron
作业以定期运行 Vuls 扫描。
要使用 Slack 集成,您需要在 Slack 上为您的工作区设置一个传入 webhook。 Incoming webhooks 是应用程序提供来自其他应用程序的实时信息的一种简单方式。 在这种情况下,您将配置 Vuls 以向您的 Slack 频道报告。
如果您从未创建过 webhook,则首先需要为您的工作区创建一个应用程序。 为此,首先登录 Slack 并导航到 应用程序创建页面 。 选择一个您会识别的名称,选择所需的工作区,然后单击 Create App。
您将被重定向到新应用的设置页面。 点击左侧导航栏上的Incoming Webhooks。
通过翻转标题 Activate Incoming Webhooks 旁边的开关按钮来启用 webhook。
将发现页面下方的新部分。 向下滚动并单击 Add New Webhook to Workspace 按钮。 在下一页上,选择您希望将报告发送到的通道,然后单击允许。
您将被重定向回 webhook 的设置页面,并且您会在表格中看到一个新的 webhook。 点击 Copy 将其复制到剪贴板并记下以备后用。
然后,打开config.toml
进行编辑:
sudo nano config.toml
添加以下行:
/usr/share/vuls-data/config.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 的用户的用户名。 保存并关闭文件。
要测试集成,您可以通过运行 vuls report
生成报告,如下所示:
sudo vuls report -to-slack
Vuls 将需要一些时间才能成功运行并退出。 如果它显示错误,请根据前面的行检查您输入的内容。
您可以检查 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
在每天中午使用给定的配置运行 vuls scan
和 vuls report
(在 cron
语法中用 0 0 * * *
表示)。
保存并关闭文件。
在此步骤中,您已将 Vuls 连接到 Slack 工作区并配置 cron
以在每天中午运行 Vuls 扫描和报告。
结论
您现在已经成功地在 Ubuntu 18.04 服务器上设置了具有自动扫描和报告功能的 Vuls。 有关更多报告选项以及故障排除,请访问 Vuls 文档。
借助 Vuls,漏洞评估成为生产环境中更加无缝的过程。 作为设置 cron
的替代方案,还可以在 连续部署 工作流程中使用 Vuls,因为它的扫描是轻量级的,您可以根据需要运行它们。 您还可以考虑使用 Vuls 实施 防火墙 以限制访问并减少对 root 访问的需求。