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

Vuls是一个用Go编写的开源无代理漏洞扫描程序。它可以自动对系统上安装的软件进行安全漏洞分析。在本教程中,您将把Vuls部署到Ubuntu 18.04服务器 - 从源代码构建Vuls及其依赖项,配置扫描和报告到Slack,并可选择将其连接到目标计算机以启用远程扫描。

作者选择了自由和开源基金作为Write for DOnations计划的一部分进行捐赠。

介绍

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

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

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

先决条件

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

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

第1步 - 安装依赖项

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

sammy身份登录开始:

ssh sammy@your_server_ip

在本教程中,您将所有与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-goodiesgolang-gowget

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

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

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

您现在已经安装了所需的软件包,包括Go。

为了工作,Go需要一些你要设置的环境变量: GOPATHPATH 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

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 ,这是一个Go包,提供对NVD (国家漏洞数据库)的访问。 然后,您将运行它并获取要使用的Vuls的漏洞数据。 NVD是美国政府公开报告的网络安全漏洞存储库,包含漏洞ID(CVE - 常见漏洞和暴露),摘要和影响分析,并以机器可读格式提供。

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

您将首先安装由kotakanbe制作的go-cve-dictionary ,通过从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通过传递-years $i获取当前(循环)年份的NVD数据。 然后,它将此信息存储在/usr/share/ vuls-data下的数据库中。

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

在此步骤中,您已下载并安装了go-cve-dictionary ,并为Vuls提取了NVD数据以供以后使用。 在下一节中,您将下载并安装goval-dictionary并获取Ubuntu的OVAL数据。

第3步 - 安装并运行goval-dictionary

在本节中,您将下载并编译goval-dictionary ,这是一个Go包,可以访问Ubuntu的OVAL数据库。 然后,您将运行它并获取要使用的Vuls的漏洞数据。 OVAL代表开放漏洞和评估语言,它是一种开放式语言,用于表示检查以确定给定系统上是否存在软件漏洞。

同一作者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数据。 在下一步中,您将下载并安装Vuls。

第4步 - 下载和配置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

输入以下配置:

/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"

[servers]

[servers.localhost]
host = "localhost"
port = "local"
scanMode = [ "fast" ]
#scanMode = ["fast", "fast-root", "deep", "offline"]

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

Vuls提供四种扫描模式:

  • 快速模式 (默认):没有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以扫描本地服务器。 在下一步中,您将运行本地扫描并查看生成的报告。

第5步 - 运行本地扫描

在本节中,您将运行本地扫描,然后查看生成的漏洞报告。 到目前为止,您只配置了本地服务器,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扫描的机器。
  • 发现漏洞:位于计算机列表右侧,显示Vuls在已安装软件包中发现的漏洞。
  • 详细信息:占据屏幕的左侧部分,显示从数据库中提取的有关漏洞的详细信息。
  • 受影响的软件包:位于详细信息的右侧,显示受影响的软件包版本以及是否存在固定版本。

Alt vuls报告视图

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

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

第6步 - (可选)配置多个目标计算机

在本节中,您将配置Vuls以扫描多个目标计算机。 这需要在目标上配置/etc/sudoers并配置Vuls以扫描目标。

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

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

您只能在目标服务器上使用非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 updatecheckrestart以及stat提供的每个命令,而无需提供密码。

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

注意:通过允许sammy-shark用户使用sudoers ,您允许Vuls使用快速根深度模式进行扫描。 如果您也想为本地计算机( localhost )允许这些模式,请在localhost编辑sudoers ,如前所示。

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 ,使用目标服务器的IP替换target_ip ,使用用户名替换account_rsa_key使用带有RSA密钥路径的account_rsa_key替换。 Vuls不支持SSH密码验证,因此需要指定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工作区。

第7步 - 配置定期扫描和报告松弛

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

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

如果您还没有创建过webhook,则首先需要为工作区创建一个应用程序。 要执行此操作,请首先登录Slack并导航到应用程序创建页面 选择您将识别的名称,选择所需的工作区,然后单击“ 创建应用程序”

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

Alt左侧导航栏“传入webhooks”

通过翻转标题Activate Incoming Webhooks旁边的切换按钮启用webhooks

Alt激活传入的Web挂钩

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

您将被重定向回webhooks的设置页面,您将看到表中列出的新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生成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 (在cron语法中用0 0 * * *表示)。

保存并关闭文件。

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

结论

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

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


分享按钮