实验室小萌新,今天美美APEX之后接到任务,要给20多个服务器装snmp代理,几经脱发,最后也算是高效完成了任务,在这里记录一下过程。
先贴上参考的大佬文章:
linux snmpd服务_com2sec notconfiguser default public-CSDN博客
https://blog.51cto.com/865516915/1880336
https://www.cnblogs.com/oloroso/p/4844907.html
简单网络组管理协议SNMP介绍
SNMP(Simple Network Management Protocol)是一种网络管理协议,用于管理和监控网络设备、操作系统和应用程序。它提供了一组用于检索和修改网络设备配置、监视设备状态和性能的标准化方法。
SNMP 是一个客户端-服务器协议,由两个主要组件组成:管理站点(管理者)和代理代理(被管理者)。
管理站点:通常是一个网络管理员或系统管理员使用的工具或应用程序,用于监控和管理网络中的设备。管理站点发送 SNMP 请求到代理代理,并接收和处理代理代理返回的响应。
代理代理:指网络中的设备或主机,它们通过 SNMP 协议提供对自身的管理和监控功能。代理代理接收来自管理站点的 SNMP 请求,并根据请求执行相应的操作,然后将结果返回给管理站点。
需求分析
师兄已经给出了SNMP管理站点的ip,因此我只需要配置代理即可。配置的最终要求主要有这些:
- 创建专门用来维护snmp协议的账户,这个账户不能有root权限,但是需要可以用systemctl来启动/重启/关闭 snmpd服务,以及对配置文件进行修改
- 配置snmpd的配置文件,使得管理站点对代理仅有读权限而不能有写权限,同时指定访问来源,即只有那一个管理站点可以管理我们这些snmp代理
安装snmp服务
yum一句话的事,文件也很小,我就不多bb了
yum install net-snmp net-snmp-libs net-snmp-utils
创建账户
创建账户自然采用adduser命令。创建一个没有root权限的用户,只需要定义一个不能root的用户组,然后把用户塞进去就可以了。
# 创建用户snmp
useradd -m -s /bin/bash snmp
# 创建用户组snmp(如果没有的话)
groupadd snmp
# 将用户snmp添加到snmp组
usermod -aG snmp snmp
在创建账户之后,记得使用passwd命令设置snmp的密码,否则是无法登录的
#设置snmp账户的密码
passwd snmp
配置账户权限
如何实现“账户不能有root权限,但是需要可以用systemctl来启动/重启/关闭 snmpd服务,以及对配置文件进行修改”呢?我这里采用了chatgpt给出的polkit方案
什么是polkit
Polkit是一个Linux权限管理框架,用于简化用户与系统服务之间的交互,尤其是在没有root权限的情况下。Polkit允许普通用户执行某些需要root权限的任务,而无需输入root密码。
配置过程
新建 /etc/polkit-1/localauthority/50-local.d/snmpd.pkla ,配置指定的snmp用户组能够实现的操作(使用systemctl控制snmpd服务)
[Allow snmp to manage snmpd]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.manage-units
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
[Allow snmp to start snmpd service]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.start-unit
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
[Allow snmp to stop snmpd service]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.stop-unit
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
随后,重启polkit
systemctl restart polkit
另外,snmp的操作用户需要可以对/etc/snmp/snmpd.conf进行读写。因此对这个文件的权限进行一些修改:
# 更改snmpd服务的所有权和权限
chown snmp:snmp /etc/snmp/snmpd.conf
chmod 640 /etc/snmp/snmpd.conf
配置snmpd.conf
关于snmpd的所有配置基本都在snmpd.conf中。这个文件的结构也是比较简单的
net-snmp的配置文件是有一定的层次结构的,配置起来也很方便。网上找了很多资料,大概把这个配置文件的各个信息搞懂了一点。其实在net-snmp的EXAMPLE.conf文件中对齐有详细的描述,不过是英文的。
定义共同体
使用 rocommunity 来定义一个只读权限的共同体,使用 rwcommunity 来定义一个读写权限的共同体。我这里因为要让管理端只读,因此都使用rocommunity来定义共同体了
rocommunity 共同体名
定义安全体
定义完共同体之后就要定义一个安全体,并把共同体映射到一个安全体中去。安全体用于控制外部访问的来源的。
使用com2sec关键字来定义安全体
# sec.name souce community
com2sec 安全体名 IP/MASK 共同体名
由于是指定的管理端,我这里直接把管理端IP写进source。后面跟个子网掩码,就是255.255.255.255,表示只有这一个ip可以访问这个snmp代理
定义安全组
定义完安全体之后,就要定义安全组了。安全体是用于控制访问的的来源的,安全组就是控制安全体中允许的来源的访问授权模式的。
# groupName securityModel securityName
group readgroup usm read
group writegroup usm write
group testgroup usm test
定义视图,供安全组使用
定义完安全组后,需要定义一个视图。视图就是这个安全体的可见范围。
对于每一个安全体,需要向其授权一些视图,视图确定了可以访问那些节点
#第三步,定义视图,供安全组使用
#view.name 视图名
#incl/excl 对下面的MIB子树是包括还是排除(included/excluded)
#subtree 视图中所涉及的mib子树
#mask(optional) 掩码
# view.name incl/excl subtree [mask]
view all included .1
view test included system
view test included system.sysLocation
#view if2 included .1.3.6.1.2.1.2.2.1.0.2 FFA0
向安全组授权相应的视图
#第四步,向安全组授权相应的视图
# group 安全组名
# context 上下文v1,v2中始终为空
# sec.model 安全模型,可选值:v1,v2,usm
# sec.level 安全级别 可选值:auth,noauth,priv, v1,v2c中只能为noauth
# prefix 前缀。指定context如何与PDU中的context匹配,V3使用
# read 授权的读视图
# write 授权的写视图
# notif 授权的trap视图
# group context sec.model sec.level prefix read write notif
access readgroup "" any noauth exact all none none
access writegroup "" any noauth exact all none none
access testgroup "" any noauth exact all none none
#acess readgroup "interface2" usm priv exact if2 if2 if2
# 4. access
# 命令格式:access groupName context model level prefx read write notify
# 功能:设置访问某一个view的存取权限
# 参数说明: groupName:控制存取权限的组名
# context:v1和v2c版本,context必须设置为""
# model:v1、v2c、usm、tsm、ksm
# 最后3中是v3版本的授权模式,usm(User-Based Security Model)是默认授权模式,tsm用于SSH or DTLS,ksm用于支持Kerberos
# level:可以去3种值:noauth、auth、priv
# noauth:允许无权限访问(v1,v2c使用)
# auth:必须有权限才能访问
# priv:强制加密访问
# prefx:exact or prefix
# read、write、notify:指明某一个view的权限是否可以GET*, SET*、
# TRAP/INFORM,如果该view不能read,则置none
其实后面三步我就没动脑子了,在安装好snmpd之后,软件自动会有后续的配置,把一些注释取消掉之后就可以了
贴一下我最终配置好的样子:
随后,使用systemctl重启这个服务,应用配置
systemctl restart snmpd
加快速度
在搞完了上面这一堆操作之后,终于配置好了一台服务器。时间过去了一个多小时,配好剩下二十多台还需要......
还好这些服务器都在一个网段里,我们的操作服务器可以ssh它们。为了加快咱的速度,我采取了一些简单的办法
在所有服务器中,snmpd.conf都是一样的,我把一开始那台先输出到一个txt里
cat /etc/snmp/snmpd.conf >> test.txt
然后创建一个脚本,自动化上面的配置用户的所有步骤:
#!/bin/bash
######manage.sh
# 创建用户snmp
useradd -m -s /bin/bash snmp
# 将用户snmp添加到snmp组
usermod -aG snmp snmp
# 创建polkit规则,允许snmp用户管理snmpd服务
cat <<EOF > /etc/polkit-1/localauthority/50-local.d/snmpd.pkla
[Allow snmp to manage snmpd]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.manage-units
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
[Allow snmp to start snmpd service]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.start-unit
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
[Allow snmp to stop snmpd service]
Identity=unix-user:snmp
Action=org.freedesktop.systemd1.stop-unit
Object=snmpd.service
ResultAny=yes
ResultInactive=yes
ResultActive=yes
EOF
# 重新加载polkit规则
systemctl restart polkit
# 更改snmpd服务的所有权和权限
chown snmp:snmp /etc/snmp/snmpd.conf
chmod 640 /etc/snmp/snmpd.conf
# 读取test.txt文件的内容
cat /path/to/test.txt > /etc/snmp/snmpd.conf
# 重新加载systemd以应用新的权限
systemctl daemon-reload
# 重启snmpd服务
systemctl restart snmpd
echo "用户snmp已创建,并配置了管理snmpd服务的权限。test.txt内容已写入snmpd.conf。"
可以看到,这个脚本自动把txt的内容复制到snmpd.conf里了
然后就是用scp命令,全部copy到别的服务器里面去
scp test.txt manage.sh root@xx.xx.xx.xx:/root/
这一步也可以写个脚本自动化,但是要一个一个输密码,我没有采用这个方案。脚本倒是写好了,如果你的服务器配好了ssh key不需要输入密码的话,可以参考这个脚本
#!/bin/bash
# 指定源文件和目标文件
SOURCE_FILE=test.txt
TARGET_FILE=manage.sh
# 指定端口范围
START_IP=xx.xx.xx.xx
END_IP=xx.xx.xx.xx
# 循环遍历IP地址范围
for IP in $(seq$START_IP $END_IP); do
# 使用ssh端口转发功能构建scp命令
scp $SOURCE_FILE$TARGET_FILE root@localhost:$IP:/root/
scp $SOURCE_FILE$TARGET_FILE root@localhost:$IP:/root/
done
这样就有了一个简单的流程:在复制文件到所有服务器后,ssh到新服务器,跑manage.sh脚本,给snmp账号设密码,完事了。
最后干完这20多台服务器就花了十五分钟,当然准备脚本还是花了一些时间的。
牢骚
天将降大任于斯人也,必先苦其心志,劳其体肤,空乏其身。具体而言,就是干运维。
我不干总有人要干,我干了还能让我少玩垃圾apex,保护视力和血压。
有道是:
运维辛劳苦心智,心志坚韧耐磨磋。 科研视保身康健,少A一天是一天