如何在 Ubuntu 18.04 上使用 Vuls 作为漏洞扫描程序

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

介绍

Vuls是一个开源的,没有代理的漏洞扫描器,用 Go编写。它自动对安装在系统上的软件的安全漏洞分析,这对于系统管理员在生产环境中手动执行可能是一个繁琐的任务。Vuls使用多个知名漏洞数据库,如国家漏洞数据库(NVD)。 资源轻松,Vuls能够同时扫描多个系统,并通过电子邮件或Slack发送报告。

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

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

前提条件

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

  • 具有至少 2 GB RAM 的服务器运行 Ubuntu 18.04 具有 root 访问,并具有次要的非 root 帐户. 您可以通过遵循 此初始服务器设置指南来设置此服务器。 对于本教程,非 root 用户是sammy
  • 您是 Slack 工作空间的成员。 要了解如何创建工作空间,请访问 官方文件
  • (可选) 运行的多个服务器(最好是) Ubuntu 18.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-goodieswget

sqlite是一个数据库系统,您将在这里使用它来存储漏洞信息。 debian-goodies包含checkrestart实用程序,该实用程序提供有关哪些软件包可以在任何特定时刻重新启动的信息。

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

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

您现在已经安装了所需的包,接下来,使用snap包管理器来安装Go,运行以下命令:

1sudo snap install go --classic

您使用「snap」來安裝 Go,因為它安裝了最新版本的語言,不像「apt」,它可能安裝舊版本。

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

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

使用您的文本编辑器创建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 程序。

步骤 2 — 安装和运行 go-cve 字典

在本节中,您将下载并编译go-cve-dictionary,这是一个 Go 包,可以访问 NVD(国家漏洞数据库)。然后,您将运行它并获取Vuls用于使用的漏洞数据。 NVD 是美国政府公开报告的网络安全漏洞的存储库,包含漏洞ID(CVE - 常见漏洞和暴露)、摘要和影响分析,并以机器可读格式提供。

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 資料以後使用。

步骤 3 — 安装和运行 goval-字典

在本节中,您将下载并编译goval-dictionary,一个提供访问Ubuntu的OVAL数据库的Go包,然后运行它并获取Vuls的漏洞数据来使用。

转到$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 18.x 的 OVAL 数据:

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

在此步骤中,您已下载并安装了goval-dictionary,并获取了 Ubuntu 18.x 的 OVAL 数据。

步骤 4 – 安装和运行客人

在本节中,你将下载并编译 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仅限制了访问权限的所有者。

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

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

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

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

输出将很长,可能不会正确清除,您可以运行清除命令来清除它。

在此步骤中,您已下载并安装了 gost,并获取了Debian的数据. 在下一步,您将下载并安装Vuls。

步骤 5 – 下载和配置 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’)将Vuls指向您在最后两个步骤中创建的漏洞数据库。下一个部分(‘服务器’)标志着与服务器相关的信息的开始。

Vuls提供四种扫描模式:

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

保存并关闭文件。

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

1vuls configtest

结果将看起来像这样:

 1[secondary_label Output]
 2[Dec 14 09:07:28]  INFO [localhost] vuls-v0.19.0-build-20211214_090234_2b7294a
 3[Dec 14 09:07:28]  INFO [localhost] Validating config...
 4[Dec 14 09:07:28]  INFO [localhost] Detecting Server/Container OS...
 5[Dec 14 09:07:28]  INFO [localhost] Detecting OS of servers...
 6[Dec 14 09:07:28]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
 7[Dec 14 09:07:28]  INFO [localhost] Detecting OS of containers...
 8[Dec 14 09:07:28]  INFO [localhost] Checking Scan Modes...
 9[Dec 14 09:07:28]  INFO [localhost] Checking dependencies...
10[Dec 14 09:07:28]  INFO [localhost] Dependencies... Pass
11[Dec 14 09:07:28]  INFO [localhost] Checking sudo settings...
12[Dec 14 09:07:28]  INFO [localhost] sudo ... No need
13[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
14[Dec 14 09:07:28]  INFO [localhost] Scannable servers are below...
15localhost

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

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

步骤 6 – 运行本地扫描

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

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

1vuls scan

结果将看起来像这样:

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

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

1vuls tui

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

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

Alt vuls reporting view

您可以通过按ENTER来循环按钮,然后使用键盘箭头导航,完成后,按CTRL+C来退出。

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

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

在本节中,您将配置 Vuls 来扫描多个目标机器. 这意味着在目标上配置 `/etc/sudoers,并配置 Vuls 来扫描目标。

在之前的步骤中,您将 Vuls 配置为扫描本地机器(‘localhost’)。

  • 目标服务器的 IP
  • 对目标服务器的 root 访问
  • 目标服务器上的可用帐户(本教程中的sammy-shark)

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

由于visudo是定义访问和特权访问规则的实用程序,您只能将其运行为root。由于sudoers的重要性,文件不会在没有发出警告的情况下出现错误。

在目标服务器上,作为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使用快速根深度模式进行扫描。

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,并提供您的私人RSA密钥的路径。

保存并关闭文件。

接下来,对于您添加的每个目标服务器,您将在本地机器上确认 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检查的一切,例如依赖性,超级用户访问和操作系统版本. 如果有任何错误,请检查教程中的配置。

在此步骤中,您已将更多目标服务器添加到 Vuls 配置中,从而将其标记为扫描。

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

在本节中,您将配置Vuls来向Slack发送报告,并执行cron任务,定期运行Vuls扫描。

要使用 Slack 集成,您需要在 Slack 上为您的工作空间设置一个 Webhook。 Incoming webhooks 是应用程序提供来自其他应用程序的实时信息的简单方法。

如果您从未创建过 Webhook,您首先需要为您的工作区创建一个应用程序。 要做到这一点,先登录 Slack 并导航到 应用创建页面. 选择您可以识别的名称,选择所需的工作区,然后单击 创建应用程序

您将被重定向到新应用程序的设置页面. 点击左导航栏的 Incoming Webhooks

Alt left nav bar "incoming webhooks"

要启用 Webhooks,请转动标题旁边的开关按钮 启用即将到来的 Webhooks

Alt activate incoming web hooks

页面下方会发现一个新的部分。滚向下,点击 新 Webhook 添加到 Workspace ** 按钮. 下一页,选择要发送报告的渠道,然后点击 ** 允许

您将被重定向回webhooks的设置页面,您将看到在表中列出的新的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 的用户名。

要测试整合,您可以通过运行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 扫描并每天中午报告。

结论

您现在已经成功地在 Ubuntu 18.04 服务器上安装了自动扫描和报告的 Vuls. 有关更多报告选项以及解决问题,请访问 Vuls 文档

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

Published At
Categories with 技术
comments powered by Disqus