Почему я получаю "Кэш учетных данных не найден" в SSO, используя pyKerberos (authGSSClientStep)?
Я использую SLES11 с Python2.6 и веб-приложением Apache. У меня есть сервер Active Directory с Kerberos, и я хочу использовать SSO с моим приложением.
Я уже создал принципал службы HTTP/host.example.org в домене EXAMPLE.ORG. Этот пользователь сопоставлен с фиктивным пользователем app.dmy@EXAMPLE.ORG.
Kerberos отлично работает на клиенте Linux, и я могу инициировать принципал службы
kinit -s HTTP/host.example.org app.dmy@EXAMPLE.ORG
Klist
Ticket cache: FILE:/tmp/krb5cc_0
Default principal: app.dmy@EXAMPLE.ORG
Valid starting Expires Service principal
09/28/15 14:27:27 09/28/15 14:37:27 HTTP/host.example.org@EXAMPLE.ORG
Kerberos 4 ticket cache: /tmp/tkt0
klist: You have no tickets cached
Мой /etc/krb5.conf выглядит так:
1 [libdefaults]
2 ticket_lifetime = 600
3 default_realm = EXAMPLE.ORG
4 kdc_req_checksum_type = 2
5 checksum_type = 2
6 ccache_type = 1
7 clockskew = 300
8
9 [kdc]
10 profile = /var/lib/kerberos/krb5kdc/kdc.conf
11
12 [logging]
13 kdc = FILE:/var/log/krb5/kdc.log
14 admin_server = FILE:/var/log/krb5/adm.log
15 default = FILE:/var/log/krb5/log.log
16
17 [realms]
18 EXAMPLE.ORG = {
19 kdc = adserver.example.org:88
20 admin_server = adserver.example.org:749
21 default_domain = EXAMPLE.ORG
22 }
23
24 [domain_realm]
25 example.org = EXAMPLE.ORG
26 .example.org = EXAMPLE.ORG
27
28 [login]
29 krb4_convert = 0
30 [appdefaults]
31 pam = {
32 ticket_lifetime = 1d
33 renew_lifetime = 1d
34 forwardable = true
35 proxiable = false
36 minimum_uid = 1
37 clockskew = 300
38 external = sshd
39 use_shmem = sshd
40 }
Если я использую аутентификацию через apache и mod_auth_kerb, SSO работает нормально. Но я хочу иметь больше контроля над соединением, поэтому отключил аутентификацию apache и написал свой собственный модуль на python (cherrypy framework).
Я установил pyKerberos (Kerberos1.2 не работает и происходит сбой Python с ошибкой сегментации).
Вот мой код Python:
import kerberos
import base64
service = 'HTTP'
hostname = 'host.example.org'
# env.log(kerberos.checkPassword('app.dmy', 'xxx', service, 'EXAMPLE.ORG')
''' for testing works fine '''
spn = kerberos.getServerPrincipalDetails(service, hostname)
''' result service principla from keytab
HTTP/host.example.org@EXAMPLE.ORG'''
status, _ctxt = kerberos.authGSSClientInit(spn)
''' status = 1, _ctxt = context object '''
kerberos.authGSSClientStep(_ctxt, base64.b64encode(""))
Я получаю следующий результат в логах:
(('Unspecified GSS failure. Minor code may provide more information', 851968), ('No credentials cache found', -1765328189))
Файл кэша существует в tmp, а spn регистрируется с помощью kinit.
1 ответ
Вы называете неправильные процедуры. Это сторона сервера: акцептор GSSAPI, аутентифицирующий HTTP-клиента. Вам нужно вызвать authGSSServer{Init,Step}; с точки зрения фактических вызовов GSSAPI, gss_accept_sec_context(). Вместо этого вы вызываете gss_init_sec_context(), который жалуется на то, что в ccache по умолчанию отсутствуют учетные данные в виде TGT, которые он может использовать для получения билета на сервер. Серверы в Kerberos не требуют одинаковых учетных данных; вместо этого у них есть таблица ключей с их долгосрочными ключами, и им не нужно связываться с KDC для аутентификации клиентов.