我已将 Apache 配置为 PostGraphile 服务的反向代理。我的想法是使用 Apache 进行 Kerberos 身份验证,然后使经过身份验证的用户可以使用 PostGraphile 服务。
我还需要向该服务传递一些自定义标头。
此时,我可以启用 Kerberos 身份验证或传递标头。一旦我启用身份验证,服务端就不会出现标头。
这是我的虚拟主机配置:
<VirtualHost *:80>
<Location />
AuthType Kerberos
AuthName "Kerberos Authentication"
KrbAuthRealsm MY.REALM
KrbServiceName HTTP
BrowseMatch Windows gssapi-no-negotiate
KrbMethodNegotiate on
KrbMethodK5Passwd off
Krb5Keytab /path/to/keytab.keytab
# require valid-user # with this line uncomented headers defined later do not appear on service side
require all granted # with this line uncommented headers defined later do appear on service side however any user can access the service
ProxyPass 'http://my.service:5000'
ProxyPassReverse 'http://my.service:5000'
</Location>
<Proxy *>
Order Deny,Allow
Deny from all
Allow from local.ip.range
</Proxy>
RequestHeader set MYCUSTOMHEADER foo
</VirtualHost>
我没什么主意了。
我一直在阅读 Apache 文档、auth_mode_kerb 文档、堆栈线程和博客,但似乎我在这里遇到了一些奇怪的错误或缺少了一些基本的东西......
任何提示都会非常受欢迎
答案1
经过试验,我终于找到了满足我需求的解决方案,但我必须承认,我不知道为什么它会按照看起来的方式工作。
如果我在配置中添加以下内容,我就可以在Authorization
标题中传递我需要的信息。
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1]
RequestHeader add Authorization %{RU}e
但是其他自定义标题仍然没有出现,这对我来说仍然是一个谜。
编辑:
经过进一步的调整,我发现只要我覆盖授权标头,我的自定义标头也会显示出来。如果能了解这是预期行为(可能是安全功能)还是 mod-auth-kerb 中的错误,那就太好了。
编辑2:
两年后,有人指出我可能在配置中出现了拼写错误:
KrbAuthRealsm MY.REALM
我无法检查这一点,因为我无法访问我当时正在使用的原始系统。而且我甚至无法对那个人说谢谢,因为在指出拼写错误后,那个人删除了一条评论……