作者选择了 自由和开源基金作为 写给捐款计划的一部分接受捐款。
介绍
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-goodies
和wget
。sqlite
是一个数据库系统,您将在这里使用它来存储漏洞信息。
您可以在一个命令中安装它们:
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 需要设置几个环境变量: GOPATH
和 PATH
. 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
导出
命令将所给定的环境变量设置为所需的值. 在这里,您使用它来填充GOPATH
和PATH
与相应的值。
保存并关闭文件。
目前,‘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在安装的软件包中发现的漏洞。
- 详细信息占据屏幕的左侧,显示了数据库中提取的有关漏洞的详细信息。
您可以通过按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 上为您的工作空间设置一个 入口 webhook。 Incoming webhooks 允许应用程序提供来自其他应用程序的实时信息。
如果您尚未创建 Webhook,您首先需要为您的工作区创建应用程序。 要做到这一点,请先登录 Slack 并导航到 Slack 的 应用创建页面。
您将被重定向到新应用程序的设置页面,在左导航栏中选择 Incoming Webhooks项。
要启用 Webhooks,请将标题旁边的开关按钮转移到 ** 启用入口 Webhooks** 到 ** 启用**。
一旦激活,页面将加载一个新部分。滚动到并按下 新 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 已成功将报告发送到指定的频道。
现在你已经配置了报告,你可以设置日程扫描。 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,因为其扫描很轻,您可以根据需要运行它们。