SPNEGO использует неправильное имя участника KRBTGT

Я пытаюсь включить аутентификацию Kerberos для нашего веб-сайта. Идея состоит в том, чтобы пользователи, вошедшие в домен Windows AD, получали автоматический вход (и первоначальное создание учетной записи)

Прежде чем я займусь стороной Windows, я хотел, чтобы она работала локально. Поэтому я сделал тестовый контейнер KDC/KADMIN, используя [email protected]:ist-dsi/docker-kerberos.git.

Веб-сервер находится в локальном контейнере докеров с nginx и скомпилированным модулем spnego. Контейнер KDC/KADMIN находится по адресу 172.17.0.2 и доступен из моего контейнера веб-сервера.

Вот мой локальный krb.conf:

default_realm = SERVER.LOCAL

[realms]
SERVER.LOCAL = {
                kdc_ports = 88,750
                kadmind_port = 749
                kdc = 172.17.0.2:88
                admin_server = 172.17.0.2:749
        }

[domain_realms]
  .server.local = SERVER.LOCAL
  server.local = SERVER.LOCAL

и krb.conf в контейнере веб-сервера

[libdefaults]
  default_realm = SERVER.LOCAL
  default_keytab_name  = FILE:/etc/krb5.keytab
  ticket_lifetime      = 24h
  kdc_timesync         = 1
  ccache_type          = 4
  forwardable          = false
  proxiable            = false

[realms]
  LOCALHOST.LOCAL = {
    kdc_ports = 88,750
    kadmind_port = 749
    kdc = 172.17.0.2:88
    admin_server = 172.17.0.2:749
  }

[domain_realms]
  .server.local = SERVER.LOCAL
  server.local = SERVER.LOCAL

Вот принципы и конфигурация keytab (keytab копируется в веб-контейнер в /etc/krb5.keytab)

rep ~/project * rep_krb_test $ kadmin -p kadmin/[email protected] -w hunter2
Authenticating as principal kadmin/[email protected] with password.
kadmin:  list_principals
K/[email protected]
kadmin/[email protected]
kadmin/[email protected]
kadmin/[email protected]
krbtgt/[email protected]
[email protected]
[email protected]
kadmin:  q

rep ~/project * rep_krb_test $ ktutil
ktutil:  addent -password -p [email protected] -k 1 -f
Password for [email protected]:
ktutil:  wkt krb5.keytab
ktutil:  q

rep ~/project * rep_krb_test $ kinit -C -p [email protected]
Password for [email protected]:

rep ~/project * rep_krb_test $ klist
Ticket cache: FILE:/tmp/krb5cc_1000
Default principal: [email protected]

Valid starting     Expires            Service principal
02/07/20 04:27:44  03/07/20 04:27:38  krbtgt/[email protected]

Соответствующая конфигурация nginx:

server {

  location / {
    uwsgi_pass  django;
    include     /usr/lib/proj/lib/wsgi/uwsgi_params;

    auth_gss on;
    auth_gss_realm SERVER.LOCAL;
    auth_gss_service_name HTTP;
  }
}

Наконец, etc/hosts

# use alternate local IP address
127.0.0.2 server.local server

Теперь я пытаюсь получить доступ к этому с помощью curl:

*   Trying 127.0.0.2:80...
* Connected to server.local (127.0.0.2) port 80 (#0)
* gss_init_sec_context() failed: Server krbtgt/[email protected] not found in Kerberos database.
* Server auth using Negotiate with user ''
> GET / HTTP/1.1
> Host: server.local
> User-Agent: curl/7.71.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
....

Как видите, он пытается использовать имя участника-службы krbtgt/[email protected], тогда как kinit использует krbtgt/[email protected] в качестве имени участника-службы.

Как заставить это работать?

Заранее спасибо..


person rep_movsd    schedule 01.07.2020    source источник
comment
Kerberos по умолчанию преобразует имя хоста в IP-адрес, а затем обратно в имя хоста. Вероятно, что-то заставляет IP-адрес разрешаться в local вместо server.local.   -  person bk2204    schedule 02.07.2020
comment
Что мне поместить в файл hosts, чтобы избежать этого?   -  person rep_movsd    schedule 02.07.2020


Ответы (1)


Вот и получается, что мне нужно

auth_gss_service_name HTTP/server.local;

Некоторые другие советы по обнаруженным проблемам:

  1. Убедитесь, что файл keytab доступен для чтения процессом веб-сервера с пользовательскими www-данными или любым другим пользователем.
  2. Убедитесь, что принципы keytab указаны в правильном порядке.
  3. Используйте export KRB5_TRACE=/dev/stderr и curl для тестирования — kerberos дает очень подробный журнал того, что он делает и почему он не работает.
person rep_movsd    schedule 02.07.2020