如何在Ubuntu18.04上安装和配置SNMP守护程序和客户端
作为 Write for DOnations 计划的一部分,作者选择了 Internet Archive 来接收捐赠。
介绍
作为系统管理员的很大一部分工作是收集有关您的服务器和基础架构的准确信息。 有许多工具和选项可用于收集和处理此类信息。 其中许多是建立在称为 SNMP 的技术之上的。
SNMP 代表简单网络管理协议。 这是服务器可以共享有关其当前状态的信息的一种方式,也是管理员可以修改预定义值的渠道。 虽然协议本身是轻量级的,但实现 SNMP 的程序结构的复杂性会迅速增加。 有关 SNMP 协议基础知识的更多信息,请参阅我们的 An Introduction to SNMP 文章。
在本指南中,您将设置工具以使用 SNMP 进行通信。 您将使用两台 Ubuntu 18.04 服务器进行演示。 一个将包含 SNMP 管理器,它将与代理对话以实现网络设备。 这将被称为 管理服务器 。 另一台服务器将具有 SNMP 代理,它将根据管理服务器的命令进行操作。 这将被称为 代理服务器 。 您也可以选择在管理器机器上安装代理,但将它们分开可以更容易地演示每个组件提供的功能。
先决条件
要遵循本教程,您将需要:
- 按照 Initial Server Setup Guide for Ubuntu 18.04 设置两台 Ubuntu 18.04 服务器,包括具有 sudo 权限的非 root 用户和使用 ufw 配置的防火墙。
第 1 步 — 安装 SNMP 守护程序和实用程序
您可以通过在 Ubuntu 服务器上安装守护程序和工具来开始探索如何在系统上实现 SNMP。
从您的本地计算机上,以非 root 用户身份登录到 管理服务器 :
ssh your_username@manager_server_ip_address
更新 APT 包管理器 的包索引:
sudo apt update
接下来,安装 SNMP 软件:
sudo apt install snmp snmp-mibs-downloader
snmp
软件包提供了一组命令行工具,用于向代理发出 SNMP 请求。 snmp-mibs-downloader
软件包将帮助安装和管理 管理信息库 (MIB) 文件,这些文件跟踪网络对象。
然后,在本地机器上打开一个新终端并登录到 代理服务器 :
ssh your_username@agent_server_ip_address
在 代理服务器 上,更新包索引:
sudo apt update
然后,安装 SNMP 守护进程
sudo apt install snmpd
请注意,您不需要 snmp-mibs-downloader
软件包,因为 代理服务器 不会管理 MIB 文件。
现在您已经安装了这些组件,您将配置您的 管理服务器 。
第 2 步 — 配置 SNMP 管理器服务器
如前所述,大部分工作都发生在 代理服务器 中,因此您在 管理服务器 上的配置将较少涉及。 您只需修改一个文件以确保 SNMP 工具可以使用您安装的额外 MIB 数据。
在您的 管理服务器 上,使用 sudo 权限在文本编辑器中打开 /etc/snmp/snmp.conf
文件。 本教程将使用 nano
:
sudo nano /etc/snmp/snmp.conf
在这个文件中,有一些注释和一个未注释的行。 要允许管理器导入 MIB 文件,请注释掉 mibs :
行:
/etc/snmp/snmp.conf
# As the snmp packages come without MIB files due to license reasons, loading # of MIBs is disabled by default. If you added the MIBs you can reenable # loading them by commenting out the following line. #mibs :
保存并关闭 snmp.conf
,方法是按 CTRL+X
,然后按 Y
,然后按 ENTER
(如果您正在使用 nano
)。
您现在已完成配置 管理器服务器 ,但您仍需要使用此服务器来帮助配置您的 代理服务器 ,您将在下一步中执行此操作。
第 3 步 — 配置 SNMP 代理服务器
作为一个真正的客户端-服务器系统, 代理服务器 没有任何配置自己的 SNMP 设置所需的外部工具。 您可以修改一些配置文件以进行一些更改,但您需要进行的大部分更改将通过从管理服务器连接到您的 代理服务器 来完成。
在本教程中,您将使用 SNMP 协议的版本 3。 与 SNMPv1 和 v2 不同,在 SNMPv3 中,每条消息都包含经过编码的安全参数。 在此步骤中,您将配置 SNMPv3 身份验证和访问控制规则。
首先,在您的 代理服务器 上,使用 sudo 权限打开守护进程的配置文件:
sudo nano /etc/snmp/snmpd.conf
在内部,您将不得不进行一些更改。 这些将主要用于引导您的配置,以便您可以从其他服务器对其进行管理。
首先,您需要更改 agentAddress
指令。 目前,它被设置为只允许来自本地计算机的连接。 您需要注释掉当前行,并取消注释下面的行,这允许所有连接。
/etc/snmp/snmpd.conf
# Listen for connections from the local system only #agentAddress udp:127.0.0.1:161 # Listen for connections on all interfaces (both IPv4 *and* IPv6) agentAddress udp:161,udp6:[::1]:161
注意: 由于允许像这样的所有连接不是安全最佳实践,因此最好确保在引导完成后尽快将其锁定。
接下来,您将临时插入 createUser
行。 这些指令通常不保存在这个文件中; 稍后您将再次删除它。
您正在创建的用户将被称为 bootstrap 并将用作创建您的第一个实际用户的模板。 SNMP 包通过克隆用户属性的过程来做到这一点。
定义新用户时,您必须指定身份验证类型(MD5 或 SHA),并提供至少八个字符的密码。 如果您打算像本教程中那样使用加密进行传输,您还必须指定隐私协议(DES 或 AES)和可选的隐私协议密码。 如果未提供隐私协议密码,则身份验证密码也将用于隐私协议。
将此 createUser
行添加到文件末尾:
/etc/snmp/snmpd.conf
... createUser bootstrap MD5 temp_password DES
现在您已经指定了一个新用户,您可以设置该用户将拥有的访问级别。 在本教程中,您将为您的 bootstrap 用户以及您将创建的名为 demo 的新用户进行设置。 您将允许他们使用 rwuser
指令进行读写访问(替代方法是 rouser
进行只读访问)。
您还将通过在用户之后指定 priv
来强制使用加密。 如果您想将用户限制在 MIB 的特定部分,您可以在行尾指定用户应该有权访问的最高级别 对象标识符 (OID)。
出于本教程的目的,您的两行将如下所示:
/etc/snmp/snmpd.conf
... rwuser bootstrap priv rwuser demo priv
完成这些更改后,保存并关闭文件。
要实现这些更改,请在 代理服务器 上重新启动 snmpd
服务:
sudo systemctl restart snmpd
SNMP 守护进程将侦听端口 :161
上的连接。 配置 UFW 以允许从 管理服务器 到此端口的连接:
sudo ufw allow from manager_server_ip_address to any port 161
您可以在 如何在 Ubuntu 18.04 上使用 UFW 设置防火墙中了解有关 UFW 的更多信息。
现在 代理服务器 已配置,您可以从 管理服务器 连接到您的 代理服务器 以验证连接。
第 4 步 — 验证对代理服务器的身份验证
在这一步中,您将测试以确保您可以使用您的 bootstrap 帐户连接到 代理服务器 。 然而,在此之前,本教程将讨论发送 SNMP 命令的一般结构。
当使用 snmp
软件包中包含的工具套件(net-snmp
软件套件)时,您必须调用命令的方式有一些模式。 首先要做的是使用您希望与之通信的 SNMP 守护程序进行身份验证。 这通常涉及提供几条信息。 常见的有以下几种:
-v
:此标志用于指定您要使用的 SNMP 协议的版本。 本教程将使用 v3。-c
:如果您使用 SNMP v1 或 v2 样式的社区字符串进行身份验证,则使用此标志。 由于您使用的是 v3 样式的基于用户的身份验证,因此您不需要这样做。-u
:此参数用于指定您希望进行身份验证的用户名。 要使用 SNMP 读取或修改任何内容,您必须使用已知用户名进行身份验证。-l
:用于指定您连接的安全级别。 可能的值是noAuthNoPriv
表示不认证和不加密,authNoPriv
表示认证但不加密,以及authPriv
表示认证和加密。 您使用的用户名必须配置为在您指定的安全级别下运行,否则身份验证将不会成功。-a
:该参数用于指定使用的认证协议。 可能的值为MD5
或SHA
。 这必须与创建用户时指定的信息相匹配。-x
:该参数用于指定使用的加密协议。 可能的值为DES
或AES
。 这必须与创建用户时指定的信息相匹配。 每当用户的权限规范后面有priv
时,这是必需的,从而强制加密。-A
:用于提供在创建用户时指定的身份验证密码。-X
:这是在创建用户时指定的加密密码。 如果没有指定但给出了加密算法,则将使用身份验证密码。 当给定-x
参数或用户的权限规范后面有priv
时,这是必需的,需要加密。
使用此信息,您可以构建命令。 鉴于您如何设置 bootstrap 用户,您将使用该帐户的命令将如下所示:
snmp_command -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host snmp_sub_command_or_options
从您的 管理服务器 进行测试以确保您的 bootstrap 帐户可用。 键入以下内容以显示 代理服务器 的系统信息:
snmpget -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address 1.3.6.1.2.1.1.1.0
1.3.6.1.2.1.1.1.0
字符串是负责显示系统信息的 OID。 它将在远程系统上返回 uname -a
的输出。
这将给出以下输出:
OutputSNMPv2-MIB::sysDescr.0 = STRING: Linux agent 4.15.0-66-generic #75-Ubuntu SMP Tue Oct 1 05:24:09 UTC 2019 x86_64
现在您已经验证您可以对运行 SNMP 守护程序的服务器进行身份验证,您可以继续创建您的常规用户帐户。
第 5 步 — 设置普通用户帐户
尽管您已经在 snmpd.conf
文件中指定了 demo 用户帐户的权限,但您实际上还没有创建此用户。 在这一步中,您将使用 bootstrap 用户作为新用户的模板。 您将使用用于用户管理的 snmpusm
工具来执行此操作。
在 管理服务器 上,您可以使用 snmpusm
工具和以下通用语法从模板创建用户:
snmpusm authentication_info agent_server_ip_address create new_user existing_user
使用您对需要通过的身份验证标志的了解,并利用您已有的用户帐户(bootstrap),您可以创建一个符合您已经定义的用户权限的用户(demo )。
该命令将如下所示:
snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address create demo bootstrap
您将收到以下消息:
OutputUser successfully created.
现在,您的 代理服务器 上有一个功能齐全的用户,名为 demo。 但是,它仍然使用与 bootstrap 帐户相同的身份验证信息。 为了提高安全性,您可以将密码更改为其他内容。 这次,您将使用 demo 帐户进行身份验证。 请记住,密码长度必须至少为八个字符:
snmpusm -u demo -l authPriv -a MD5 -x DES -A temp_password -X temp_password agent_server_ip_address passwd temp_password new_password
您将收到以下消息:
OutputSNMPv3 Key(s) successfully changed.
您可以通过询问 代理服务器 SNMP 服务运行了多长时间来测试您的新凭据和密码。 您将使用 snmpget
命令从 代理服务器 获取单个值。
这一次,利用您下载的额外 MIB 定义通过名称而不是 OID 数字 ID 来请求值。
snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0
您将返回一个表示远程 SNMP 守护程序上次重新启动时间的值:
OutputDISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (53309) 0:08:53.09
您现在有一个名为 demo 的工作用户帐户。 在下一步中,您将通过配置客户端来简化 SNMP 命令的使用。
第 6 步 — 创建客户端配置文件
此时您可能已经注意到,所有 SNMP 命令的身份验证详细信息对于每个请求都是相当静态的。 您可以创建一个包含您正在连接的凭据的客户端配置文件,而不是每次都输入这些内容。
客户端配置文件可以放置在两个不同的位置,具体取决于您希望共享它的广泛程度。
如果您想与管理计算机上的任何有效用户共享您的登录凭据,您可以将配置详细信息放入 管理服务器 上的全局 snmp.conf
文件中。 您需要使用 sudo 权限打开该文件:
sudo nano /etc/snmp/snmp.conf
但是,如果您想单独为您的用户定义身份验证凭据,您可以在 管理器服务器 上的用户主目录中创建一个隐藏的 .snmp
目录,并在那里创建文件:
mkdir ~/.snmp nano ~/.snmp/snmp.conf
无论您决定将配置放置在何处,内容都是相同的。
您将用于进行身份验证的命令如下表所示。 在右侧列中,您可以看到用于在 snmp.conf
文件中设置这些配置详细信息的指令名称:
命令标志 | 描述 | 翻译的 snmp.conf 指令
|
---|---|---|
-u username
|
要进行身份验证的 SNMPv3 用户名。 | defSecurityName username
|
-l authPriv
|
要进行身份验证的安全级别。 | defSecurityLevel authPriv
|
-a MD5
|
要使用的身份验证协议。 | defAuthType MD5
|
-x DES
|
要使用的隐私(加密)协议。 | defPrivType DES
|
-A passphrase
|
提供的用户名的身份验证密码。 | defAuthPassphrase passphrase
|
-X passphrase
|
提供的用户名中的隐私密码。 | defPrivPassphrase passphrase
|
使用此信息,您可以构建适当的 snmp.conf
文件。 对于本指南,它将如下所示:
snmp.conf
defSecurityName demo defSecurityLevel authPriv defAuthType MD5 defPrivType DES defAuthPassphrase new_password defPrivPassphrase new_password
完成后,保存并关闭文件。
现在,您可以在不提供身份验证详细信息的情况下发出命令。 您只需要 SNMP 命令、主机和命令参数。
而不是键入:
snmpget -u demo -l authPriv -a MD5 -x DES -A new_password -X new_password agent_server_ip_address sysUpTime.0
您可以键入:
snmpget agent_server_ip_address sysUpTime.0
如您所见,这大大减少了您需要在每个请求中提供的信息量。 接下来,您将删除 bootstrap 帐户以加强网络安全。
第 7 步 — 删除引导帐户
现在您的常规帐户已正确配置,您可以删除不安全的 bootstrap 帐户。
在您的 代理服务器 上,使用 sudo 权限再次打开 /etc/snmp/snmpd.conf
文件。
sudo nano /etc/snmp/snmpd.conf
查找并注释掉(或删除)您之前添加的引用 bootstrap 用户的两行:
/etc/snmp/snmpd.conf
... #createUser bootstrap MD5 temp_password DES #rwuser bootstrap priv ...
保存并关闭文件。
现在,重新启动 SNMP 守护进程:
[environment second] sudo systemctl restart snmpd
这将满足在普通 snmpd.conf
文件中没有 createUser
指令的建议。 它还将删除该临时用户的权限。
如果要从 usmUserTable
中完全删除 bootstrap 用户,可以通过从 管理服务器 发出以下命令来实现:
snmpusm agent_server_ip_address delete bootstrap
您将收到以下回复:
OutputUser successfully deleted.
结论
此时,您拥有一个完全配置的客户端-服务器设置,可以使用 SNMP 协议进行安全通信。 您现在可以在其他主机上添加额外的守护进程,并在整个基础架构中配置帐户访问权限。
如需进一步学习,您可以使用我们的 如何使用 Net-SNMP 工具套件管理和监控服务器教程 了解 SNMP 工具以及如何使用它们逐个或批量检索值以及如何修改数据。