Неверный заголовок согласования с плагином Spring Security Kerberos - PullRequest
0 голосов
/ 20 марта 2019

Характеристики окружающей среды:

Grails Версия: 3.3.9JDK: jdk1.8.0_161Клиентская ОС: Windows Server 2012 R2Серверная ОС: Windows 7 64-битная(Я знаю, что мой клиент / сервер кажется отсталым, но я работаю на Windows 7, и мне просто нужен компьютер в домене для тестирования)Версия Spring Security Core Plugin: 3.2.3Плагин Spring Security Kerberos Версия: 3.0.1Среда Active Directory: Microsoft Active Directory

Проблема:Я хочу использовать встроенную проверку подлинности Windows в своем приложении Grails.Когда я запускаю приложение, захожу на сайт в IE и набираю учетные данные домена, я получаю HTTP 500 в браузере.Когда я проверяю консоль, она говорит «Успешно подтвержден [пользователь]», но затем он говорит «Неверный заголовок».Вот шаги, которые я предпринял для пользователя домена, настройки spn, генерации таблицы ключей, настроек grails (из-за безопасности часть информации заменяется фиктивными данными) и вывод на консоль.

Пользователь доменаСвойства (с контроллера домена) В Active Directory у меня есть учетная запись службы (grailsuser), которая является просто пользователем домена.На вкладке Учетная запись -> Параметры учетной записи я выбрал следующее: «Эта учетная запись поддерживает 128-битное шифрование Kerberos AES» и «Эта учетная запись поддерживает 256-битное шифрование Kerberos AES»

На вкладке «Делегирование» у меня есть «Доверять этому пользователю возможность делегирования какой-либо службе (только Kerberos) ».

SPN (с контроллера домена): приложение grails запускается с моего компьютера.Полное доменное имя - devbox.tst.trknow.com@TST.TRKNOW.COM.Я подтвердил, что мой spn настроен с помощью set -L tst\grailsuser.Вывод:

Registered ServicePrincipalNames for CN=Grails LDAP Service Account,CN=Managed Service Accounts,DC=tst,DC=trknow,DC=com:
        HTTP/devbox.tst.trknow.com

Файл Keytab (с контроллера домена):

Используя ktpass, я выполнил следующую команду с выводом

C:\Users\administrator.TST>ktpass /out c:\http-grails.keytab /mapuser grailsuser@TST.TRKNOW.COM /princ HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM /pass pwd123! /ptype KRB5_NT_PRINCIPAL /crypto All
Targeting domain controller: TSTHQDC02.tst.trknow.com
Using legacy password setting method
Successfully mapped HTTP/devbox.tst.trknow.com to grailsuser.
Key created.
Key created.
Key created.
Key created.
Key created.
Output keytab to c:\http-grails.keytab:
Keytab version: 0x502
keysize 70 HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM ptype 1 (KRB5_NT_PRINCIPA
L) vno 14 etype 0x1 (DES-CBC-CRC) keylength 8 (0x5d7513981fecb325)
keysize 70 HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM ptype 1 (KRB5_NT_PRINCIPA
L) vno 14 etype 0x3 (DES-CBC-MD5) keylength 8 (0x5d7513981fecb325)
keysize 78 HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM ptype 1 (KRB5_NT_PRINCIPA
L) vno 14 etype 0x17 (RC4-HMAC) keylength 16 (0x7f3d70a908e23efd5b7b5bcc5cc3c367
)
keysize 94 HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM ptype 1 (KRB5_NT_PRINCIPA
L) vno 14 etype 0x12 (AES256-SHA1) keylength 32 (0x217ca444790211d2fb10ec80ef5ac
0ce0d036080899c16e70134b015d24030ca)
keysize 78 HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM ptype 1 (KRB5_NT_PRINCIPA
L) vno 14 etype 0x11 (AES128-SHA1) keylength 16 (0x3eb60788149300cde7a44a53c0eeb
a80)

Настройки Grails (изк моему домену подключен девайс компьютер)На этом этапе настройка системного администратора завершена, и я могу вернуться к разработке.Итак, теперь я копирую файл http-grails.keytab на мой компьютер.Я запускаю тестовое приложение со следующими настройками:

application.groovy

import grails.util.Environment
// Added by the Spring Security Core plugin:
grails.plugin.springsecurity.userLookup.userDomainClassName = 'ssotesty.User'
grails.plugin.springsecurity.userLookup.authorityJoinClassName = 'ssotesty.UserRole'
grails.plugin.springsecurity.authority.className = 'ssotesty.Role'
grails.plugin.springsecurity.controllerAnnotations.staticRules = [
        [pattern: '/',               access: ['permitAll']],
        [pattern: '/error',          access: ['permitAll']],
        [pattern: '/index',          access: ['permitAll']],
        [pattern: '/index.gsp',      access: ['permitAll']],
        [pattern: '/shutdown',       access: ['permitAll']],
        [pattern: '/assets/**',      access: ['permitAll']],
        [pattern: '/**/js/**',       access: ['permitAll']],
        [pattern: '/**/css/**',      access: ['permitAll']],
        [pattern: '/**/images/**',   access: ['permitAll']],
        [pattern: '/**/favicon.ico', access: ['permitAll']]
]

grails.plugin.springsecurity.filterChain.chainMap = [
        [pattern: '/assets/**',      filters: 'none'],
        [pattern: '/**/js/**',       filters: 'none'],
        [pattern: '/**/css/**',      filters: 'none'],
        [pattern: '/**/images/**',   filters: 'none'],
        [pattern: '/**/favicon.ico', filters: 'none'],
        [pattern: '/**',             filters: 'JOINED_FILTERS']
]

//Kerberos
grails.plugin.springsecurity.kerberos.ticketValidator.servicePrincipal =
        'HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM'

//If Prod
if(!Environment.isDevelopmentMode()){
    grails.plugin.springsecurity.kerberos.ticketValidator.keyTabLocation =
            'file:////home/sso/http-grails.keytab'

}
else{
    grails.plugin.springsecurity.kerberos.ticketValidator.keyTabLocation =
            'file:///C:\\grails3projects\\http-grails.keytab'
}
grails.plugin.springsecurity.kerberos.client.debug = true
grails.plugin.springsecurity.kerberos.debug = true
grails.plugin.springsecurity.kerberos.ticketValidator.debug = true

SecureController.groovy

package ssotesty

import grails.plugin.springsecurity.annotation.Secured


class SecureController {


    def index() {
        render "You can see this!" }

    @Secured('permitAll')
    def open(){
        render "This is open"
    }

}

Итак, я запускаю приложение, иду кклиентская машина, и ударил мою индексную страницу контроллера в IE.Мне предлагается ввести учетные данные (я не хочу этого, если пользователь, вошедший в систему, является учетной записью в домене. Приложение должно либо принять, либо отклонить), а затем я получаю следующий вывод о недействительности заголовка Negotiate.

Вывод на консоль:

2019-03-20 15:05:43.684 DEBUG --- [nio-8080-exec-7] o.s.s.k.w.a.SpnegoEntryPoint             : Add header WWW-Authenticate:Negotiate to http://devbox.tst.trknow.com:8080/secure/index, forward: no
2019-03-20 15:05:43.684 DEBUG --- [nio-8080-exec-7] o.s.s.k.w.a.SpnegoEntryPoint             : Add header WWW-Authenticate:Negotiate to http://devbox.tst.trknow.com:8080/secure/index, forward: no
2019-03-20 15:05:55.323 DEBUG --- [io-8080-exec-10] w.a.SpnegoAuthenticationProcessingFilter : Received Negotiate Header for request http://devbox.tst.trknow.com:8080/secure/index: Negotiate YIIHKwYGKwYBBQUCoIIHHzCCBxugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYK*Truncated*
2019-03-20 15:05:55.323 DEBUG --- [io-8080-exec-10] w.a.SpnegoAuthenticationProcessingFilter : Received Negotiate Header for request http://devbox.tst.trknow.com:8080/secure/index: Negotiate YIIHKwYGKwYBBQUCoIIHHzCCBxugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYK*Truncated*
2019-03-20 15:05:55.324 DEBUG --- [io-8080-exec-10] .a.KerberosServiceAuthenticationProvider : Try to validate Kerberos Token
2019-03-20 15:05:55.324 DEBUG --- [io-8080-exec-10] .a.KerberosServiceAuthenticationProvider : Try to validate Kerberos Token
Found KeyTab C:\grails3projects\http-grails.keytab for HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
Found KeyTab C:\grails3projects\http-grails.keytab for HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
Entered Krb5Context.acceptSecContext with state=STATE_NEW
Java config name: null
Native config name: C:\windows\krb5.ini
Loaded from native config
>>> KeyTabInputStream, readName(): TST.TRKNOW.COM
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): devbox.tst.trknow.com
>>> KeyTab: load() entry length: 70; type: 1
>>> KeyTabInputStream, readName(): TST.TRKNOW.COM
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): devbox.tst.trknow.com
>>> KeyTab: load() entry length: 70; type: 3
>>> KeyTabInputStream, readName(): TST.TRKNOW.COM
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): devbox.tst.trknow.com
>>> KeyTab: load() entry length: 78; type: 23
>>> KeyTabInputStream, readName(): TST.TRKNOW.COM
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): devbox.tst.trknow.com
>>> KeyTab: load() entry length: 94; type: 18
>>> KeyTabInputStream, readName(): TST.TRKNOW.COM
>>> KeyTabInputStream, readName(): HTTP
>>> KeyTabInputStream, readName(): devbox.tst.trknow.com
>>> KeyTab: load() entry length: 78; type: 17
Looking for keys for: HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
Added key: 17version: 14
Added key: 18version: 14
Added key: 23version: 14
Found unsupported keytype (3) for HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
Found unsupported keytype (1) for HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
Using builtin default etypes for permitted_enctypes
default etypes for permitted_enctypes: 18 17 16 23.
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
MemoryCache: add 1553108589/041556/905183D04DE02C32E30F1CE01B5F9AC2/bmoe.dev@TST.TRKNOW.COM to bmoe.dev@TST.TRKNOW.COM|HTTP/devbox.tst.trknow.com@TST.TRKNOW.COM
>>> KrbApReq: authenticate succeed.
Krb5Context setting peerSeqNumber to: 710158400
>>> EType: sun.security.krb5.internal.crypto.Aes256CtsHmacSha1EType
Krb5Context setting mySeqNumber to: 59568554
>>> Constrained deleg from GSSCaller{UNKNOWN}
2019-03-20 15:05:56.104 DEBUG --- [io-8080-exec-10] .a.KerberosServiceAuthenticationProvider : Succesfully validated bmoe.dev@TST.TRKNOW.COM
2019-03-20 15:05:56.104 DEBUG --- [io-8080-exec-10] .a.KerberosServiceAuthenticationProvider : Succesfully validated bmoe.dev@TST.TRKNOW.COM
2019-03-20 15:05:56.289  WARN --- [io-8080-exec-10] w.a.SpnegoAuthenticationProcessingFilter : Negotiate Header was invalid: Negotiate YIIHKwYGKwYBBQUCoIIHHzCCBxugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYK*Truncate*

grails.plugin.springsecurity.userdetails.NoStackUsernameNotFoundException: User not found

2019-03-20 15:05:56.289  WARN --- [io-8080-exec-10] w.a.SpnegoAuthenticationProcessingFilter : Negotiate Header was invalid: Negotiate YIIHKwYGKwYBBQUCoIIHHzCCBxugMDAuBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHgYK*Truncate*

grails.plugin.springsecurity.userdetails.NoStackUsernameNotFoundException: User not found

Вот мой файл krb5.ini, если он недействителен:

[libdefaults]
    default_realm = TST.TRKNOW.COM
    default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
    default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 des3-cbc-sha1 arcfour-hmac-md5 camellia256-cts-cmac camellia128-cts-cmac des-cbc-crc des-cbc-md5 des-cbc-md4
[realms]
    TST.TRKNOW.COM = {
        kdc = TSTHQDC02.TST.TRKNOW.COM:88
        admin_server = TSTHQDC02.TST.TRKNOW.COM
        default_domain = TST.TRKNOW.COM
    }

[domain_realm]
    .tst.trknow.com = TST.TRKNOW.COM
    tst.trknow.com = TST.TRKNOW.COM

[login]
    krb5_convert = true
    krb5_get_tickets = false

Я боролся с этим уже 3 дня.Я не могу себе представить, что плагин kerberos просто не работает (особенно если учесть, что Burt Beckwith является его основным автором), так что, надеюсь, кто-то может дать здесь некоторые рекомендации.

...