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-адреса исходных клиентов, но вы можете получить более одного адреса, если запрос проходит через несколько прокси-серверов.

Другие вопросы по тегам