作为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
要下载和编译的依赖,你会安装git
,gcc
,make
,sqlite
,debian-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 需要一些您将设置的环境变量:GOPATH
和PATH
. GOPATH
指定 Go 的工作目录和PATH
(其中包含放置程序的目录)必须扩展以告诉系统在哪里可以找到 Go 本身。
每次用户登录时都需要设置这些环境变量。要自动执行此操作,您将go-env.sh
在/etc/profile.d
. 这将导致每次用户登录时都会执行该目录。
go-env.sh
使用文本编辑器创建:
- sudo nano /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 包。然后,您将运行它并获取漏洞数据以供 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-dictionary
Ubuntu下载、安装和获取 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
您将看到类似于以下内容的输出:
OutputINFO[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
输入以下配置:
[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
) 将 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。
- 详细信息:占据屏幕左侧,显示从数据库中提取的有关漏洞的详细信息。
- 受影响的包:位于详细信息的右侧,显示受影响的包版本,以及是否有固定版本。
您可以通过按 来在面板之间循环光标ENTER
,然后使用键盘箭头进行导航。
在此步骤中,您运行了本地扫描并检查了结果。在下一个可选部分中,您将配置 Vul 以扫描多台目标机器。
步骤 7 —(可选)配置多个目标机器
在本节中,您将配置 Vul 以扫描多台目标机器。这需要/etc/sudoers
在目标上进行配置并配置 Vul 来扫描目标。
在上一步中,您将 Vuls 配置为扫描本地机器 ( localhost
)。您可以根据需要添加任意数量的服务器,前提是您具备以下条件:
- 目标服务器的 IP
- 对目标服务器的 root 访问权限
- 目标服务器上的可用帐户(
sammy-shark
在本教程中)
您只能在目标服务器上使用非 root 用户帐户以快速模式进行扫描。要在快速根模式和深度模式下启用扫描,您需要/etc/sudoers
在目标机器上编辑文件。该sudoers
文件控制哪些用户可以运行哪些命令,以及指定命令是否需要密码。
由于visudo
是用于定义访问和特权访问规则的实用程序,因此您只能将其作为root
. 由于 的重要性sudoers
,文件不会在没有给出警告的情况下以错误退出。
在目标服务器上,以身份登录root
并sudoers
通过运行visudo
以下命令打开进行编辑:
- visudo
将此行添加到文件末尾:
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
将通知您并提供重新编辑或退出。
注意:通过允许sammy-shark
用户进入sudoers
,您将允许 Vul 使用快速根模式和深度模式进行扫描。如果你想允许本地机器的模式(localhost
)也一样,编辑sudoers
就localhost
如前所示。
Vuls 使用该checkrestart
实用程序来检查已更新但需要重新启动的软件包。要确保目标服务器拥有它,请以非 root 用户身份登录,并通过运行以下命令进行安装:
- sudo apt install debian-goodies -y
这就是您需要在目标服务器上做的全部工作;您现在可以从目标注销并重新登录到您的第一台服务器。
要添加新服务器进行扫描,请打开config.toml
并在[servers]
标记下添加以下行:
[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_key
RSA 密钥的路径。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。
通过翻转标题Activate Incoming Webhooks旁边的开关按钮来启用 webhooks。
页面下方的新部分将被发现。向下滚动并单击将新 Webhook 添加到工作区按钮。在下一页上,选择要将报告发送到的渠道,然后点击授权。
您将被重定向回 webhook 的设置页面,并且您会看到表中列出了一个新的 webhook。单击“复制”将其复制到剪贴板并记下以备后用。
然后,打开config.toml
进行编辑:
- sudo nano 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 已成功发送报告。
现在您已经配置了报告,您将设置计划扫描。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
与每天中午给定的配置(表示为0 0 * * *
在cron
语法)。
保存并关闭文件。
在此步骤中,您已将 Vuls 连接到您的 Slack 工作区并配置cron
为每天中午运行 Vuls 扫描和报告。
结论
您现在已经在 Ubuntu 18.04 服务器上成功设置了具有自动扫描和报告功能的 Vul。有关更多报告选项以及故障排除,请访问Vuls 文档。
使用 Vuls,漏洞评估在生产环境中变得更加无缝。作为设置的替代方法cron
,也可以在持续部署工作流中使用 Vul ,因为它的扫描是轻量级的,您可以根据需要运行它们。您还可以考虑使用 Vuls实施防火墙来限制访问并减少对 root 访问的需要。