[英]Cacti extend snmp by a custom script
我在Cacti上创建了一个关于使用cacti和net-snmp访问基础架构上特定页面的时间的图表。
我已经在文件/etc/snmp/snmpd.conf中添加了两个新行来扩展功能:
extend stat_page1 /usr/local/bin/cacti/access_page.sh context1
extend stat_page2 /usr/local/bin/cacti/access_page.sh context2
我已重新启动守护进程snmpd以加载此配置。
调用的脚本在下面描述,带有其他值,因为出于某种原因,我可以显示这个。
#!/bin/bash
domain="mydomain"
cookie_name="myCookie"
token="myToken"
if [ $# -eq 1 ]
then
if [ "$1" = "context1" ]
then
target_url="https://${domain}/${1}/page1.html"
TIME=$(curl -s -w "%{time_total}" -o /dev/null --cookie \"${cookie_name}=${token}\" ${target_url})
echo "$TIME"
elif [ "$1" = "context2" ]
then
target_url="https://${domain}/${1}/page2.html"
TIME=$(curl -s -w "%{time_total}" -o /dev/null --cookie \"${cookie_name}=${token}\" ${target_url})
echo "$TIME"
fi
如果我手动启动脚本,我有这个
$ /usr/local/bin/cacti/access_page.sh context2
0.061
$ /usr/local/bin/cacti/access_page.sh context1
0.041
当我使用snmpget启动脚本时,我得到了以下结果:
snmpwalk -v2c -c myCommunity localhost NET-SNMP-EXTEND-MIB::nsExtendOutput2Table
NET-SNMP-EXTEND-MIB::nsExtendOutLine."stat_page1".1 = STRING: 0.000
NET-SNMP-EXTEND-MIB::nsExtendOutLine."stat_page2".1 = STRING: 0.000
所有时间,我通过snmp
命令获得0.000值并手动获得实际值。
你能帮我解决一下吗?
最近我遇到了snmp
和调用curl
命令的执行脚本的问题。
当我搜索一些解决方案时,这篇文章是最接近的问题。
我找到了一个没有禁用SELinux的解决方案。
我是SELinux的新手,但我用一些SELinux配置解决了这个问题,将来可能会引起别人的兴趣。
Centos 7
SNMP /etc/snmp/snmpd.conf
配置文件的内容:
# sec.name source community
com2sec myuser default public
# groupName securityModel securityName
group mygroup v2c pad
# name incl/excl subtree mask(optional)
view systemview included .1.3.6.1.4
view systemview included .1.3.6.1.4.1
view systemview included .1.3.6.1.4.1.1234
view systemview included .1.3.6.1.4.1.1234.1
# group context sec.model sec.level prefix read write notif
access mygroup "" any noauth exact systemview none none
perl do "/appli/snmp_scripts/agent.pl"
#!/usr/bin/perl
use NetSNMP::agent (':all');
use NetSNMP::ASN qw(ASN_OCTET_STR ASN_INTEGER);
sub handler {
my ($handler, $registration_info, $request_info, $requests) = @_;
my $request;
for($request = $requests; $request; $request = $request->next()) {
my $oid = $request->getOID();
if ($request_info->getMode() == MODE_GET) {
if ($oid == new NetSNMP::OID(".1.3.6.1.4.1.1581.1.6.2.1.5")) {
$request->setValue(ASN_OCTET_STR,`/path/to/myscript`);
}
}
}
}
my $AGENT_OID = ".1.3.6.1.4.1.1234";
$agent->register("MYAGENT", ".1.3.6.1.4.1.1234",
\&handler);
当我查找执行的跟踪时,使用sudo systemctl status snmpd
,会显示一些卷曲痕迹:
snmpd: curl: (7) Failed to connect to 127.0.0.1:8081 Permission denied
但是,服务器在此端口运行良好,并且在SNMP外部执行的脚本运行良好。
审计日志中生成了SELinux错误:
$> sudo grep snmp /var/log/audit/audit.log | audit2allow -w -a
type=AVC msg=audit(1528188940.802:2025): avc: denied { name_connect } for pid=26809 comm="curl" dest=8081 scontext=system_u:system_r:snmpd_t:s0 tcontext=system_u:object_r:transproxy_port_t:s0 tclass=tcp_socket
Was caused by:
Missing type enforcement (TE) allow rule.
You can use audit2allow to generate a loadable module to allow this access.
$> sudo grep snmp /var/log/audit/audit.log | audit2allow -M mysnmpmodule
******************** IMPORTANT ***********************
To make this policy package active, execute:
semodule -i snmpdcanopensocket.pp
按照audit2allow comm告诉的步骤向SELinux申请新创建的snmp_t
模块。 audit2allow -M
命令在当前目录中生成了两个文件snmpdcanopensocket.pp snmpdcanopensocket.te。 SELinux需要.pp文件来重新映射它的安全规则。
$> semodule -i snmpdcanopensocket.pp
使用sudo systemctl restart snmp
重新启动SNMP服务
现在,由SNMP执行的脚本中的curl表现良好,并且不会退出(7)错误代码。
我做了这个测试,当我调用脚本时,我有权限被拒绝,当我这样做时:第34行:/ tmp / echo-curl:权限被拒绝,我做了一个只有id的脚本,以确保以特权启动用户。
我找到了问题的根源,这可能是由于SELinux的强制执行 - user3249935
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.