如何在 Ubuntu 22.04 上将 Vuls 用作漏洞扫描仪

作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。

介绍

Vuls是一个开源的,没有代理的漏洞扫描器,用 Go编写。它自动对安装在系统上的软件的安全漏洞分析,这可能对系统管理员在生产环境中手动执行一个繁琐的任务。Vuls使用多个漏洞数据库,包括National Vulnerability Database(NVD)。

Vuls 不是一个广泛的 IT 安全扫描仪;例如,它不会监控网络流量或防止暴力登录攻击,但是,Vuls 提供了一种方法来自动化 Linux 包的漏洞报告。当 Vuls 使用的数据库被告知某些漏洞的修复时,Vuls 也会将此修复信息引入其报告中。

在本教程中,您将部署Vuls到Ubuntu 22.04服务器上。这个过程包括构建Vuls及其依赖源代码,配置扫描和报告到Slack,并可选地将其连接到目标机器,以允许远程扫描。

前提条件

要完成本教程,您将需要:

  • 具有至少 2 GB RAM 的服务器运行 Ubuntu 22.04 具有 root 访问,并具有次要的非 root 帐户. 您可以通过遵循 此初始服务器设置指南来设置此服务器。 对于本教程,非 root 用户是sammy
  • 您是 Slack 工作空间的成员。 要了解如何创建工作空间,请访问 官方文件
  • (可选) 运行的多个服务器(最好是) Ubuntu 22.04 具有 root 访问和次要的非 root 帐户,如果您想要设置 Vuls 来远程扫描它们。 在本教程中,次要的帐户是sammy-shark。 次要的帐户必须有一个 SSH

步骤1 - 安装依赖性

在本节中,您将创建一个存储 Vuls 数据的文件夹,安装 Go 编程语言的最新版本,并安装 Vuls 及其依赖需要的其他包。

对于本教程,您将存储所有与 Vuls 相关的数据到 /usr/share/vuls-data 目录中。

1sudo mkdir /usr/share/vuls-data

要使它可用於「sammy」,請執行以下命令:

1sudo chown -R sammy /usr/share/vuls-data

您现在已经创建了vuls-data文件夹,这将是您的工作空间。在继续安装所需的包之前,先更新包管理器缓存:

1sudo apt update

要下载和编译依赖,您将安装git,gcc,make,sqlite,debian-goodieswgetsqlite是一个数据库系统,您将在这里使用它来存储漏洞信息。

您可以在一个命令中安装它们:

1sudo apt install sqlite git debian-goodies gcc make wget -y

您现在已经安装了所需的包,可以继续安装 Go 和 Vuls 将使用的相关程序。

安装 Go

使用「snap」包管理器安裝 Go,執行以下命令:

1sudo snap install go --classic

您使用snap来安装Go,因为它安装了语言的最新版本,而apt可能安装了一个较旧的版本。

为了工作,Go 需要设置几个环境变量: GOPATHPATH. GOPATH 指定了Go 的工作目录。

为了实现自动化,您将在/etc/profile.d下创建一个名为go-env.sh的新可执行文件。

使用您的文本编辑器创建go-env.sh:

1sudo nano /etc/profile.d/go-env.sh

将下列命令添加到文件中:

1[label /etc/profile.d/go-env.sh]
2export GOPATH=$HOME/go
3export PATH=$PATH:$GOPATH/bin:/snap/bin

导出命令将所给定的环境变量设置为所需的值. 在这里,您使用它来填充GOPATHPATH与相应的值。

保存并关闭文件。

目前,‘go-env.sh’ 不可执行. 若要修复此问题,请通过运行以下命令将其标记为可执行:

1sudo chmod +x /etc/profile.d/go-env.sh

为了避免再次登录,您可以通过运行go-env.sh来重新加载:

1source /etc/profile.d/go-env.sh

命令将该文件重新加载到当前壳中,同时保持其状态。

您现在已经安装了 Go 语言,设置了其环境变量,并安装了您以后需要的软件包。接下来,您将下载并编译 Vuls 所需的 Go 程序。

安装和运行 go-cve 字典

在本节中,您将下载并编译go-cve-dictionary,这是一个 Go 包,可以访问 国家漏洞数据库。然后,您将运行它以获取Vuls可以使用的漏洞数据。

Go 存储在$GOPATH/src/下的包. 您可以通过使用子目录来进一步扩展,以便记住来源. 例如,由用户创建的 GitHub 的包将被存储在$GOPATH/src/github.com/example-user下。

你首先会通过从 GitHub 克隆 Go 包来安装go-cve-dictionary,然后再编译它。

开始创建一个目录来存储它,根据示例路径:

1mkdir -p $GOPATH/src/github.com/vulsio

通过运行导航:

1cd $GOPATH/src/github.com/vulsio

现在,您将从 GitHub 克隆go-cve-dictionary到您的服务器,运行:

1git clone https://github.com/vulsio/go-cve-dictionary.git

然后,导航到 root 包:

1cd go-cve-dictionary

最后,通过运行以下命令来编译和安装它:

1make install

请记住,这个命令可能需要一段时间才能完成。

要使它可用系统广泛,将其复制到 /usr/local/bin:

1sudo cp $GOPATH/bin/go-cve-dictionary /usr/local/bin

go-cve-dictionary需要访问一个日志输出目录;默认情况下,它是/var/log/vuls

1sudo mkdir /var/log/vuls

现在,日志目录可以被所有人读取. 使用以下命令限制当前用户的访问:

1sudo chmod 700 /var/log/vuls

将权限标志设置为700,仅限于所有者。

要使它可用於「sammy」或其他使用者,請執行下列命令:

1sudo chown -R sammy /var/log/vuls

接下来,您将从 NVD 获取漏洞数据,并将其存储在 Vuls 工作区(/usr/share/vuls-data):

1go-cve-dictionary fetch nvd --dbpath /usr/share/vuls-data/cve.sqlite3

此命令将从 2002 年到当前年收集 NVD 漏洞数据,并将其存储在/usr/share/vuls-data下的数据库中。

<$>[注] 注: 此命令需要很长时间才能完成,如果您的服务器 RAM 少于 2 GB,则可能会失败。

在本节中,您下载并安装了go-cve-dictionary,然后为 Vuls 获取 NVD 数据,现在您将下载和安装goval-dictionary,并为 Ubuntu 获取 OVAL 数据。

安装和运行 goval-字典

在本节中,您将下载并编译goval-dictionary,一个提供访问Ubuntu的OVAL数据库的Go包(https://ubuntu.com/security/oval)。

转到$GOPATH/src/github.com/vulsio文件夹:

1cd $GOPATH/src/github.com/vulsio

通过运行以下命令从 GitHub 克隆包:

1git clone https://github.com/vulsio/goval-dictionary.git

输入包裹文件夹:

1cd goval-dictionary

编译并安装它与:

1make install

将其复制到/usr/local/bin以使其在全球范围内可用:

1sudo cp $GOPATH/bin/goval-dictionary /usr/local/bin

然后,通过运行以下命令来获取 Ubuntu `22 的 OVAL 数据:

1sudo goval-dictionary fetch ubuntu --dbpath=/usr/share/vuls-data/oval.sqlite3 22

在这里,你下载并安装了goval-dictionary,然后获取了Ubuntu的OVAL数据。

安装和运行客人

在本节中,你将下载并编译 Go 包,它可以访问 Debian 安全漏洞追踪器,然后运行它并获取 Vuls 使用的漏洞数据。

您将将此包存储在与之前相同的目录中. 通过运行以下命令导航到它:

1cd $GOPATH/src/github.com/vulsio

从 GitHub 克隆包,运行:

1git clone https://github.com/vulsio/gost.git

完成后,输入包文件夹:

1cd gost

编译并安装它与:

1make install

将其复制到/usr/local/bin以使其在全球范围内可用:

1sudo cp $GOPATH/bin/gost /usr/local/bin

然后,创建一个客人的日志文件目录:

1sudo mkdir /var/log/gost

使用以下命令限制当前用户的访问:

1sudo chmod 700 /var/log/gost

将权限标志设置为700,仅限制访问权限的所有者。

1sudo chown -R sammy /var/log/gost

然后,通过运行 Ubuntu 安全跟踪数据:

1gost fetch ubuntu --dbpath=/usr/share/vuls-data/gost.sqlite3

输出可能很长,可能不会在终端中清晰,在这种情况下您可以运行清晰命令。

您刚刚下载并安装了客人,然后获取了Debian的数据,下一步,您将下载并安装Vuls。

步骤 2 – 下载和配置 Vuls

随着所有依赖的安装,您现在将从源代码下载和编译 Vuls. 您还将配置它来扫描本地机器。

使用此命令创建包含通往 Vuls 存储库的路径的新目录:

1mkdir -p $GOPATH/src/github.com/future-architect

导航它:

1cd $GOPATH/src/github.com/future-architect

从 GitHub 克隆 Vuls 通过运行以下命令:

1git clone https://github.com/future-architect/vuls.git

输入包裹文件夹:

1cd vuls

同时编译和安装,运行:

1make install

请记住,完成此命令可能需要一段时间。

将其复制到/usr/local/bin以使其在全球范围内可用:

1sudo cp $GOPATH/bin/vuls /usr/local/bin

现在,您将创建一个 Vuls 配置文件. 返回 /usr/share/vuls-data:

1cd /usr/share/vuls-data

Vuls 将其配置存储在 TOML 文件中,您将其命名为 config.toml. 使用您的文本编辑器创建它:

1sudo nano config.toml

输入以下配置:

 1[label /usr/share/vuls-data/config.toml]
 2[cveDict]
 3type = "sqlite3"
 4SQLite3Path = "/usr/share/vuls-data/cve.sqlite3"
 5
 6[ovalDict]
 7type = "sqlite3"
 8SQLite3Path = "/usr/share/vuls-data/oval.sqlite3"
 9
10[gost]
11type = "sqlite3"
12SQLite3Path = "/usr/share/vuls-data/gost.sqlite3"
13
14[servers]
15
16[servers.localhost]
17host = "localhost"
18port = "local"
19scanMode = [ "fast" ]
20#scanMode = ["fast", "fast-root", "deep", "offline"]

此配置的前两个部分(‘cveDict’,‘ovalDict’和‘gost’)将Vuls指向您刚刚添加的漏洞数据库。‘服务器’部分标志着与服务器相关的信息的开始。

Vuls提供四种扫描模式:

  • Fast mode(默认)扫描没有根权限,没有依赖性,并且在目标服务器上非常轻。
  • Fast root mode扫描具有根权限,可以检测升级但尚未重新启动的流程。
  • Deep scan mode与快速根模式相同,但检查更改日志,这可能导致目标服务器的高负荷。

保存并关闭文件。

要测试配置文件的有效性,请运行以下命令:

1vuls configtest

您将获得类似于此的输出:

 1[secondary_label Output]
 2[Jan 5 20:24:29]  INFO [localhost] vuls-v0.22.0-build-20230105_201926_554ecc4
 3[Jan 5 20:24:29]  INFO [localhost] Validating config...
 4[Jan 5 20:24:29]  INFO [localhost] Detecting Server/Container OS...
 5[Jan 5 20:24:29]  INFO [localhost] Detecting OS of servers...
 6[Jan 5 20:24:29]  INFO [localhost] (1/1) Detected: localhost: ubuntu 22.10
 7[Jan 5 20:24:29]  INFO [localhost] Detecting OS of containers...
 8[Jan 5 20:24:29]  INFO [localhost] Checking Scan Modes...
 9[Jan 5 20:24:29]  INFO [localhost] Checking dependencies...
10[Jan 5 20:24:29]  INFO [localhost] Dependencies... Pass
11[Jan 5 20:24:29]  INFO [localhost] Checking sudo settings...
12[Jan 5 20:24:29]  INFO [localhost] sudo ... No need
13[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
14[Jan 5 20:24:29]  INFO [localhost] Scannable servers are below...
15localhost

您正确输入了配置,Vuls 检测到它可以扫描本地服务器。

您已安装并配置 Vuls 来扫描本地服务器. 在下一步,您将运行本地扫描并查看生成的报告。

步骤 3 – 运行本地扫描

在此步骤中,您将运行本地扫描,然后查看生成的漏洞报告. 到目前为止,您只配置了本地服务器,Vuls 在最后一步中正确检测到它。

要运行扫描,请执行以下命令:

1vuls scan

结果将类似于此:

 1[Jan 5 20:26:14]  INFO [localhost] vuls-v0.22.0-build-20230105_201926_554ecc4
 2[Jan 5 20:26:14]  INFO [localhost] Start scanning
 3[Jan 5 20:26:14]  INFO [localhost] config: /usr/share/vuls-data/config.toml
 4[Jan 5 20:26:14]  INFO [localhost] Validating config...
 5[Jan 5 20:26:14]  INFO [localhost] Detecting Server/Container OS...
 6[Jan 5 20:26:14]  INFO [localhost] Detecting OS of servers...
 7[Jan 5 20:26:14]  INFO [localhost] (1/1) Detected: localhost: ubuntu 22.10
 8[Jan 5 20:26:14]  INFO [localhost] Detecting OS of containers...
 9[Jan 5 20:26:14]  INFO [localhost] Checking Scan Modes...
10[Jan 5 20:26:14]  INFO [localhost] Detecting Platforms...
11[Jan 5 20:26:14]  INFO [localhost] (1/1) localhost is running on other
12[Jan 5 20:26:14]  INFO [localhost] Scanning OS pkg in fast mode
13[Jan 5 20:26:14]  INFO [localhost] Scanning listen port...
14[Jan 5 20:26:14]  INFO [localhost] Using Port Scanner: Vuls built-in Scanner
15
16Scan Summary
17================
18localhost ubuntu22.10 695 installed
19
20To view the detail, vuls tui is useful.
21To send a report, run vuls report -h.

Vuls 记录了它在进程中所做的事情. 若要查看已识别的漏洞报告,请运行:

1vuls tui

Vuls将报告视图分为四个面板:

  • 被扫描的机器位于左上方,列出了Vuls扫描的机器。
  • 发现的漏洞位于机器列表的右侧,显示了Vuls在安装的软件包中发现的漏洞。
  • 详细信息占据屏幕的左侧,显示了数据库中提取的有关漏洞的详细信息。

Screencapture of the Vuls reporting view

您可以通过按ENTER按下每个面板来循环导向器,您可以使用键盘箭头导航每个面板。

在此步骤中,您运行了本地扫描并检查了结果. 在下一个(可选)部分,您将配置Vuls来扫描多个目标机器。

步骤 4 – (可选) 配置多个目标机器

在本节中,您将配置 Vuls 来扫描多个目标机器. 此过程包括在目标机器上配置 `/etc/sudoers,并配置 Vuls 来扫描该目标。

您可以添加任何您想要的服务器,只要您有目标服务器的 IP 地址,对目标服务器的 root 访问和目标服务器上可用的帐户(本教程中的sammy-shark)。

您只能在目标服务器上使用非 root 用户帐户进行快速扫描。 要在快速 root 和深度模式下启用扫描,您需要在目标机器(s)上编辑 `/etc/sudoers’ 文件。

visudo是定义访问和特权访问规则的实用程序,您只能将其运行为‘root’。

在目标服务器上,作为root登录并打开sudoers进行编辑,运行visudo:

1[environment second]
2visudo

将此行添加到文件的末尾:

1[label /etc/sudoers]
2sammy-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使用快速根和深度模式进行扫描。如果您想为本地机器(localhost)也允许这些模式,您可以在localhost上编辑sudoers

Vuls 使用checkrestart实用程序来检查正在更新但需要重新启动的软件包。

1[environment second]
2apt install debian-goodies -y

这就是你在目标服务器上所需要做的。你现在可以退出目标服务器并返回原始服务器。

要添加一个新的服务器进行扫描,请打开config.toml,并在[服务器]标记下添加以下行:

1[label /usr/share/vuls-data/config.toml]
2[servers.target_name]
3host = "target_ip"
4port = "22"
5user = "account_username"
6keyPath = "/home/sammy/.ssh/id_rsa"
7scanMode = [ "deep" ] # "fast", "fast-root" or "deep"

上面的行是添加新服务器的模板。请记住用您想要的名称代替target_name,用目标服务器的IP代替target_ip,用用户名代替account_username(本教程使用sammy-shark),并为用户提供sammy的私人RSA密钥路径。Vuls不支持SSH密码验证,因此需要指定keyPath

保存并关闭文件。

接下来,对于您添加的每个目标服务器,您将在本地机器上确认 RSA 密钥。

1ssh sammy-shark@target_ip -i /home/sammy/.ssh/id_rsa

请记住输入您的私人 RSA 密钥的路径. 当被问及是否要继续连接时,请输入,然后按CTRL + D退出。

<$>[注] 注: 如果您收到關鍵檔案權限過度開放的錯誤,請執行下列命令以「600」設定它們:

1chmod 600 account_rsa_key

将权限设置为600,确保只有所有者才能读取和写入密钥文件。

要检查新配置的有效性,请运行以下命令:

1vuls configtest

输出将详细说明Vuls检查的一切,例如依赖性,超级用户访问和操作系统版本. 如果有任何错误,请检查您的config.toml对本节早些时候提供的配置。

在此步骤中,您已将更多服务器添加到 Vuls 配置中,将其标记为扫描,在下一部分,您将配置 Vuls 以定期扫描并将报告发送到 Slack 工作区。

步骤 5 – 配置定期扫描和报告到 Slack

现在,您将配置 Vuls 来向 Slack 发送报告,并设置一个cron任务来定期运行 Vuls 扫描。

要使用 Slack 集成,您需要在 Slack 上为您的工作空间设置一个 入口 webhookIncoming webhooks 允许应用程序提供来自其他应用程序的实时信息。

如果您尚未创建 Webhook,您首先需要为您的工作区创建应用程序。 要做到这一点,请先登录 Slack 并导航到 Slack 的 应用创建页面

您将被重定向到新应用程序的设置页面,在左导航栏中选择 Incoming Webhooks项。

Alt left nav bar "incoming webhooks"

要启用 Webhooks,请将标题旁边的开关按钮转移到 ** 启用入口 Webhooks** 到 ** 启用**。

Alt activate incoming web hooks

一旦激活,页面将加载一个新部分。滚动到并按下 新 Webhook 添加到 Workspace 按钮. 将打开一个新页面以请求访问您的 Workspace。

您将被重定向回 Webhooks 设置页面,然后在 Webhook URL 下表中列出一个新的 Webhook。

回到您的初始服务器的终端,打开config.toml进行编辑:

1sudo nano config.toml

添加以下几行:

1[label /usr/share/vuls-data/config.toml]
2[slack]
3hookURL      = "your_hook_url"
4channel      = "#your_channel_name"
5authUser     = "your_username"
6#notifyUsers  = ["@username"]

your_hook_URL替换为您注意到的 webhook URL、your_channel_name替换为所需频道的名称、your_username替换为创建 webhook 的 Slack 用户的用户名。

要测试整合,您可以通过运行vuls 报告来生成报告:

1sudo vuls report -to-slack

Vuls 需要几秒钟才能运行和退出,如果返回错误,请检查您在前面的行中输入的内容。

检查您的 Slack 应用程序,以确认 Vuls 已成功将报告发送到指定的频道。

Alt header for Slack posted report

现在你已经配置了报告,你可以设置日程扫描。 cron是一个基于时间的作业日程安排器,与每个Ubuntu机器一起构建。它通过crontab文件进行配置,该文件准确地定义了命令何时运行。

打开当前的crontab文件,运行以下命令:

1crontab -e

当被提示时,从列表中选择您喜爱的文本编辑器。

将下列行添加到文件的末尾:

10 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 扫描vuls 报告的配置(在cron语法中表示为0 0 * * *)。

保存并关闭文件。

在此步骤中,您已将 Vuls 连接到 Slack 工作区,并配置cron来运行 Vuls 扫描,并每天中午向 Slack 报告。

结论

您现在已经成功地在 Ubuntu 22.04 服务器上安装了自动扫描和报告的 Vuls. 有关更多报告选项以及故障排除的信息,请访问 Vuls 文档

使用 Vuls,在生产环境中,漏洞评估变得更加无缝。作为对cron设置的替代方案,也可以在 连续部署工作流中使用 Vuls,因为其扫描很轻,您可以根据需要运行它们。

Published At
Categories with 技术
comments powered by Disqus