如何在Ubuntu14.04上安装和配置SNMP守护程序和客户端

来自菜鸟教程
跳转至:导航、​搜索

介绍

作为系统管理员的很大一部分工作是收集有关您的服务器和基础架构的准确信息。 有许多工具和选项可用于收集和处理此类信息。 其中许多是建立在称为 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 指令。 目前,它被设置为只允许来自本地计算机的连接。 我们需要注释掉当前行,并取消注释下面的行,这允许所有连接(我们将很快锁定它):

#  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)并提供 必须 至少为 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:该参数用于指定使用的认证协议。 可能的值为 MD5SHA。 这必须与创建用户时指定的信息相匹配。
  • -x PROTOCOL:该参数用于指定使用的加密协议。 可能的值为 DESAES。 这必须与创建用户时指定的信息相匹配。 每当用户的权限规范后面有 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

您应该会收到以下消息:

User successfully created.

现在,我们的远程服务器上有一个功能齐全的用户,名为 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 Key(s) successfully changed.

我们可以通过询问远程服务器 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 权限打开该文件:

sudo nano /etc/snmp/snmp.conf

但是,如果您想单独为您的用户定义身份验证凭据,您可以在用户的主目录中创建一个隐藏的 .snmp 目录,并在那里创建文件:

mkdir ~/.snmp
cd ~/.snmp
nano snmp.conf

无论您决定将配置放置在何处,内容都是相同的。

我们用来进行身份验证的命令如下表所示。 在右侧列中,您可以看到应该用于在 snmp.conf 文件中设置这些配置详细信息的指令名称:

命令标志 描述 翻译的 snmp.conf 指令
-u 用户名 要进行身份验证的 SNMPv3 用户名。 defSecurityName 用户名
-l authPriv 要进行身份验证的安全级别。 defSecurityLevel authPriv
-a MD5 要使用的身份验证协议。 defAuthType MD5
-x DES 要使用的隐私(加密)协议。 defPrivType DES
-A 密码 提供的用户名的身份验证密码。 defAuthPassphrase PASSPHRASE
-X 密码 提供的用户名的隐私密码。 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 帐户,因为它相当不安全。

在您的代理服务器上,使用 sudo 权限再次打开 /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 工具 的基本用法。 我们将演示如何逐一或批量检索值以及如何修改数据。