身为系统管理员,我们的主要工作之一就是收集与服务器及基础设施相关的准确信息。能够用于收集并处理此类信息的方案多种多样,而SNMP正是其中不少方案的基础所在。
SNMP代表简单网络管理协议。通过这种方式,服务器能够共享其现有状态信息,同时允许管理员修改预定义值。尽管这项协议本身非常简单,但使用SNMP的程序在架构方面则可以相当复杂。
今天,了解如何设置工具以通过SNMP实现通信。我们将在示例中使用两台Ubuntu 14.04服务器。
安装SNMP守护程序与工具
我们首先将该守护程序与工具安装在Ubuntu系统当中。
这里我们将使用两台服务器,其一承载管理器部分,其二承载代理。当然,我们了可以将二者安装在同一设备上,但保持二者独立便于大家更好地理解并区分其功能。
第一台服务器上更新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 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命令的常用结构
要使用包含在smp软件包内的工具套件时(即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: 代表我们在创建用户时指定的加密密码。如果不加指定但仍然提供加密算法,则默认使用验证密码。用户权限加注priv时必须使用-x参数以完成加密。
现在我们可以构建自己的命令了。考虑到我们设置的bootstrap用户,具体命令将如下所示:
snmp_command -u bootstrap -l authPriv -a MD5 -x DES -A temp_password -X temp_password remote_hostsnmp_sub_command_or_options
例如,大家可以在自己的管理服务器上进行测试以确保bootstrap账户可用性:
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_inforemote_host create new_userexisting_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_passwordremote_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指令
-u USERNAME 作为验证对象的SNMPv3用户名。 defSecurityNameUSERNAME
-l authPriv 验证所使用的安全等级。 defSecurityLevel authPriv
-a MD5 所使用的验证协议。 defAuthType MD5
-x DES 所使用的隐私(加密)协议。 defPrivType DES
-APASSPHRASE 提供给用户名的验证密码。 defAuthPassphrasePASSPHRASE
-XPASSPHRASE 提供给用户名的隐私密码。 defPrivPassphrasePASSPHRASE
利用这些信息,大家就可以创建合适的snmpl.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_passwordremote_host sysUpTime.0
我们可以直接输入:
snmpget remote_host sysUpTime.0
如上所示,这能大大降低我们在每次请求中需要输入的信息量。
移除Bootstrap账户
现在我们的普通账户已经配置完成,可以移除存在安全隐患的bootstrap账户了。
在代理服务器上,以sudo权限打开/etc/snmp/snmpd.conf文件。
在其中找到并注释(或者移除)之前添加的引用bootstrap用户的两行:
#createUser bootstrap MD5 temp_password DES
#rwuser bootstrap priv
保存并退出。
现在重启SNMP守护程序:
sudo service snmpd restart
建议大家不要在正常的snmpd.conf文件中包含createUser指令,另外临时用户的权限也需要剥夺。
如果大家希望将bootstrap用户从usmUserTable中彻底移除,则可在管理服务器上使用以下命令:
snmpusm remote_host delete bootstrap
返回结果如下:
User successfully deleted.
总结
现在大家应该已经完成了客户端-服务器配置工作,其能够利用SNMP协议实现安全通信。大家也可以轻松在另一主机上添加更多守护程序,并在整体基础设施内配置账户访问机制。