Nagios - 如何在传递给 NRPE 服务器的参数中使用逻辑运算符
Posted
技术标签:
【中文标题】Nagios - 如何在传递给 NRPE 服务器的参数中使用逻辑运算符【英文标题】:Nagios - how to use logical operators in args passed to NRPE server 【发布时间】:2019-07-15 20:27:51 【问题描述】:我需要在传递给 NRPE 的参数上使用逻辑运算符作为字符串。 NRPE 也使用运算符作为 FIELD 分隔符。哪个是 splat 或 !令牌。
引用传递的参数的不同方式。没有影响。
Nagios Command.cfg
define command
command_name check_remote_container_broker_health
command_line $USER1$/check_jmx4perl $ARG1$ $ARG2$ $ARG3$
Nagios Remote Service
define service
use generic-service
host_name alphprdfuse1i
service_description Container IPRCMT1 Broker Health
check_command check_nrpe!check_remote_container_broker_health!-a '--user iprcmtx --password G00gl3M3 --url http://localhost:9091/jolokia --mbean org.apache.activemq:type=Broker,brokerName=amq,service=Health --attribute CurrentStatus --string --critical '!Good''
NRPE 服务器 NRPE.cfg
command[check_remote_container_non_heap_used]=/usr/local/nagios/libexec/check_jmx4perl $ARG1$ $ARG2$
当 NRPE 评估语句时,它应该执行为 if return.string NOT EQUAL 好
但是,NRPE 将其视为字段分隔符
谢谢
【问题讨论】:
【参考方案1】:基于this thread,我的猜测是check_command
中不能转义感叹号,你需要完全避免它们。
一种方法是将感叹号移至其他位置,例如 NRPE 配置中的命令定义。
另一种方法是使用 resources.cfg
并定义一个带有 Nagios 将解析的数字的 $USERX
宏,这可能是在密码等情况下最好的做法,但在这种情况下可能不是。
【讨论】:
【参考方案2】:将 NRPE 服务器命令更改为:
command[check_remote_container_broker_health]=/usr/local/nagios/libexec/check_jmx4perl $ARG1$ '!$ARG2$'
在 Nagios 服务器上
define service
use generic-service
host_name alphprdfuse1i
service_description Container Delta FADEC Broker Health
check_command check_nrpe!check_remote_container_broker_health!-a "--user deltafadec --password B@dM0nk3y --url http://localhost:9093/jolokia --mbean org.apache.activemq:type=Broker,brokerName=amq,service=Health --attribute CurrentStatus --string --critical" "Good"
所以要删除 !从传递给 NRPE 的 args 中,让 NRPE 命令发出逻辑 NOT 或!
【讨论】:
【参考方案3】:谢谢!!!
我确实尝试过使用 resources.cfg 并添加 $USERn$ 定义。这对我不起作用。 我确实尝试在 NRPE 服务器上形成表达式,以接受特殊字符。这行得通。而这一切都是因为我们通过允许脏字符和 bash shell 操作符来避免网络安全风险。所以,这是最好的解决方案。只是需要一些时间来了解发生了什么。如果您将日志记录设置为高,您可以看到宏如何将其全部分解。任何 hoot,这是我的几个实现的解决方案。
我将分享 2 个示例和情况。
在 NRPE 服务器上,NRPE.cfg
command[check_remote_container_broker_health]=/usr/local/nagios/libexec/check_jmx4perl $ARG1$ '!$ARG2$'
在 Nagios 服务器上
define service
use generic-service
host_name alphprdfuse1i
service_description Container PassThru Context State
check_command check_nrpe!check_remote_container_context_state!-a '--user passthru --password B@dC0mpany --url http://localhost:9090/jolokia --mbean org.apache.karaf:type=admin,name="PassThru MultiTenant" --attribute Instances --path "PassThru MultiTenant"/State --critical' 'Started'
在 NRPE 服务器上,NRPE.cfg
command[check_remote_container_context]=/usr/local/nagios/libexec/check_jmx4perl $ARG1$ $ARG2$ $ARG3$ $ARG4$ '$ARG5$"$ARG6$"' $ARG7$
在 Nagios 服务器上
define service
use generic-service
host_name alphprdfuse1i
service_description Container PassThru Context ExchangesCompleted
check_command check_nrpe!check_remote_container_context!-a "--user passthru" "--password B@dC0mpany" "--url http://localhost:9090/jolokia" "--mbean" "org.apache.camel:context=passthrumt1.core-com.ge.digital.passthru.coreCamelContext,type=context,name=" "com.ge.digital.passthru.coreCamelContext" "--attribute ExchangesCompleted"
总结 因此,如果您不启用在 NRPE 上使用特殊字符,以及将此类字符从 Nagios 服务器发送到 NRPE 系统,这将被声明为存在安全风险,如果可以避免使用。所以,它只是变成了一个字符串操作来确定什么是有效的。基本上,如果您在 Nagios 对 NRPE 的请求中有任何特殊字符,则需要将此语句分成几个没有特殊字符的字符串,并在 NRPE 端应用特殊字符。 NRPE 将在评估消息时删除所有这些字符。
【讨论】:
您可能希望在资源文件中定义用户宏,以便避免在服务定义中使用--password B@dC0mpany
。这是最佳实践,因为 “CGI 不会尝试读取资源文件,因此您可以对它们设置限制性权限(600 或 660)以保护敏感信息。” -- 请参阅文档了解更多信息.以上是关于Nagios - 如何在传递给 NRPE 服务器的参数中使用逻辑运算符的主要内容,如果未能解决你的问题,请参考以下文章