К основному контенту

Weblogic Diagnostic Framework Run Bash Script (reboot managed server) - (bad practices)

Вообщем переодически сервер дохнет по: The WebLogic Server encountered a critical failure java.lang.OutOfMemoryError: Metaspace Reason: There is a panic condition in the server. The server is configured to exit on panic И хотя это гавно пишет типа  Reason: There is a panic condition in the server. The server is configured to exit on panic чёт ни хуя он ни куда не exit.... Вообщем т.к разбираться с тем чем он жрётся нет ни времени ни желания (оно обязательно появится)... как вариант можно приделать костыль... костыль будет заключаться в ребуте сервера при возникновении этой ошибки. Что значит для этого надо... Желания и понимание что так жить нельзя, и вообще... Делаем новый модуль называем скажем:  Reboot-OOMMetaSpace Идём в в новый модуль делаем Policy: Называем его OOM-Metaspace и говорит что это Server log: Жмём next в Configuration Policy пишем: log.logMessage.contains('java.lang.OutOfMemoryError: Metaspace'...

Weblogic Kerberos

Weblogic установлен на сервере budwf
Домен контролер wcctst.wcc.local
Клиентская винда XZ

1. Генерим keytab

ktpass -princ HTTP/srv_budwf@WCC.LOCAL -mapuser srv_budwf -kvno 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass lalal_1 -out c:\temp\budwf.keytab

Т.е в данном случае principal name в keytab полностью соответствует ожиданиям...

C:\Users\Administrator>ktpass -princ HTTP/srv_budwf@WCC.LOCAL -mapuser srv_budwf -kv
no 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass lalal_1 -out c:\temp\b
udwf.keytab
Targeting domain controller: wcctst.wcc.local
Successfully mapped HTTP/budwf to srv_budwf.
Password succesfully set!
Key created.
Output keytab to c:\temp\budwf.keytab:
Keytab version: 0x502
keysize 55 HTTP/budwf@WCC.LOCAL ptype 1 (KRB5_NT_PRINCIPAL) vno 0 etype 0x11 (AE
S128-SHA1) keylength 16 (0xbf005ae14d58153abe3eab57cf5a8260)

C:\Users\Administrator>setspn -L srv_budwf
Registered ServicePrincipalNames for CN=srv_budwf,CN=Users,DC=wcc,DC=local:
        HTTP/srv_budwf

C:\Users\Administrator>setspn -S HTTP/budwf srv_budwf
C:\Users\Administrator>setspn -S HTTP/budwf.wcc.local srv_budwf

Это в принципе похуй но можно выполнить...

C:\Users\Administrator>setspn -D HTTP/srv_budwf srv_budwf

Да пока вспомнил для корректной работы с типом шифрования AES128-SHA1 у пользователя
srv_budwf должна быть соответствующая "галочка":



2. На linux сервере с Weblogic
[01:14:32] oracle@budwf:~ $ cat /etc/krb5.conf
[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 default_realm = WCC.LOCAL 
 dns_lookup_realm = false
 dns_lookup_kdc = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = true

 default_tgs_enctypes = aes128-cts
 default_tkt_enctypes = aes128-cts
 permitted_enctypes = aes128-cts
 clockskew = 300


[realms]
 WCC.LOCAL = {
  kdc = wcctst.wcc.local
  admin_server = wcctst.wcc.local
  default_domain = wcc.local
 }

[domain_realm]
 .wcc.locac = WCC.LOCAL
 wcc.local = WCC.LOCAL

3. Необходимо создать в домене weblogic файл вида:
[01:11:33] oracle@budwf:/opt/oracle/middleware/user_projects/domains/budwf_domain$ cat krb5Login.conf
com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required 
  principal="HTTP/budwf@WCC.LOCAL"
  useKeyTab=true
  keyTab=budwf.keytab
  storeKey=true 
  debug=true;
};

com.sun.security.jgss.krb5.accept {
  com.sun.security.auth.module.Krb5LoginModule required
  principal="HTTP/budwf@WCC.LOCAL"
  useKeyTab=true 
  keyTab=budwf.keytab
  storeKey=true 
  debug=true;
};

т.е в моём случае всё будет храниться в директории
/opt/oracle/middleware/user_projects/domains/budwf_domain.

Если вы решили использовать другую директрию то в ServerStart:
-Djava.security.auth.login.config=/opt/oracle/user_projects/domains/budwf_domain/kerberos/krb5Login.conf 

И keytab должен быть в кавычках т.е:
krb5Login.conf
com.sun.security.jgss.initiate {
  com.sun.security.auth.module.Krb5LoginModule required 
  principal="HTTP/budwf@WCC.LOCAL"
  useKeyTab=true
  keyTab="/opt/oracle/user_projects/domains/budwf_domain/kerberos/budwf.keytab"
  storeKey=true 
  debug=true;
};

com.sun.security.jgss.krb5.accept {

  com.sun.security.auth.module.Krb5LoginModule required
  principal="HTTP/budwf@WCC.LOCAL"
  useKeyTab=true 
  keyTab="/opt/oracle/user_projects/domains/budwf_domain/kerberos/budwf.keytab"
  storeKey=true 
  debug=true;
};


4. Копируем с DC сгенерённый keytab на linux в директорию /opt/oracle/middleware/user_projects/domains/budwf_domain

5. Стартуем weblogic.
Предположим что приложение будет крутится на сервере budwf_1
Соответственно в ServerStart надо сделать следующие настройки:

-Xms1024M -Xmx1024M -Xrs -Dsun.security.krb5.debug=true -Djava.security.krb5.realm=WCC.LOCAL -Djava.security.krb5.kdc=wcctst.wcc.local -Djava.security.auth.login.config=/opt/oracle/middleware/user_projects/domains/budwf_domain/krb5Login.conf -Djavax.security.auth.useSubjectCredsOnly=false

Или кошерней я считаю такие (что бы все настройки брались из /etc/krb5.conf):
-Xms6G -Xmx6G -XX:MaxPermSize=1024M -Xmn3G -Xrs -Dsun.security.krb5.debug=true -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.auth.login.config=/opt/oracle/user_projects/domains/budwf_domain/krb5Login.conf -Djavax.security.auth.useSubjectCredsOnly=false -Dcom.sun.jndi.ldap.read.timeout=10000  -Djava.awt.headless=true -Dweblogic.security.enableNegotiate=true

6. Рестартаем budwf1
7. Деполим тестовую пркладуху

Про саму прикладуху и её настройки можно прочитать в конце поста...

8. Firefox about:config
network.negotiate-auth.trusted-uris: http://,https://

9. Добавить в weblogic пару провадйеров типа самого AD а так же NegotiateIdentityAsserter в падлу писать как это делать там и так всё понятно поидее. NegotiateIdentityAsserter должен быть первый! или virtualize true (наверное)

10. проверяем что получилось предварительно запустив wireshark на клиентской винде.

Если что то пошло не так:
1. На клиентской винде выполнить команду
klist purge

2. Открываем браузер чистим на хер все куки и т.д


4. Переходим на тестовую прикладуху в браузере:

3. Открываем wireshark и смотрим ошибки, одна из самых распространённых:
krb5kdc_err_s_principal_unknown


Вся хуйня в том что сервер резоливится с доменом решение на домен контролере выполнить
setspn -S HTTP/budwf.WCC.LOCAL  srv_budwf

Тестовая прикладуха

Самая ахуенная прикладуха находится в ноте 1332241.1

Правда перед тем как её деплоить необходимо произвести некоторые настройки.
Собственно авторизацией продолжает заниматься weblogic. Так что надо подредактировать пару файлов а именно:
weblogic.xml
web.xml

1. Разархивируем приложение ssotestwebapp.war в папку SSOTest например
[oracle@oracleadmintst SSOTest]$ ls -la *
-rw-r--r-- 1 oracle oinstall  372 Jun 13  2011 index.jsp

WEB-INF:
total 16
drwxr-xr-x 2 oracle oinstall 4096 Feb 28 12:51 .
drwxr-xr-x 3 oracle oinstall 4096 Feb 28 12:51 ..
-rw-r--r-- 1 oracle oinstall  450 Feb 28 12:51 weblogic.xml
-rw-r--r-- 1 oracle oinstall  844 Feb 25 14:23 web.xml

2. Идем в WEB-INF
3. Тут отмечу все важные строки:
[oracle@oracleadmintst WEB-INF]$ cat weblogic.xml 
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<security-role-assignment>
<role-name>Admin</role-name>
<principal-name>Administrator</principal-name>
<principal-name>PDegtyarev</principal-name>
</security-role-assignment>
<context-root>ssotest</context-root>
</weblogic-web-app>
[oracle@oracleadmintst WEB-INF]$ cat web.xml 
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  <security-constraint>
<display-name>Security Constraint for SSO </display-name>
<web-resource-collection>
<web-resource-name>My webapp</web-resource-name>
<description>Group of Users</description>
<url-pattern>/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>CLIENT-CERT</auth-method>
</login-config>
<security-role>
<description>Role description</description>
<role-name>Admin</role-name>
</security-role>
</web-app>

соответственно в weblogic.xml <principal-name>PDegtyarev</principal-name>

Что бы работало для все пользователей weblogic.xml:
<!DOCTYPE weblogic-web-app PUBLIC "-//BEA Systems, Inc.//DTD Web Application 8.1//EN" "http://www.bea.com/servers/wls810/dtd/weblogic810-web-jar.dtd">
<weblogic-web-app>
<security-role-assignment>
<role-name>Admin</role-name>
<principal-name>users</principal-name>
</security-role-assignment>
<context-root>ssotest</context-root>
</weblogic-web-app>

P.S По поводу пункта 3 и 4...  Настоятельно рекомендуется положить krb5Login.conf и keytab в директорию домена.
Если создавать какуй-то папку для этого дела.. походу надо чётко указывать пути(т.е в ServerStart путь до krb5Login.conf  и в krb5Login.conf путь до keytab файла)
В случае же если они лежат в директории домена keytab будет искаться именно там. Наверное.

P.P.S так тестовую прикладуху можно спизить из этого http://www.oracle.com/technetwork/articles/idm/weblogic-sso-kerberos-1619890.html поста но у меня не получилось заставить её работать из-за проблем с версией java и рекомпилить её было лень.


Не большое дополнение:
Так же при попытке зайти на тестовую прикладуху http://weblogicserver/ssotest вы можете получать ошибку 401 unauthorized хотя всё сделали правильно.

После включение atn debug в weblogic в manageserver.log возможны следующие строки:
<<WLS Kernel>> <> <12f3f237012906ff:-a636d22:14cd70911a2:-8000-0000000000001ef0> <1429615677281> <BEA-000000> <GSSExceptionInfo:
####<Apr 21, 2015 2:27:57 PM MSK> <Debug> <SecurityAtn> <myweblogicserver> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <12f3f237012906ff:-a636d22:14cd70911a2:-8000-0000000000001ef0> <1429615677281> <BEA-000000> <   major: (13) : No valid credentials provided
####<Apr 21, 2015 2:27:57 PM MSK> <Debug> <SecurityAtn> <myweblogicserver> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <12f3f237012906ff:-a636d22:14cd70911a2:-8000-0000000000001ef0> <1429615677281> <BEA-000000> <   minor: (-1) : Failed to find any Kerberos Key
####<Apr 21, 2015 2:27:57 PM MSK> <Debug> <SecurityAtn> <myweblogicserver> <AdminServer> <[ACTIVE] ExecuteThread: '3' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <12f3f237012906ff:-a636d22:14cd70911a2:-8000-0000000000001ef0> <1429615677282> <BEA-000000> <acceptGssInitContextToken failed
com.bea.security.utils.kerberos.KerberosException: No valid credentials provided (Mechanism level: Failed to find any Kerberos Key)
Caused By: GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos Key)

По мимо всего того что предложенно на металинке типа посмотреть файлик /etc/hosts что там всё впоряде и т.д.
Необходимо убедится что username=userPrincipalName !
т.е важно создать правильно keytab:
ktpass -princ HTTP/srv_budwf@WCC.LOCAL -mapuser srv_budwf -kvno 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass lalal_1 -out c:\temp\budwf.keytab


+
Так же  401 unauthorized хотя всё сделали правильно в manageserver.log возможны следующие строки:
####<Jan 22, 2016 11:28:19 AM MSK> <Debug> <SecurityAtn> <budwf.moscow.sportmaster.ru> <budwf_2> <[ACTIVE] ExecuteThread: '26' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <0fb480c4-1579-4383-ba4a-d2a9cb44fe41-00000055> <1453451299311> <[severity-value: 128] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-000000> <com.bea.common.security.internal.service.JAASIdentityAssertionConfigurationServiceImpl.getAppConfigurationEntry(com.sun.security.jgss.krb5.accept)> 
####<Jan 22, 2016 11:28:19 AM MSK> <Debug> <SecurityAtn> <budwf.moscow.sportmaster.ru> <budwf_2> <[ACTIVE] ExecuteThread: '26' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <0fb480c4-1579-4383-ba4a-d2a9cb44fe41-00000055> <1453451299322> <[severity-value: 128] [rid: 0] [partition-id: 0] [partition-name: DOMAIN] > <BEA-000000> <Failed to create GSSContext for HTTP/budwf@WCC.LOCAL
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentails)
at sun.security.jgss.krb5.Krb5AcceptCredential.getInstance(Krb5AcceptCredential.java:87)
at sun.security.jgss.krb5.Krb5MechFactory.getCredentialElement(Krb5MechFactory.java:127)
at sun.security.jgss.GSSManagerImpl.getCredentialElement(GSSManagerImpl.java:193)
at sun.security.jgss.GSSCredentialImpl.add(GSSCredentialImpl.java:427)
at sun.security.jgss.GSSCredentialImpl.<init>(GSSCredentialImpl.java:62)
at sun.security.jgss.GSSManagerImpl.createCredential(GSSManagerImpl.java:154)
at com.bea.security.utils.kerberos.KerberosTokenUtils.getAcceptGSSContextForService(KerberosTokenUtils.java:293)
at com.bea.security.utils.kerberos.KerberosTokenHandler.handleInitTokenForMultiKDC(KerberosTokenHandler.java:236)
at com.bea.security.utils.kerberos.KerberosTokenHandler.access$100(KerberosTokenHandler.java:46)
at com.bea.security.utils.kerberos.KerberosTokenHandler$2.run(KerberosTokenHandler.java:215)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAsPrivileged(Subject.java:549)
at com.bea.security.utils.kerberos.KerberosTokenHandler.acceptGssInitContextToken(KerberosTokenHandler.java:213)
at com.bea.security.utils.kerberos.KerberosTokenHandler.acceptGssInitContextToken(KerberosTokenHandler.java:141)
at com.bea.common.security.internal.utils.negotiate.SPNEGONegotiateToken.getUsername(SPNEGONegotiateToken.java:57)
at weblogic.security.providers.authentication.NegotiateIdentityAsserterProviderImpl.assertChallengeIdentity(NegotiateIdentityAsserterProviderImpl.java:217)
at com.bea.common.security.internal.legacy.service.ChallengeIdentityAssertionProviderImpl$ChallengeIdentityAsserterV2Adapter.assertChallengeIdentity(ChallengeIdentityAssertionProviderImpl.java:124)


Короче данный пиздец присутствует исключительно в weblogic (FMW 12.2.1).
Есть подозрение что как то разъебали negotiate identity assertion provider.
Что делать не понять, хоть пиши кастомный...
Кажется найдено решение читаем коммент от batbear!

Решение 2 скажем так по проще:
Короче суть такова что долбанные индусы переписали свой гавно код и если в fmw 12.1.3 (weblogic) по поводу аналогичной ошибки я писал что "Необходимо убедится что username=userPrincipalName !"
То теперь всё помнялось блять!!
Теперь при генерации keytab
userPrincipalName=Hostname (на который вы генерите keytab) т.е. команда генерации keytab должна выглядеть следющим образом:
ktpass -princ HTTP/budwf@WCC.LOCAL -mapuser srv_budwf -kvno 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass lalal_1 -out c:\temp\budwf.keytab

Если хост к кторому все будут обращться например budwf.lalal.com то keytab надо генерить как:
ktpass -princ HTTP/budwf.lalal.com@WCC.LOCAL -mapuser srv_budwf -kvno 0 -crypto AES128-SHA1 -ptype KRB5_NT_PRINCIPAL -pass lalal_1 -out c:\temp\budwf.keytab

В этом случае всё будет работать на 12.2.1, и поидее развалится на 12.1.3
Такая вот хуйня!..

P.S для AES256 незабыть про Java Cryptography Extension (JCE) Unlimited Strength.
P.P.S В тестовой прикладухе ssotest можно получить ошибку 403 forbidden что скорее всего говорит о том что kerberos отработал и проблема уже в авторизации.

Небольшой бонус.
При аутентификации могут проблемы когда она тупо работет медленно. Вся херня в UDP. Подробнее почитать можно тут:
WNA slow Authentication. loss UDP packets

Комментарии

  1. Добрый день,

    Спасибо за статью,

    Для WMW 12.2.1 мы нашли ошибку:

    weblogic 12.2.1 jar file: com.oracle.weblogic.security.service.utils.providers.jar
    содержит класс: com.bea.security.utils.kerberos.KerberosTokenHandler.class

    с методом: handleInitTokenForMultiKDC, где есть код:
    KerberosException ex = new KerberosException("Failed to create GSSContext to accept token!");
    if (principals.contains(principalName)) {
    throw ex;
    }

    вместо строчки: if (principals.contains(principalName)) {
    нужно так: if (!principals.contains(principalName)) {

    Мы перекомпилировали этот класс и подложили скомпилированную версию в jar.
    После чего аутентификация заработала.

    Написать ошибку в oracle support не можем - на данный момент можем писать только customer cr.

    ОтветитьУдалить
  2. Добрый день.
    Спасибо за коммент, надеюсь кому поможет. Как только сам попробую обновлю пост)
    P.S однако глубоко вы залезли=)

    ОтветитьУдалить

Отправить комментарий