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

作为Write for DOnations计划的一部分,作者选择了免费和开源基金来接受捐赠

介绍

Vuls是一个用Go编写的开源、无代理漏洞扫描器它自动对安装在系统上的软件进行安全漏洞分析,这对于系统管理员在生产环境中手动完成可能是一项繁重的任务。Vuls 使用多个著名的漏洞数据库,例如国家漏洞数据库 (NVD)。轻资源,Vuls 能够一次扫描多个系统,并通过电子邮件或 Slack 发送报告。它具有三种扫描模式(快速快速根深度),您可以根据情况进行选择。

Vuls 不是一个广泛的 IT 安全扫描程序;例如,它不监控网络流量或防止暴力登录攻击。但是,Vuls 提供了一种自动化 Linux 包漏洞报告的方法。当 Vuls 使用的数据库被告知修复了某些漏洞时,Vuls 也会将此修复信息提取到其报告中。在生成报告时,Vuls 使用数据库中已建立的排名系统对最紧急的漏洞进行优先排序。

在本教程中,您将把 Vuls 部署到 Ubuntu 18.04 服务器。这包括从源代码构建 Vul 及其依赖项、配置扫描和报告到 Slack,以及可选地将其连接到目标机器以启用远程扫描。最后,您将拥有一个自动漏洞报告系统,该系统会向您发出漏洞警报,而无需手动检查。

先决条件

在开始本教程之前,您需要:

  • 具有至少 2 GB RAM 的服务器,运行 Ubuntu 18.04,具有 root 访问权限,以及一个辅助的非 root 帐户。您可以按照此初始服务器设置指南进行设置对于本教程,非 root 用户是sammy.
  • (可选)运行(最好)Ubuntu 18.04 的多台服务器,具有 root 访问权限和一个辅助的非 root 帐户,如果你想设置 Vuls 来远程扫描它们。在本教程中,辅助帐户是sammy-shark

第 1 步 – 安装依赖项

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

在本教程中,您将在目录中存储所有与 Vuls 相关的数据通过运行以下命令来创建它:/usr/share/vuls-data

  • sudo mkdir /usr/share/vuls-data

要使其可访问sammy,请运行以下命令:

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

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

  • sudo apt update

要下载和编译的依赖,你会安装gitgccmakesqlitedebian-goodies,和wget

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

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

  • sudo apt install sqlite git debian-goodies gcc make wget

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

  • sudo snap install go --classic

您习惯于snap安装 Go,因为它安装了最新版本的语言,这与apt可能安装旧版本不同。不建议使用旧版本,这可能会阻止您完成本教程。

为了工作,Go 需要一些您将设置的环境变量:GOPATHPATH. GOPATH指定 Go 的工作目录和PATH(其中包含放置程序的目录)必须扩展以告诉系统在哪里可以找到 Go 本身。

每次用户登录时都需要设置这些环境变量。要自动执行此操作,您将go-env.sh/etc/profile.d. 这将导致每次用户登录时都会执行该目录。

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命令将给定的环境变量设置为所需的值;在这里,您可以使用它来填充GOPATHPATH使用适当的值。

保存并关闭文件。

目前,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-dictionarygoval-dictionary,Vuls 使用它们来查询漏洞数据库。

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

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

Go 将包存储在$GOPATH/src/. 您可以使用子目录来进一步扩展它以记录来源。例如,用户制作的来自 GitHub 的包example-user将存储在.$GOPATH/src/github.com/example-user

您将首先go-cve-dictionary通过kotakanbe从 GitHub 克隆 Go 包并随后编译来安装由 制作

首先根据示例路径创建一个目录来存储它:

  • mkdir -p $GOPATH/src/github.com/kotakanbe

通过运行导航到它:

  • cd $GOPATH/src/github.com/kotakanbe

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

  • git clone https://github.com/kotakanbe/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

  • for i in `seq 2002 $(date +"%Y")`; do sudo go-cve-dictionary fetchnvd -dbpath /usr/share/vuls-data/cve.sqlite3 -years $i; done

此命令从 2002 年到当前年份 ( seq 2002 $(date +"%Y"))go-cve-dictionary fetchnvd循环,并通过传递调用以获取当前(循环)年份的 NVD 数据-years $i然后,它将此信息存储在./usr/share/vuls-data

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

在这一步中,您已经下载并安装go-cve-dictionary了 NVD 数据,供 Vuls 以后使用。在下一部分中,您将为goval-dictionaryUbuntu下载、安装和获取 OVAL 数据。

步骤 3 — 安装和运行 goval-dictionary

在本节中,您将下载并编译goval-dictionary,这是一个提供对 Ubuntu 的 OVAL 数据库的访问的 Go 包。然后,您将运行它并获取漏洞数据以供 Vul 使用。OVAL 代表 Open Vulnerability and Assessment Language,它是一种开放语言,用于表达确定给定系统上是否存在软件漏洞的检查。

同一作者 ,kotakanbe编写了goval-dictionary,您将把它存储在上一个包旁边。

导航到$GOPATH/src/github.com/kotakanbe文件夹:

  • cd $GOPATH/src/github.com/kotakanbe

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

  • git clone https://github.com/kotakanbe/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 包。然后,您将运行它并获取漏洞数据以供 Vul 使用。Debian 安全跟踪器收集有关随 Debian 分发的软件包的漏洞状态的所有信息。来自这个跟踪器的数据可能很有用,因为 Ubuntu 作为一个发行版,是基于 Debian 的。

您将将此包存储在一个新文件夹中。通过运行以下命令来创建它:

  • sudo mkdir -p $GOPATH/src/github.com/knqyf263

导航到$GOPATH/src/github.com/knqyf263您刚刚创建文件夹:

  • cd $GOPATH/src/github.com/knqyf263

通过运行从 GitHub 克隆包:

  • sudo git clone https://github.com/knqyf263/gost.git

完成后,进入包文件夹:

  • cd gost

编译并安装它make

  • make install

将其复制到/usr/local/bin以使其全局可访问:

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

然后,将其数据库符号链接到该/usr/share/vuls-data文件夹,以便 Vuls 稍后能够找到它:

  • ln -s $GOPATH/src/github.com/knqyf263/gost/gost.sqlite3 /usr/share/vuls-data/gost.sqlite3

创建一个日志文件目录gost

  • sudo mkdir /var/log/gost

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

  • sudo chmod 700 /var/log/gost

如前所述,将权限标志设置700为仅限所有者访问。

要使其可供sammy或其他用户访问,请运行以下命令:

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

然后,通过运行获取 Debian 安全跟踪器数据:

  • gost fetch debian

您将看到类似于以下内容的输出:

Output
INFO[04-01|21:54:59] Initialize Database INFO[04-01|21:54:59] Opening DB. db=sqlite3 INFO[04-01|21:54:59] Migrating DB. db=sqlite3 INFO[04-01|21:54:59] Fetched all CVEs from Debian INFO[04-01|21:55:00] Fetched CVEs=2943 INFO[04-01|21:55:00] Insert Debian CVEs into DB db=sqlite3 26385 / 26385 [=========================================================================] 100.00% 9s

在这一步中,您已经下载并安装了 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

现在,您将为 Vul 创建一个配置文件。导航回/usr/share/vuls-data

  • cd /usr/share/vuls-data

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

  • sudo nano config.toml

输入以下配置:

vuls数据/ config.toml’>的/ usr /共享/ vuls数据/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"]

此配置的前两部分 (cveDictovalDict) 将 Vul 指向您在最后两步中创建的漏洞数据库。下一部分 ( servers) 标志着服务器相关信息的开始。单独的部分将对每个服务器的信息进行分组。Vuls 将使用此概述配置扫描的唯一服务器是本地服务器 ( localhost)。

Vuls 提供四种扫描模式:

  • 快速模式(默认):无需 root 权限进行扫描,没有依赖关系,并且在目标服务器上非常轻。
  • 快速 root 模式:使用 root 权限扫描,可以检测升级但尚未重新启动的进程。
  • 深度扫描模式:与快速根模式相同,但会检查更改日志,这会导致目标服务器上的高负载。
  • 离线模式:在没有互联网访问的情况扫描机器,可以与其他模式结合使用。

保存并关闭文件。

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

  • vuls configtest

您将看到以下输出:

[Feb 27 19:36:42]  INFO [localhost] Validating config...
[Feb 27 19:36:42]  INFO [localhost] Detecting Server/Container OS...
[Feb 27 19:36:42]  INFO [localhost] Detecting OS of servers...
[Feb 27 19:36:42]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Feb 27 19:36:42]  INFO [localhost] Detecting OS of containers...
[Feb 27 19:36:42]  INFO [localhost] Checking Scan Modes...
[Feb 27 19:36:42]  INFO [localhost] Checking dependencies...
[Feb 27 19:36:42]  INFO [localhost] Dependencies... Pass
[Feb 27 19:36:42]  INFO [localhost] Checking sudo settings...
[Feb 27 19:36:42]  INFO [localhost] sudo ... No need
[Feb 27 19:36:42]  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
[Feb 27 19:36:42]  INFO [localhost] Scannable servers are below...
localhost

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

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

步骤 6 — 运行本地扫描

在本节中,您将运行本地扫描,然后查看生成的漏洞报告。到目前为止,您只配置了 Vuls 在上一步中正确检测到的本地服务器。如果没有明确指定,默认扫描模式是快速的。

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

  • vuls scan

你会看到类似这样的输出:

[Feb 27 19:44:12]  INFO [localhost] Start scanning
[Feb 27 19:44:12]  INFO [localhost] config: /usr/share/vuls-data/config.toml
[Feb 27 19:44:12]  INFO [localhost] Validating config...
[Feb 27 19:44:12]  INFO [localhost] Detecting Server/Container OS...
[Feb 27 19:44:12]  INFO [localhost] Detecting OS of servers...
[Feb 27 19:44:12]  INFO [localhost] (1/1) Detected: localhost: ubuntu 18.04
[Feb 27 19:44:12]  INFO [localhost] Detecting OS of containers...
[Feb 27 19:44:12]  INFO [localhost] Checking Scan Modes...
[Feb 27 19:44:12]  INFO [localhost] Detecting Platforms...
[Feb 27 19:44:12]  INFO [localhost] (1/1) localhost is running on other
[Feb 27 19:44:12]  INFO [localhost] Scanning vulnerabilities...
[Feb 27 19:44:12]  INFO [localhost] Scanning vulnerable OS packages...
[Feb 27 19:44:12]  INFO [localhost] Scanning in fast mode


One Line 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。
  • 详细信息:占据屏幕左侧,显示从数据库中提取的有关漏洞的详细信息。
  • 受影响的包:位于详细信息的右侧,显示受影响的包版本,以及是否有固定版本。

Alt vuls 报告视图

您可以通过按 来在面板之间循环光标ENTER,然后使用键盘箭头进行导航。

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

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

在本节中,您将配置 Vul 以扫描多台目标机器。这需要/etc/sudoers在目标上进行配置并配置 Vul 来扫描目标。

在上一步中,您将 Vuls 配置为扫描本地机器 ( localhost)。您可以根据需要添加任意数量的服务器,前提是您具备以下条件:

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

您只能在目标服务器上使用非 root 用户帐户以快速模式进行扫描。要在快速根模式和深度模式下启用扫描,您需要/etc/sudoers在目标机器上编辑文件。sudoers文件控制哪些用户可以运行哪些命令,以及指定命令是否需要密码。

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

在目标服务器上,以身份登录rootsudoers通过运行visudo以下命令打开进行编辑

  • visudo

将此行添加到文件末尾:

/etc/sudoers
sammy-shark ALL=(ALL) NOPASSWD: /usr/bin/apt-get update, /usr/bin/stat *, /usr/sbin/checkrestart

此行指示sudo允许用户sammy-shark运行apt-get updatecheckrestart和 可从 中获得的每个命令stat,而无需提供密码。

保存并关闭文件。如果您在此过程中出现语法错误,visudo将通知您并提供重新编辑或退出。

注意:通过允许sammy-shark用户进入sudoers,您将允许 Vul 使用快速根模式深度模式进行扫描如果你想允许本地机器的模式(localhost)也一样,编辑sudoerslocalhost如前所示。

Vuls 使用该checkrestart实用程序来检查已更新但需要重新启动的软件包。要确保目标服务器拥有它,请以非 root 用户身份登录,并通过运行以下命令进行安装:

  • sudo 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 = "account_rsa_key"
scanMode = [ "deep" ] # "fast", "fast-root" or "deep"

以上几行用作添加新服务器的模板。请记住替换target_name为所需的名称、target_ip目标服务器的 IP、account_username用户名和account_rsa_keyRSA 密钥的路径。Vuls 不支持 SSH 密码认证,所以需要指定 a keyPath

保存并关闭文件。

接下来,对于您添加的每个目标服务器,您将确认本地计算机上的 RSA 密钥。为此,您将使用适当的密钥从您的第一台服务器登录到目标服务器,如下所示:

  • ssh sammy-shark@target_ip -i account_rsa_key

当询问您是否要继续连接时,输入yes,然后按 注销CTRL + D

如果您收到有关密钥文件权限太开放的错误,请600通过运行以下命令将它们设置为

  • chmod 600 account_rsa_key

设置权限以600确保只有所有者才能读写密钥文件。

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

  • vuls configtest

此命令不会有任何输出。如果有任何错误,请config.toml根据教程中的配置检查您的错误

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

步骤 8 — 将定期扫描和报告配置为 Slack

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

要使用 Slack 集成,您需要在 Slack 上为您的工作区设置一个传入的 webhook。传入webhook是应用程序提供其他应用程序实时信息的一种简单方式。在这种情况下,您将配置 Vuls 以向您的 Slack 频道报告。

如果您从未创建过 webhook,则首先需要为您的工作区创建一个应用程序。为此,首先登录 Slack 并导航到应用程序创建页面选择一个您能识别的名称,选择所需的工作区,然后单击Create App

您将被重定向到新应用的设置页面。单击左侧导航栏上的传入 Webhook

Alt 左导航栏“传入的 webhooks”

通过翻转标题Activate Incoming Webhooks旁边的开关按钮来启用 webhooks

Alt 激活传入的网络钩子

页面下方的新部分将被发现。向下滚动并单击将新 Webhook 添加到工作区按钮。在下一页上,选择要将报告发送到的渠道,然后点击授权

您将被重定向回 webhook 的设置页面,并且您会看到表中列出了一个新的 webhook。单击“复制”将其复制到剪贴板并记下以备后用。

然后,打开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_username、创建 web 挂钩的用户的用户your_channel_name名以及所需频道的名称。保存并关闭文件。

要测试集成,您可以通过运行生成报告vuls report,如下所示:

  • sudo vuls report -to-slack

Vuls 需要一些时间才能运行并成功退出。如果显示错误,请根据前面的行检查您输入的内容。

您可以检查 Slack 应用并确认 Vuls 已成功发送报告。

Slack 发布报告的 Alt 标题

现在您已经配置了报告,您将设置计划扫描。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 scanvuls report与每天中午给定的配置(表示为0 0 * * *cron语法)。

保存并关闭文件。

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

结论

您现在已经在 Ubuntu 18.04 服务器上成功设置了具有自动扫描和报告功能的 Vul。有关更多报告选项以及故障排除,请访问Vuls 文档

使用 Vuls,漏洞评估在生产环境中变得更加无缝。作为设置的替代方法cron,也可以在持续部署工作流中使用 Vul ,因为它的扫描是轻量级的,您可以根据需要运行它们。您还可以考虑使用 Vuls实施防火墙来限制访问并减少对 root 访问的需要。

觉得文章有用?

点个广告表达一下你的爱意吧 !😁