介绍
作为系统管理员的重要工作之一是收集关于服务器和基础设施的准确信息。有许多工具和选项可用于收集和处理这种类型的信息。其中许多工具都是建立在一种叫做 SNMP 的技术之上。
SNMP 代表简单网络管理协议。它是服务器可以共享关于其当前状态的信息的一种方式,也是管理员可以修改预定义值的通道。虽然协议本身非常简单,但实现 SNMP 的程序结构可能非常复杂。
在我们的上一篇指南中,我们了解了 SNMP 协议的基础知识。在本指南中,我们将开始演示如何设置使用 SNMP 进行通信的工具。我们将使用两台 Ubuntu 14.04 服务器进行演示,但大多数其他系统应该可以通过一些修改来跟随操作。
安装 SNMP 守护程序和实用工具
我们可以通过在一些 Ubuntu 系统上安装守护程序和工具来开始探索如何在系统上实现 SNMP。
我们将使用两台服务器,一台将包含管理器部分,而另一台服务器将拥有代理。我们也可以选择在管理器机器上安装代理,但保持它们分开可以更容易地演示每个组件提供的功能。
在第一台服务器上,更新 apt 数据库并安装管理器组件。除此之外,我们还将下载另一个名为 snmp-mibs-downloader
的软件包,其中包含一些关于标准 MIB 的专有信息,这些信息允许我们通过名称访问大部分 MIB 树:
sudo apt-get update sudo apt-get install snmp snmp-mibs-downloader
在我们的第二台服务器上,也就是我们将要与之交互并运行守护程序的服务器,我们可以通过输入以下命令来安装必要的组件:
sudo apt-get update sudo apt-get install snmpd
安装了这些组件之后,我们需要配置我们的设置。
配置 SNMP 管理器
正如我们上面提到的,大部分工作都发生在代理组件中,因此我们在这台机器上的配置实际上非常简单。我们只需要修改一个文件,以确保我们的客户端可以使用我们安装的额外 MIB 数据。
使用带有 sudo 权限的文本编辑器打开 /etc/snmp/snmp.conf
文件:
sudo nano /etc/snmp/snmp.conf
在这个文件中,有一些注释和一行未被注释的内容。为了允许管理器导入 MIB 文件,我们只需要注释掉 mibs :
行:
#mibs :
完成后保存并关闭文件。
我们现在已经完成了管理器部分的配置,但我们仍然需要使用这台服务器来帮助我们配置我们的代理计算机。
配置 SNMP 代理机器
作为真正的客户端-服务器系统,代理计算机没有配置其自己的 SNMP 设置所需的外部工具。我们可以修改一些配置文件来进行一些更改,但我们需要通过从管理服务器连接到我们的代理服务器来完成大部分需要进行的更改。
首先,在我们的代理计算机上,我们需要使用带有 sudo 权限的方式打开守护程序的配置文件:
sudo nano /etc/snmp/snmpd.conf
在文件内部,我们需要进行一些更改。这些更改主要用于引导我们的配置,以便我们可以从我们的其他服务器管理它。
首先,我们需要更改 agentAddress
指令。当前,它设置为仅允许来自本地计算机的连接。我们需要注释掉当前行,并取消注释下面的行,该行允许所有连接(我们将很快限制这个):
# 仅监听来自本地系统的连接 #agentAddress udp:127.0.0.1:161 # 在所有接口上监听连接(IPv4 和 IPv6) agentAddress udp:161,udp6:[::1]:161
接下来,我们需要临时插入一个 createUser
行。这些指令通常不会保存在这个文件中,但我们很快会再次删除它,所以这并不太重要。
我们要创建的用户将被称为 bootstrap
,并将用作创建我们的第一个“真实”用户的模板。SNMP 软件通过克隆用户的属性来完成这一过程。
在定义新用户时,您必须指定认证类型(MD5 或 SHA),并提供一个必须至少为 8 个字符的密码。如果您计划对传输使用加密,就像我们一样,您还必须指定隐私协议(DES 或 AES),并可选地提供隐私协议密码。如果未提供隐私协议密码,则认证密码也将用于隐私协议。
我们的用户创建行将如下所示:
createUser bootstrap MD5 temp_password DES
现在我们已经指定了一个新用户,我们需要设置此用户将拥有的访问级别。我们将为我们的 bootstrap
用户设置这一点,并为我们将要创建的新用户 demo
设置这一点。我们将使用 rwuser
指令允许它们读写访问(另一种选择是使用 rouser
进行只读访问)。
我们将通过在用户后面指定 priv
来强制使用加密。如果我们想将用户限制在 MIB 的特定部分,我们可以在行的末尾指定用户应该访问的最高级 OID。
对于我们的目的,我们的两行将非常简单:
rwuser bootstrap priv rwuser demo priv
完成这些更改后,保存并关闭文件。
要实施这些更改,请重新启动 snmpd
服务:
sudo service snmpd restart
现在,从您安装管理软件的机器,我们可以连接到我们的代理服务器以创建我们的常规用户。
我们将使用 snmpusm
工具来执行此操作,该工具用于用户管理。为了使其正常运行,您需要知道您的代理服务器的 IP 地址。
在开始之前,我们将稍微讨论一下发送 SNMP 命令的一般结构。
SNMP 命令的一般结构
在使用 snmp
软件包中包含的工具套件(net-snmp
软件套件)时,您会注意到在调用命令时有一些模式。
首先,您必须使用您希望通信的 SNMP 守护程序进行身份验证。这通常涉及提供相当多的信息。以下是常见的信息:
- -v VERSION:此标志用于指定您希望使用的 SNMP 协议版本。在本指南中,我们将使用 v3。
- -c COMMUNITY:如果您使用 SNMP v1 或 v2 风格的社区字符串进行身份验证,则使用此标志。由于我们使用 v3 风格的基于用户的身份验证,因此我们将不需要这个。
- -u USER-NAME:此参数用于指定您希望进行身份验证的用户名。要使用 SNMP 读取或修改任何内容,您必须使用已知的用户名进行身份验证。
- -l LEVEL:用于指定您正在连接的安全级别。可能的值是
noAuthNoPriv
表示无身份验证和无加密,authNoPriv
表示身份验证但无加密,以及authPriv
表示身份验证和加密。您使用的用户名必须配置为以您指定的安全级别运行,否则身份验证将不会成功。 - -a PROTOCOL:此参数用于指定所使用的身份验证协议。可能的值是
MD5
或SHA
。这必须与创建用户时指定的信息相匹配。 - -x PROTOCOL:此参数用于指定所使用的加密协议。可能的值是
DES
或AES
。这必须与创建用户时指定的信息相匹配。每当用户的特权规范在其后具有priv
时,即要求加密时,就是必需的。 - -A PASSPHRASE:用于提供创建用户时指定的身份验证密码短语。
- -X PASSPHRASE:用于提供创建用户时指定的加密密码短语。如果未指定密码短语但给出了加密算法,则将使用身份验证密码短语。每当给出
-x
参数或每当用户的特权规范在其后具有priv
时,即要求加密时,就是必需的。
有了这些信息,我们就可以开始构建我们的命令。根据我们设置的引导用户,我们将使用该帐户的命令如下:
snmp_command -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host snmp_sub_command_or_options
例如,从您的管理服务器,您可以通过键入以下内容来测试确保您的引导帐户可用:
snmpget -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host 1.3.6.1.2.1.1.1.0
SNMPv2-MIB::sysDescr.0 = STRING: Linux target 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64
1.3.6.1.2.1.1.1.0
字符串是负责显示系统信息的 OID。它基本上会返回远程系统上 uname -a
命令的输出。
现在我们已经验证了我们可以正确地对运行 SNMP 守护程序的服务器进行身份验证,我们可以继续创建我们的常规用户帐户。
设置常规用户帐户
尽管我们已经在 snmpd.conf
文件中指定了 demo
用户帐户的权限,但我们实际上还没有创建这个用户。我们将使用 bootstrap
用户作为我们新用户的模板。
在管理服务器上,我们可以使用 snmpusm
工具和以下一般语法从模板创建用户:
snmpusm authentication_info remote_host create new_user existing_user
因此,根据我们需要传递的身份验证标志以及利用我们已经拥有的用户帐户(bootstrap
),我们可以创建一个符合我们已经定义的用户权限(demo
)的用户。
命令将如下所示:
snmpusm -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host create demo bootstrap
您应该收到以下消息:
用户已成功创建。
现在我们在远程服务器上有一个名为 demo
的完全功能用户。但是,它仍在使用与 bootstrap
帐户相同的身份验证信息。我们应该将密码更改为其他内容。这次,我们将使用 demo
帐户进行身份验证。请记住,密码必须至少为 8 个字符长:
snmpusm -u demo -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_host passwd temp_password my_new_password
您应该收到以下消息:
SNMPv3 密钥已成功更改。
我们可以通过询问远程服务器 SNMP 服务已运行多长时间来测试我们的新凭据和密码。我们将使用 snmpget
命令从其他计算机获取单个值。
这次,我们将利用我们下载的额外 MIB 定义。我们可以使用这些定义来按名称请求值,而不是使用 OID 数字 ID。
snmpget -u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password remote_host sysUpTime.0
您应该得到一个代表远程 SNMP 守护程序上次重新启动时间的值:
DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (383018) 1:03:50.18
创建客户端配置文件
到目前为止,您可能已经注意到所有 SNMP 命令的身份验证详细信息在每次请求时都是相对静态的。与其每次都手动输入这些信息,我们可以创建一个客户端配置文件,其中包含我们连接所需的凭据。
客户端配置文件可以根据您希望共享的范围放置在两个不同的位置。
如果您希望与管理机器上的任何有效用户共享登录凭据,您可以将配置详细信息放入全局 snmp.conf
文件中。您需要以超级用户权限打开该文件:
sudo nano /etc/snmp/snmp.conf
然而,如果您只想为您自己定义用户的身份验证凭据,您可以在用户的主目录中创建一个隐藏的 .snmp
目录,并在其中创建文件:
mkdir ~/.snmp cd ~/.snmp nano 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
文件。对于我们的指南,它将如下所示:
defSecurityName demo defSecurityLevel authPriv defAuthType MD5 defPrivType DES defAuthPassphrase my_new_password defPrivPassphrase my_new_password
完成后,保存并关闭文件。
现在,您可以在不提供身份验证详细信息的情况下发出命令。您只需要 SNMP 命令、主机和命令参数。
与其输入:
snmpget -u demo -l authPriv -a MD5 -x DES -A my_new_password -X my_new_password remote_host sysUpTime.0
我们只需输入:
snmpget remote_host sysUpTime.0
如您所见,这显著减少了我们需要在每个请求中提供的信息量。
移除引导账户
现在您的常规账户已正确配置,我们可以移除 bootstrap
账户,因为它相当不安全。
在代理服务器上,再次以超级用户权限打开 /etc/snmp/snmpd.conf
文件。
找到并注释掉(或删除)我们先前添加的引用 bootstrap
用户的两行:
#createUser bootstrap MD5 temp_password DES #rwuser bootstrap priv
保存并关闭文件。
现在,重新启动 SNMP 守护程序:
sudo service snmpd restart
这将满足不在正常的 snmpd.conf
文件中具有 createUser
指令的建议。它还将从该临时用户中删除权限。
如果您想要完全从 usmUserTable 中删除 bootstrap
用户,您可以通过从管理服务器发出以下命令来执行:
snmpusm remote_host delete bootstrap
您将收到以下响应:
User successfully deleted.
结论
到目前为止,您应该已经拥有一个完全配置的客户端-服务器设置,可以使用 SNMP 协议进行安全通信。您可以轻松地在其他主机上添加额外的守护程序,并在整个基础架构中配置账户访问。
在下一个指南中,我们将介绍我们一直在使用的 net-snmp 工具的一些基本用法。我们将演示如何逐个或批量检索值以及如何修改数据。