Nagios:为经过身份验证的用户创建自定义菜单



是否有任何"简单"的方法可以为经过Nagios身份验证的用户创建自定义的web gui(例如,菜单、默认主页等)?我为一个客户创建了一个用户,他只能访问某些主机组。但登录后,用户可以明显地看到默认菜单,该菜单是为内部使用而定制的。我该如何防止这种情况发生?

有一些方法可以限制用户在标准gui中看到的内容,请查看手册页面。基本上,用户将只看到那些具有包含该用户的联系人列表的主机和服务。您可以在etc/cgiauth.cfg文件中为特殊情况做更多的配置。

如果您想将用户限制为很少的预定义页面,可以在web服务器配置中使用一些技巧。您应该了解apache配置文件是如何实现这一点的,并且假设您可以使用客户的IP地址将其与公司员工区分开来。如果不能,可以使用组和AuthGroupFiles,但这样会有点困难。

基本思想是:

  • 允许每个人访问静态页面、图像、css等
  • 只允许从您公司使用的IP访问CGI
  • 为客户创建特殊的URL,以"隐藏"真实的CGI

这需要mod_authz、mod_rewrite和mod_proxy以及mod_proy_http才能工作。

您的web服务器目录中应该有一个nagios.conf;它的确切位置和内容取决于分发以及您是使用RPM还是自己编译的nagios,因此您的目录路径可能会有所不同。

在CGI脚本的配置中,我们将

<Directory /usr/local/nagios/sbin>
Order deny, allow
Deny from all
Allow from 127.0.0.1
Allow from 1.2.3.4           # <-- this should be the address of the webserver
Allow from 192.168.1.0/24    # <-- this should be the addresses your company use
require valid-user
</Directory>

这将拒绝除您以外的所有人访问CGI。

然后,我们定义了一些重写为CGI脚本的网页:

<Location />
RewriteEngine On
RewriteRule customer.html$  http://127.0.0.1/nagios/cgi-bin/status.cgi?host=customerhost [P]
</Location>

因此,当任何人访问customer.html时,服务器将使用其内部代理获取http://127.0.0.1/nagios/cgi-bin/status.cgi?host=customerhost;这将创建一个新的CGI请求,该请求似乎来自127.0.0.1,因此符合"允许来自127.0.0.1."规则。

Mod_proxy仍然需要配置:

ProxyRequests On
<Proxy *>
AddDefaultCharset off
Order deny,allow
Deny from all
Allow from 1.2.3.4                 # <--- again, use your server IP
Allow from 127.0.0.1
</Proxy>

它将代理限制为内部apache使用,并防止互联网上的其他人将您的代理用于其他任何事情。

当然,执行的仍然是原始CGI,但您的客户不能直接使用它们,他只能访问您在RewriteRules中提供的CGI。链接和操作下拉菜单仍将存在,但访问它们将导致错误消息。

如果您仍然想要更多,请使用您选择的编程语言(我已经用perl完成了这项工作,但php、phyton、ruby…应该也能正常工作),解析objects.cache和status.dat文件,并创建自己的UI。一旦您编写了一些库函数来解析这些文件(这应该不会太难,因为它们的语法很琐碎),创建自己的GUI就和编程任何其他类型的Web UI一样困难或简单。

经过一些研究,我为我的案例找到了解决方案。解决方案在于,默认情况下,Nagios为两个不同的目录使用单个密码文件(用于http auth):

  • $NAGIOS_HOME/sbin(存储cgi文件的位置)和
  • $NAGIOS_HOME/share(存储HTML和PHP文件)

这意味着,任何作为用户进行身份验证的人都可以自动访问文件夹和子文件夹。这可以通过为上面的文件夹使用单独的密码文件来防止。

以下是一个自定义nagios.conf文件的片段,该文件包含两个不同的密码文件:

## BEGIN APACHE CONFIG SNIPPET - NAGIOS.CONF
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin"
<Directory "/usr/local/nagios/sbin">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthType Digest
AuthName "Nagios Access"
AuthDigestFile /usr/local/nagios/etc/.digest_pw1>        
Require valid-user
</Directory>
Alias /nagios "/usr/local/nagios/share"
<Directory "/usr/local/nagios/share">    
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthType Digest
AuthName "Nagios Access"
AuthDigestFile /usr/local/nagios/etc/.digest_pw2
Require valid-user
</Directory>
## END APACHE CONFIG SNIPPETS

例如,现在让我们在/var/www/html/customer1下为customer1创建一个自定义目录,并从Nagios复制所有html和php文件/在那里共享目录,并自定义它们,并在Apache中添加一个别名。

Alias /customer1 "/var/www/html/customer1"
<Directory "/var/www/html/customer1">    
Options None
AllowOverride None
Order allow,deny
Allow from all
AuthType Digest
AuthName "Nagios Access"
AuthDigestFile /usr/local/nagios/etc/.digest_pw3
Require user customer1
</Directory>

现在可以在密码文件1和3中为customer1添加相同的用户/密码,这样他们就可以访问自定义web gui和cgi脚本。当然,事先必须在Nagios中设置适当的联系人组,以便在身份验证后,客户只能看到他/她作为联系人的组。默认的Nagiosshare目录由Nagios admin(或其他)用户/密码保护,该密码位于密码文件2中,当然也位于1中。

相关内容

  • 没有找到相关文章

最新更新