Apache, mod_auth_kerb, mod_proxy: получить аутентифицированного пользователя в Go Web Application
Я использую Apache в качестве обратного прокси-сервера для таких вещей, как аутентификация перед сервером http.
Следующая установка Apache Kerberos работает с одной проблемой. Я не знаю, как получить аутентифицированное имя пользователя в моем приложении go.
httpd.conf:
<VirtualHost host.domain.com:80>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
Order deny,allow
Allow from all
AuthType Kerberos
AuthName "User Admin"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
</Location>
</VirtualHost>
С
AuthType basic
Я получаю имя пользователя из заголовка авторизации запроса с функцией go
func (*Request) BasicAuth
но с согласованием заголовка авторизации это невозможно. Кроме того, я не могу использовать переменную окружения REMOTE_USER, потому что нет среды cgi. Я также попытался установить RequestHeader, но безуспешно.
Есть ли возможность получить авторизованное имя пользователя из приложения go?
4 ответа
Извините за задержку - я участвовал в других проектах. Большое спасибо за предложения. Следующее решение теперь работает для меня после перехода на среду CentOS 7/httpd 2.4:
<VirtualHost host.domain.com:80>
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
AuthType Kerberos
AuthName "Web Application"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
RequestHeader unset X-Forwarded-User
RewriteEngine On
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule .* - [E=RU:%1]
RequestHeader add X-Forwarded-User %{RU}e
</Location>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:8000/
ProxyPassReverse / http://127.0.0.1:8000/
ServerName host.domain.com
</VirtualHost>
Пользователь может быть доступен в Go с помощью:
user := req.Header.Get("X-Forwarded-User")
НЕ используйте обходной путь перезаписи, потому что у вас возникнут проблемы с фазами выполнения, если REMOTE_USER установлен с таким модулем, как mod_authn_ntlm (ntlm для локального компьютера, см. https://support.microsoft.com/en-us/kb/896861).
RewriteCond %{LA-U:REMOTE_USER} (.+)
RewriteRule . - [E=RU:%1]
RequestHeader set X-Remote-User %{RU}e
вместо этого используйте следующий метод:
RequestHeader set X-Remote-User expr=%{REMOTE_USER}
Попробуйте следующий конфиг, вы должны увидеть свое имя пользователя в шапке X-Forwarded-User
, Убедитесь, что модуль заголовков загружен, например a2enmod headers
:
<VirtualHost host.domain.com:80>
<Location />
## gzip
##
AddOutputFilterByType DEFLATE text/html
AuthType Kerberos
AuthName "User Admin"
KrbAuthRealms DOMAIN.COM
Krb5Keytab /etc/host.krb5keytab
KrbMethodNegotiate on
KrbAuthoritative on
KrbMethodK5Passwd off
KrbLocalUserMapping on
KrbSaveCredentials on
require valid-user
RequestHeader set X-Forwarded-User %{REMOTE_USER}s
</Location>
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:9000/
ProxyPassReverse / http://127.0.0.1:9000/
</VirtualHost>
Вы должны быть в состоянии установить заголовок через SetEnvIf
- http://httpd.apache.org/docs/2.2/mod/mod_setenvif.html - как показано ниже:
SetEnvIf Authorization "(.*)" HTTP_APP_USER=$1
Вы можете получить к нему доступ в Go черезr.Header.Get("HTTP_APP_USER")
,
Остерегайтесь, что нет никакой гарантии, что клиент также не установил заголовок с тем же: http://httpd.apache.org/docs/2.2/mod/mod_proxy.html
Будьте осторожны при использовании этих заголовков на исходном сервере, так как они будут содержать более одного (через запятую) значения, если исходный запрос уже содержал один из этих заголовков. Например, вы можете использовать%{X-Forwarded-For}i в строке формата журнала исходного сервера для регистрации IP-адреса исходных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси-серверов.