LINUX.ORG.RU
решено ФорумAdmin

nginx reverse proxy SPNEGO


0

1

Собственно, я в шоке ... Что делать если я хочу закрыть внутренний http ресурс, обратным https прокси? - Всё получилось, однако когда я попробовал SSO (kerberos), меня ожидало большое разочарование.

Что вообще делают люди в таких ситуациях? Не думал, что проксировать kerberos будет столь не просто...

★★★★★

Последнее исправление: DALDON (всего исправлений: 2)

Обленился совсем. Ни «что сделал», ни «что получил» - нифига нет, и SPNEGO с ошибкой написано.

thesis ★★★★★
()
Ответ на: комментарий от thesis

За ошибку извиняюсь - устал...

Так, а есть-ли смысл писать? Если я правильно понял, то сабж вообще не возможен?

Ну смотри что сделали:

Поставили alfresco (tomcat java kerberos), на хост А. tomcat прослушивает порт: 8080. Т.е.: http://hostA:8080

Это не очень удобно. Хочется: чтобы и внутренний ip, и внешний ip, отзывались на: https://coolname.company.ru

Поставили на хост В (с внешним ip), nginx (v 1.6.0), где ему велели делать перенаправление с: http://coolname.company.ru на: https://coolname.company.ru , далее сказали, что всё что приходит на: https://coolname.company.ru - отправить на: http://hostA:8080 . Всё супер. Купили сертификаты, поставили. Работает. Пользователи могут входить в alfresco и т.п. Теперь, потребовалось настроить для всех кто внутри: SSO. Через https. - Ну тоже вполне логичное желание... - Ибо мне нужен не только http, мне надобно и webdav, и sharepoint (это всё уже есть в alfresco). - И когда мы радостно хотим получить билет kerberos, мы его не получаем... - А в логах получаем нечто: SPNEGO checksumm error. - Пробуем придти используя kerberos напрямую на: http://hostA:8080 , успешно получаем билет, и проходим аутотентификацию.

Непродолжительно гуглим на предмет: nginx reverse proxy SSO kerberos alfresco - видим более чем ничего. Гуглим просто на: nginx kerberos proxy , и получаем пару ссылок на какие-то костыльные, брошенные модули...

Дальше приходим в ШОК, и бежим создавать тему на форуме... С вопросом у умных человеков - сон это или нет... - Если не сон... Тогда я даже не знаю чего делать мне если честно.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

А если аутентификацией заведует альфреска, зачем трогать нжынкс?
Я уже успел нафиг забыть, как работает цербер, но блин, ведь если клиент идет на https://, то он и тикет получает для https://, не?

А в логах получаем нечто: SPNEGO checksumm error.

В чьих?

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 1)
Ответ на: комментарий от thesis

Ты говоришь вполне толковые вещи. Я в этом деле жуткий нуб... Это первая моя инсталляция nginx, за исключением этого момента вполне удачная.

В чьих?

В логах tomcat который бежит на хост А. :(

Аутентификацией заведует альфреска

Да конечно. Она и заведует. Всё верно.

https://, то он и тикет получает для https://, не?

Минуточку сэр... А вот тут поподробнее пожалуйста! Я думаю вполне логично. Браузер ведь запрашивать будет.

Кажется ты очень толково меня наталкиваешь на мысль...

Значит схема выглядит так: браузер (https) -> (https) nginx (http:8080) -> (http:8080) alfresco

То есть, похоже, что браузер действительно (пытается получить билет на https?) Судя по логам tomcat билет выпускается/пытается выпустится (крайне не много там информации)... И дальше идёт очень не информативное checksumm error.

2014-07-16 17:27:55,283  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-3] New Kerberos auth request from 192.168.9.2 (192.168.9.2:50882)
 2014-07-16 17:27:55,284  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-3] Issuing login challenge to browser.
 2014-07-16 17:27:55,313  ERROR [org.alfresco.fileserver] [http-bio-8080-exec-4] Error from JLAN
 GSSException: Failure unspecified at GSS-API level (Mechanism level: Checksum failed)
        at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:788)
        at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
.....
.....
.....

2014-07-16 17:27:55,315  DEBUG [ap2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] No SPNEGO response, Kerberos logon failed
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Failed SPNEGO authentication.
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Clearing session.
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Issuing login challenge to browser.
 2014-07-16 17:27:55,421  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-5] Login page requested, chaining ...
p.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] No SPNEGO response, Kerberos logon failed
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Failed SPNEGO authentication.
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Clearing session.
 2014-07-16 17:27:55,315  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-4] Issuing login challenge to browser.
 2014-07-16 17:27:55,421  DEBUG [app.servlet.KerberosAuthenticationFilter] [http-bio-8080-exec-5] Login page requested, chaining ...

Я с вебом на «Ваше высочество», а с kerberos так вообще на: «миленький, ну заработай пожалуйста»...

Смотри, я создаю SPN на внутреннее имя хоста (host A), а прихожу на внешнее имя хоста (host B). - Может тут что-то мне надо изменить..? Беда в том, что я крайне слабо понимаю в том, что есть: SPN, что есть kvno, шифрование и всё прочее. Я буду ОЧЕНЬ тебе признателен, если ты посмотришь инструкцию вот тут: http://docs.alfresco.com/4.2/tasks/auth-kerberos-ADconfig.html и что-то подскажешь.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

Блин, мне лень врубаться, честно. Я с зимы все забыл, а в кэше щас лежат совсем другие нужные вещи, поэтому я так, по верхам.

Пойди простым путем: выкинь хттпсный редирект на проксе в локалке и попробуй добиться работы SSO, проксируя голый хттп.

SPNы из церберовых пакетов подсматриваются снифером, что тоже помогает. Смотри на DC, кто когда зачем к нему ходит. Кстати, венда любит закэшировать «неправильный» тикет сервиса и держать его черт знает сколько времени. Я этот кэш чистить так и не научился, помнится, ребутнуть клиента было быстрее.

No SPNEGO response

Как-то непохоже на попытку аутентификации.

thesis ★★★★★
()
Ответ на: комментарий от thesis

SPNы из церберовых пакетов подсматриваются снифером, что тоже помогает. Смотри на DC, кто когда зачем к нему ходит. Кстати, венда любит закэшировать «неправильный» тикет сервиса и держать его черт знает сколько времени. Я этот кэш чистить так и не научился, помнится, ребутнуть клиента было быстрее.

Кхм... Спасибо. Сейчас у меня винды правда вообще нету нигде. В роли KDC - samba4, в роли клиента: linux

Пойди простым путем: выкинь хттпсный редирект на проксе в локалке и попробуй добиться работы SSO, проксируя голый хттп.

Ок! Классная идея! Я сначало попробую добавить SPN, потом попробую пойти этим путём.

Блин, мне лень врубаться, честно.

Я тебя понимаю! Спасибо за то, что вообще подсказал куда копать..! Я покопаю - отпишусь.

No SPNEGO response

Как-то непохоже на попытку аутентификации.

Может оно и к лучшему, может оно в SPN стучится куда-нибудь в несуществующий... Завтра создать попробую.

DALDON ★★★★★
() автор топика

насчет kerberos не знаю, но tomcat должен знать о reverse proxy, чтобы правильно отдавать назад.

server.xml

<Connector port=8080

...

scheme=«https» proxyName=«hostA» proxyPort=«443» />

zgen ★★★★★
()
Последнее исправление: zgen (всего исправлений: 6)
Ответ на: комментарий от zgen

Есть такой файл. Но не очень уверен, что он мне как-то поможет... Буду думать.

DALDON ★★★★★
() автор топика
Ответ на: комментарий от thesis

Создал SPN на fqdn реверсивного прокси - не помогло. :(

Пока не знаю чего делать, буду пробовать tcpdump наверно. Но не уверен, что это всё мне поможет если честно.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

Ставь wireshark на контроллер домена и смотри запросы/ответы и сервера, и клиента. Проясняет картину.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Ок! Ну пока в качестве последней конвульсии, я таки попробую поставить nginx на тот же хост, на котором у меня всё это добро стоит. Запроксировать порты: 8080-80 , и таким образом у меня будет единое DNS имя.

http://tomcat.apache.org/tomcat-7.0-doc/windows-auth-howto.html - вот тут вот кое-чего написано касаемое меня возможно:

The host name of the Tomcat server must match the host name in the SPN exactly else authentication will fail. A checksum error may be reported in the debug logs in this case.

Так что я думаю, у мне явно стоит попробовать поставить nginx на сервер прямо и для начала придти хотя-бы на: https://localafrescoservername - и посмотреть чего будет. Если всё срастётся, то скорее всего я так и оставлю эту схему. Других вариантов особо нету всё равно.

Теперь бы мне понять как поставить nginx на переделанную вендором centOS... Сейчас ковыряюсь с подключением epel репозитория.

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

поставить nginx на тот же хост

Для упрощения - отличное решение, ага.
В принципе, я думаю, можно было бы хосту с томкатом сказать, что его хостнейм такой же, как днс-имя хоста с нжынксом, но пока лучше так.

поставить nginx на переделанную вендором centOS

Нормально всё будет.

thesis ★★★★★
()
Ответ на: комментарий от thesis

Если бы ты себе представлял как я уже офигел ставить этот nginx...

Чтобы подключить epel репозитарий: я раскрыл rpm пакет, и раскидал конфиги куда надо.

Дальше больше...

[root@alfresco-prd tmp]# yum -v repolist
Repo-id      : epel
Repo-name    : Extra Packages for Enterprise Linux 6 - x86_64
Repo-revision: 1405477554
Repo-tags    : binary-x86_64
Repo-updated : Wed Jul 16 06:29:00 2014
Repo-pkgs    : 10 999
Repo-size    : 10 G
Repo-metalink: https://mirrors.fedoraproject.org/metalink?repo=epel-6&arch=x86_64
  Updated    : Wed Jul 16 06:29:00 2014
Repo-baseurl : http://mirror.logol.ru/epel/6/x86_64/ (79 more)
Repo-expire  : 21 600 second(s) (last: Thu Jul 17 14:54:50 2014)

Repo-id      : nginx
Repo-name    : nginx repo
Repo-revision: 1405432278
Repo-updated : Tue Jul 15 17:51:19 2014
Repo-pkgs    : 59
Repo-size    : 47 M
Repo-baseurl : http://nginx.org/packages/centos/6/x86_64/
Repo-expire  : 21 600 second(s) (last: Thu Jul 17 12:29:16 2014)

Repo-id      : rpmforge
Repo-name    : RHEL 6Server - RPMforge.net - dag
Repo-updated : Fri Jul 11 05:46:59 2014
Repo-pkgs    : 4 718
Repo-size    : 2.2 G
Repo-baseurl : http://apt.sw.be/redhat/el6/en/x86_64/rpmforge
Repo-mirrors : http://apt.sw.be/redhat/el6/en/mirrors-rpmforge
Repo-expire  : 21 600 second(s) (last: Thu Jul 17 13:45:02 2014)

repolist: 18 676

И что бы вы подумали сЭр...

[root@alfresco-prd tmp]# yum install nginx
Loaded plugins: refresh-packagekit, security
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package nginx.x86_64 0:1.6.0-2.el6.ngx will be installed
--> Processing Dependency: libz.so.1(ZLIB_1.2.0)(64bit) for package: nginx-1.6.0-2.el6.ngx.x86_64
--> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit) for package: nginx-1.6.0-2.el6.ngx.x86_64
--> Finished Dependency Resolution
--> Finding unneeded leftover dependencies
Found and removing 0 unneeded dependencies
Error: Package: nginx-1.6.0-2.el6.ngx.x86_64 (nginx)
           Requires: libz.so.1(ZLIB_1.2.0)(64bit)
Error: Package: nginx-1.6.0-2.el6.ngx.x86_64 (nginx)
           Requires: libcrypto.so.10(OPENSSL_1.0.1_EC)(64bit)
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

Это CentOS 6.3.

В принципе, я думаю, можно было бы хосту с томкатом сказать, что его хостнейм такой же, как днс-имя хоста с нжынксом, но пока лучше так.

Погляжу server.xml на этот предмет. В общем то тоже годная тема.

Ещё в SPN можно указывать оказывается и порты... Ну надеюсь, что проканает моя идея и без порта...

DALDON ★★★★★
() автор топика
Ответ на: комментарий от zgen

Пытаюсь сделать пока Ваш совет. Совет толковый, но пока не выходит. :(

    <Connector port="8443" URIEncoding="UTF-8" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" proxyName="portal.company.ru" proxyPort="443" keystoreFile="/opt/...

Всё тоже самое. :( Но видно, что параметры работают. Может как-то изменить?

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Но видно, что параметры работают. Может как-то изменить?

У вас между nginx и tomcat шифрованное соединение?

zgen ★★★★★
()
Ответ на: комментарий от zgen

Нет, не шифрованное. У меня nginx стучится на порт: 8080.

Я буду весьма рад, если оцените кусочек конфига:

    <Connector port="8080" protocol="HTTP/1.1"
		proxyName="portal.company.ru"
	       connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />
    <!-- A "Connector" using the shared thread pool-->
    <!--
    <Connector executor="tomcatThreadPool"
               port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    -->
    <!-- Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the
         connector should be using the OpenSSL style configuration
         described in the APR documentation -->
    <Connector port="8443" URIEncoding="UTF-8" protocol="org.apache.coyote.http11.Http11Protocol" SSLEnabled="true"
               maxThreads="150" scheme="https" proxyName="portal.company.ru" proxyPort="443" keystoreFile="/opt/data/keystore/ssl.keystore" keystorePass="kT9X6oe68t" keystoreType="JCEKS"
               secure="true" connectionTimeout="240000" truststoreFile="/opt/data/keystore/ssl.truststore" truststorePass="kT9X6oe68t" truststoreType="JCEKS"
               clientAuth="want" sslProtocol="TLS" allowUnsafeLegacyRenegotiation="true" maxHttpHeaderSize="32768" />  

Очень с трудом понимаю что тут происходит, но на порт: 8080 можно было придти свободно. Теперь же получаю вот какую картину: набираю http://hostame.local:8080 (где hostame.local - имя хоста на котором бежит tomcat, т.е. без обратного проксирования) - а меня как-бы перекидывает на: http://portal.company.ru:8080 - то есть оно по всей видимости согласно параметру:proxyName возвращает мне ответ.

В плане kerberos мне это никак не помогло... Я думаю, не помогло по той причине, что: когда я прихожу на nginx, он мне проксирует с: https://portal.company.ru на, http://hostame.local:8080 , обратный ответ с tomcat мне приходит с: http://portal.company.ru (согласно параметру что я добавил), и тут уже nginx по-сути наверное меняет: http://portal.company.ru на http://portal.company.ru , то есть не делает ровным счётом ничего, при обратном ответе. Но так-как всё же одна замена происходит - когда я прихожу на nginx - то билет я получить не могу, и получаю checksumm error.

Ну это чисто мои догадки... Но я думаю, что как-то так. Может что подскажете толкового?

Да, меня смущает, что у меня в конфиге tomcat прописан редирект на 8443 порт, но по факту редиректа не происходит вроде. - Прописывал не я... Оно уже так поставлялось с alfresco.

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 2)
Ответ на: комментарий от thesis

Поставил nginx на туже машину где стоит tomcat - всё заработало с первого раза. Не любит kerberos rewrite имён.

Только nginx я ставил с ОЧЕНЬ большими проблемами. Теперь остались косяки... Если интересно - я могу рассказать подробнее, быть может Вы мне подскажете?

DALDON ★★★★★
() автор топика
Ответ на: комментарий от zgen

Поставил nginx на туже машину где стоит tomcat - всё заработало с первого раза. Не любит kerberos rewrite имён. :(

DALDON ★★★★★
() автор топика
Ответ на: комментарий от DALDON

Обленился, я и говорю. Ни тебе снифанья кербероса, ни его же логов.
Наверняка ведь проблема в SPN и она решаемая.

Про нжынкс, наверное, разумнее было бы отдельный топик завести.

Вы

Ой...

thesis ★★★★★
()
Ответ на: комментарий от thesis

Наверняка ведь проблема в SPN и она решаемая.

Ну я смогу потом переделать... Сейчас мне нужно уже двигаться дальше, к сожалению у меня нету больше времени на столь тотальные разборки. Мне надо уже в Понедельник по идее отдать всё программистам...

А если говорить о проблеме с SPN - я уверен, что проблема не в этом. Так-как я завёл все мыслимые SPN на всякий случай. :) То есть я завёл: fqdn машинки с nginx, завёл fqdn машинки с tomcat, и аналогично я сделал с hostname этих машинок. - Увы... Не помогло. Никаких других имён я думаю там нету вприницпе. Я думаю что проблема в том, что браузер посылает kerberos запрос, и считает контрольную сумму пакета. Nginx переписывает hostname, и tomcat уже не может видимо подсчитать эту сумму... Да, конечно это всего лишь мои догадки. Но я думаю что я прав... Надо поснифать будет. Я себе положу на стек, потом может закастую тебя, как поснифаю. Но в целом, я на: 99,9% уверен, что я прав, и ничего толкового я там не наснифаю. Там ведь по логам судя, билет то даже и не выдавался (твоё кажется замечание кстати. Вполне разумное.). То есть стало быть, вполне возможно до SPN дело то и не доходит даже - считает tomcat контрольную сумму - и rejectит сразу всё это «добро».

Ок, может быть создам тему с nginx + CentOS 6.3. Но там похоже всё очень плохо на самом то деле. Пока есть более приоритетная задача (скоро создам тред).

Я очень сильно тебя благодарю, ведь благодаря твоим мыслям я смог так или иначе разобраться с вопросом. Чтобы не тратить целый белый ip на на один tomcat, я на улицу наверно повешу просто ещё один nginx, там мне kerberos не нужен. А внутри уже пусть будет как есть наверно. Да и идеологически это выглядит наверное даже более правильно.

Вы

Ой...

Я набираю много текста, по сему очень многие слова у меня набираются на автомате, и иногда я забываю их исправлять. :)

Спасибо тебе всяческое ещё раз!

DALDON ★★★★★
() автор топика
Последнее исправление: DALDON (всего исправлений: 1)
Ответ на: комментарий от DALDON

Я думаю что проблема в том, что браузер посылает kerberos запрос, и считает контрольную сумму пакета. Nginx переписывает hostname, и tomcat уже не может видимо подсчитать эту сумму.

Я думаю, проблема в том, что клиент получает тикет для http/nginxhost.corp.com, а приходит (пусть черех прокси, неважно) с этим тикетом на сервис, ожидающий тикета на http/tomcathost.corp.com, каковой сервис поэтому удивленно шлет его в жопу. А уж переписать какие-либо данные в тикете сервиса нжынкс не может (да и нафиг ему это надо - его дела дальше передать токен аутентификации), насколько я понимаю всю эту кухню.
Но не видя трафика с контроллера домена и полной картинки с конфигами и кейтабами, сказать что-то невозможно.
(А вдумчиво смотреть полную картину все равно было бы лень :))

thesis ★★★★★
()
Последнее исправление: thesis (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.