我正在尝试允许未经身份验证访问 Nagios 安装中的某些脚本。尽管问题并不专门针对 Nagios 或下面也说明的 CGI 处理。
本质上,我想要对特定目录中的任何内容进行身份验证:
http://example.com/nagios/cgi-bin/....
除了2条特定路径外:
http://example.com/nagios/cgi-bin/avail.cgi....
http://example.com/nagios/cgi-bin/trends.cgi....
目前我已经将 Apache 设置为要求所有访问都进行身份验证http://example.com/nagios/cgi-bin
ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin
<Directory "/usr/local/nagios/sbin">
Options ExecCGI
AllowOverride None
Order allow,deny
Allow from all
AuthName "Nagios Access"
AuthType Basic
AuthUserFile /usr/local/nagios/etc/htpasswd.users
Require valid-user
</Directory>
我不想在不同的目录中复制脚本,因为这是打包软件,而且我想尽量减少支持工作量 - 我不确定包中的哪些 URL 使用规范路径。
编辑:
我可以使用 FilesMatch 代替 Direcory 块吗?如果可以,Apache 正则表达式是基于 PCRE 还是 POSIX 的?
编辑3:
使用
<FilesMatch "/(cgi-bin\/)(?!trends.cgi)(?!avail.cgi)/">
删除目录中所有 URL 的身份验证 :(
我还尝试在不同的目录中复制 avail.cgi 和 trends.cgi 脚本。这似乎有效 - 但表单中没有填充任何来自我的 Nagios 配置的数据!似乎 Nagios 代码中内置了额外的身份验证层。这也会破坏“要求任何/允许来自 ip”的方法。:(
虽然修改后的行为微软企业信息安全实验室可能正确rfc2396 文档它让我头痛欲裂!
答案1
您是否尝试创建一个带有指向“打开” cgi 的符号链接的新文件夹?
答案2
如果服务器上有第二个可用的 IP 地址,您可以尝试在此 IP 地址上运行反向代理,该代理仅转发这两个位置并执行 HTTP 身份验证。
<VirtualHost secondIP:80>
ProxyPassMatch ^\/nagios\/cgi-bin\/(trends|avail)\.cgi$ "http://127.0.0.1/nagios/cgi-bin/"
ProxyPassReverse /nagios/cgi-bin/ "http://127.0.0.1/nagios/cgi-bin/"
</VirtualHost>
ProxyPassReverseMatch
由于apache 中没有指令,我还没有尝试过这是否正常工作。
答案3
使用满足:
Require valid-user
Order allow,deny
Allow from IP
Satisfy Any
答案4
以下配置对我来说可以要求对单个 CGI 脚本进行身份验证:
<Directory "/var/www/cgi-bin">
<Files "my-cgi-script">
# ...
# AuthName, AuthType, AuthUserFile, Require
# ...
</Files>
</Directory>
尝试将 FilesMatch 嵌套到 Directory 中并在 FilesPath 指令中使用相对路径。