Linux 下使用 SNMPv3 进行安全网络监控

CompTIABeginner
立即练习

介绍

在本实验中,你将学习如何在 Linux 系统上使用简单网络管理协议版本 3 (SNMPv3) 实现安全的网络监控。你将专注于配置 SNMP 代理 (snmpd) 以强制执行强身份验证和加密,确保管理数据在传输过程中受到保护,并超越旧版 SNMP 的不安全性。

该过程首先在你的系统上安装必要的 SNMP 代理和客户端工具。然后,你将直接在配置文件中创建一个具有安全凭据的专用 SNMPv3 用户。最后,你将使用 snmpwalk 命令行工具对配置好的代理执行安全查询,验证你的设置,并探索如何使用对象标识符 (OIDs) 检索特定的系统信息。

安装 SNMP 代理和客户端工具

在此步骤中,你将安装使用简单网络管理协议 (SNMP) 进行网络监控所需的核心组件。我们将安装 SNMP 代理(运行在需要监控的设备上)和客户端工具(用于查询代理)。

首先,更新系统的软件包列表是一项标准的最佳实践。这可以确保你获得存储库中提供的最新、最安全的软件版本。

执行以下命令来更新你系统上的软件包索引:

sudo apt update

你将看到显示从 Ubuntu 存储库获取软件包列表的输出。

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,587 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

现在你的软件包列表已更新,可以安装 SNMP 代理(守护进程)和客户端实用程序了。代理由 snmpd 包提供,客户端工具(如 snmpwalksnmpget)则在 snmp 包中。

运行以下命令来安装这两个包。-y 标志会自动确认安装,因此你不会被提示。

sudo apt install snmpd snmp -y

安装过程将下载并配置必要的文件。完成后,snmpd 服务(即代理守护进程)应该会自动启动。

要确认 SNMP 代理是否正常运行,你可以使用 systemctl 来检查 snmpd 服务的状态。

sudo systemctl status snmpd

输出应显示服务状态为 active (running)。这确认了 SNMP 代理已准备好接收请求。

● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
     Loaded: loaded (/lib/systemd/system/snmpd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
   Main PID: 1234 (snmpd)
      Tasks: 1 (limit: 4595)
     Memory: 9.8M
        CPU: 35ms
     CGroup: /system.slice/snmpd.service
             └─1234 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f

如果看到状态屏幕,你可以按键盘上的 q 键退出并返回到命令提示符。

随着代理的运行和客户端工具的安装,你的环境现在已为 SNMP 配置和通信做好准备。

在 snmpd.conf 中创建安全 SNMPv3 用户

在此步骤中,你将配置 SNMP 代理 (snmpd) 使用 SNMPv3,它提供了重要的安全功能。与旧版本不同,SNMPv3 支持身份验证(用于验证发送者的身份)和隐私(用于加密数据)。你将通过在代理的配置文件 /etc/snmp/snmpd.conf 中直接创建一个新用户来实现这一点。

在进行任何更改之前,创建原始配置文件备份是一项关键的最佳实践。这可以让你在出现问题时轻松恢复它。

执行以下命令来复制配置文件:

sudo cp /etc/snmp/snmpd.conf /etc/snmp/snmpd.conf.bak

现在,你将编辑主配置文件 /etc/snmp/snmpd.conf 来添加一个新的 SNMPv3 用户。我们将为此任务使用 nano 文本编辑器。

运行此命令以 sudo 权限打开文件:

sudo nano /etc/snmp/snmpd.conf

滚动到文件末尾,并添加以下行。这些行定义了一个名为 labexuser 的新用户,使用强身份验证 (SHA) 和隐私 (AES) 协议。

  • createUser: 此指令用于创建 SNMPv3 用户。
    • labexuser: 你的 SNMPv3 用户的用户名。
    • SHA: 身份验证协议(比 MD5 更安全)。
    • AuthPassLabEx: 身份验证密码(必须至少包含 8 个字符)。
    • AES: 隐私(加密)协议(比 DES 更安全)。
    • PrivPassLabEx: 隐私密码(必须至少包含 8 个字符)。
  • rwuser: 此指令授予用户在使用 priv 安全级别(身份验证和隐私)时对整个 OID 树的读写访问权限。

复制并粘贴以下配置块到文件末尾:

## --- LabEx SNMPv3 User Configuration ---
## Create a secure SNMPv3 user for monitoring
createUser labexuser SHA "AuthPassLabEx" AES "PrivPassLabEx"

## Grant the new user read-write access with privacy
rwuser labexuser priv
## --- End of Configuration ---

添加文本后,保存文件并退出 nano:按 Ctrl+O,然后按 Enter 确认文件名,最后按 Ctrl+X 退出。

你现在已成功配置了用于 SNMPv3 通信的安全用户。在下一步中,你将重启服务以应用这些更改。

重启并验证 snmpd 服务

在此步骤中,你将应用在上一步中添加的新用户配置。每当你修改正在运行的服务(如 snmpd)的配置文件时,更改不会自动生效。你必须重启服务,使其重新读取其配置文件并加载新设置。

首先,使用 systemctl 命令重启 snmpd 服务。这将停止当前进程,并启动一个新进程,加载包含你的 labexuser 的更新后的配置。

sudo systemctl restart snmpd

如果命令成功执行,通常不会产生任何输出。

接下来,至关重要的是验证服务是否已成功重启。如果你的 /etc/snmp/snmpd.conf 文件中有任何语法错误,服务可能会启动失败。你可以检查其当前状态以确认它是否正常运行。

sudo systemctl status snmpd

你应该看到确认服务状态为 active (running) 的输出。注意时间戳,它应该显示服务是最近才启动的。

● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
     Loaded: loaded (/lib/systemd/system/snmpd.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:35:00 UTC; 3s ago
   Main PID: 5678 (snmpd)
      Tasks: 1 (limit: 4595)
     Memory: 10.1M
        CPU: 40ms
     CGroup: /system.slice/snmpd.service
             └─5678 /usr/sbin/snmpd -Lsd -Lf /dev/null -u Debian-snmp -g Debian-snmp -I -smux mteTrigger mteTriggerConf -f

记住按 q 键退出状态视图并返回到终端。

看到 active (running) 状态确认了你的配置更改是有效的,SNMP 代理现在正在运行,并且新的 labexuser 已准备好进行安全通信。

使用 SNMPv3 工具执行安全查询

在此步骤中,你将使用 SNMP 客户端工具对运行在你本地机器上的 SNMP 代理执行安全查询。你将使用你在 snmpd.conf 中配置的 labexuser 凭据来测试安全的 SNMPv3 通信。这是检验你的安全配置是否生效的时刻。

SNMPv3 的 SNMP 命令需要几个特定的标志来处理身份验证和隐私。以下是你将使用的参数的细分:

  • -v 3: 指定你正在使用 SNMP 版本 3。
  • -l authPriv: 将安全级别设置为 authPriv,这意味着通信需要身份验证隐私(加密)。这是最高安全级别。
  • -u labexuser: 指定用户名,即你创建的 labexuser
  • -a SHA: 将身份验证协议定义为 SHA。这必须与你在 snmpd.conf 中设置的协议匹配。
  • -A "AuthPassLabEx": 提供身份验证密码。
  • -x AES: 将隐私(加密)协议定义为 AES。这同样必须与你的配置匹配。
  • -X "PrivPassLabEx": 提供隐私密码。
  • localhost: SNMP 代理运行的目标主机。在这种情况下,是你的本地机器。

首先,让我们通过 walk 整个系统树来测试连接。snmpwalk 命令会遍历 OID 树并返回分支内的所有对象。

理解 OID 结构: 对象标识符 (OIDs) 使用分层编号系统。OID 1.3.6.1.2.1.1 代表标准 SNMP MIB-II 中的“system”组:

  • 1.3.6.1 = internet
  • 1.3.6.1.2 = mgmt (management)
  • 1.3.6.1.2.1 = mib-2 (standard MIB)
  • 1.3.6.1.2.1.1 = system group (包含基本的系统信息)

执行以下命令来 walk 系统 MIB 树:

snmpwalk -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1

如果命令成功,你将看到多个与系统相关的 OID 及其值。这证实了你的 SNMP 管理器已成功通过代理 (snmpd) 进行身份验证,并且查询是通过安全、加密的通道执行的。

SNMPv2-MIB::sysDescr.0 = STRING: Linux labex-vm 5.15.0-XX-generic #XX-Ubuntu SMP ...
SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-TC::linux
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (123456) 0:20:34.56
SNMPv2-MIB::sysContact.0 = STRING: Me <me@example.org>
SNMPv2-MIB::sysName.0 = STRING: labex-vm
SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay
...

成功的响应证明了你的整个 SNMPv3 设置正在正常工作。如果你使用了不正确的凭据或协议,该命令将因身份验证错误而失败。

使用 snmpget 查询特定 OID

在此步骤中,你将学习使用 snmpget 命令检索特定的系统信息。虽然 snmpwalk 会遍历整个 OID 树,但 snmpget 设计用于查询特定的对象标识符 (OIDs) 以进行精确的信息检索。

既然你已经拥有一个正常运行且安全的 SNMPv3 设置,你就可以查询特定的系统信息了。OID 在设备的管理信息库 (MIB) 中唯一地指向一个受管理的信息片段。

OID 层级结构解释: SNMP OID 树遵循国际标准 ISO/IEC 对象标识符层级结构:

1 (iso)
└── 3 (org)
    └── 6 (dod)
        └── 1 (internet)
            └── 2 (mgmt)
                └── 1 (mib-2)
                    └── 1 (system)
                        ├── 1.0 (sysDescr)
                        ├── 3.0 (sysUpTime)
                        ├── 4.0 (sysContact)
                        ├── 5.0 (sysName)
                        └── 6.0 (sysLocation)

这解释了为什么系统信息以 1.3.6.1.2.1.1 开头——这是 MIB-II 中系统组的标准路径。

让我们查询一个特定且常用的 OID:系统描述。此 OID 检索受管理设备的基本文本描述。

理解特定 OID: 在 system 组 (1.3.6.1.2.1.1) 中,每个信息片段都有一个特定的子标识符:

  • 1.3.6.1.2.1.1.1.0 = sysDescr.0 (系统描述)
  • 1.3.6.1.2.1.1.3.0 = sysUpTime.0 (系统运行时间)
  • 1.3.6.1.2.1.1.4.0 = sysContact.0 (系统联系人)
  • 1.3.6.1.2.1.1.5.0 = sysName.0 (系统名称)
  • 1.3.6.1.2.1.1.6.0 = sysLocation.0 (系统位置)

末尾的 .0 表示这是一个标量值(单个实例),而不是表项。

执行以下命令查询系统描述:

snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.1.0

输出将显示系统描述,确认你的 SNMPv3 身份验证和隐私设置正常工作:

iso.3.6.1.2.1.1.1.0 = STRING: "Linux iZrj9ixg5sv0oem6yeu6aqZ 5.15.0-56-generic ..."

接下来,让我们使用数字 OID 1.3.6.1.2.1.1.3.0(对应于 sysUpTime.0)来查询系统运行时间。此 OID 报告自系统网络管理部分上次重新初始化以来经过的时间:

snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.3.0

输出将以“Timeticks”格式显示运行时间,该格式表示百分之一秒,并附带人类可读的格式:

iso.3.6.1.2.1.1.3.0 = Timeticks: (48642) 0:08:06.42

最后,你可以通过在命令末尾列出它们来在单个命令中查询多个 OID。让我们使用它们的数字 OID 一起检索系统描述和联系人信息。

为何使用数字 OID? 在某些环境中,像 sysDescr.0 这样的符号名称可能不被识别,因为:

  • MIB 文件未加载或安装
  • SNMP 客户端配置不包含必要的 MIB 定义
  • 使用数字 OID 可确保跨不同系统的兼容性

执行此命令以同时查询多个 OID:

snmpget -v 3 -l authPriv -u labexuser -a SHA -A "AuthPassLabEx" -x AES -X "PrivPassLabEx" localhost 1.3.6.1.2.1.1.1.0 1.3.6.1.2.1.1.4.0

这将在一份响应中返回两个值:

iso.3.6.1.2.1.1.1.0 = STRING: "Linux iZrj9ixg5sv0oem6yeu6aqZ 5.15.0-56-generic ..."
iso.3.6.1.2.1.1.4.0 = STRING: "Me <me@example.org>"

通过成功查询这些特定的 OID,你已经展示了 SNMP 在安全网络监控方面的核心能力。你现在可以以安全、经过身份验证和加密的方式从设备检索精确的操作数据。

总结

在此实验中,你学习了如何在 Linux 系统上使用 SNMPv3 实现安全网络监控。你首先安装了核心组件,包括 SNMP 代理 (snmpd) 和客户端工具 (snmp),并在更新了系统的软件包存储库之后。主要重点是安全性,你通过在 snmpd.conf 文件中创建一个新的 SNMPv3 用户来配置安全性,该用户配备了强大的身份验证和隐私(加密)协议,以保护传输中的数据。

设置好安全用户后,你重启了 snmpd 服务以应用新配置,并验证了其正常运行。然后,你使用 SNMP 客户端工具对代理执行安全查询,使用你创建的 SNMPv3 用户的凭据进行身份验证。你练习了使用 snmpwalk 来遍历整个 MIB 树分支,以及使用 snmpget 来检索特定的对象标识符 (OIDs)。这展示了如何使用全面的树遍历和精确的单个查询来安全地监控系统信息,例如系统描述、运行时间和联系人详细信息。