=====Kerberos für die Authentifizierung eines AD Users in der Oracle DB verwenden - Einsatz der DB Proxy User Architektur===== **Aufgaben:** Für eine Windows Domain User soll über Kerberos die Authentifizierung in der Oracle Datenbank ermöglicht werden. In der Datenbank wird dazu ein Oracle Schema(User) angelegt, dass über die Klausel "CREATE USER ad_user$ IDENTIFIED externally AS 'ad_user@PIPPERR.LOCAL' dann über Kerberos gegen über den AD autorisiert wird. Diese User erhalten wiederum das Recht sich als Proxy auf ein Produktives Schema anzumelden. Zu Proxy User siehe => [[dba:proxy_connect|Oracle User Proxy Connection verwenden]] **Ziel:** Damit wird erreicht das ein an der Domaine angemeldeter User sich per Single Sign on ein ein DB Schema anmelden kann. Im Prinzip ist das Thema gar nicht so kompliziert! ABER in der Dokumentation und in den ganzen Beispielen im Netz fehlt oft was genau im Detail was für ein Name für was verwendet werden soll und welcher Parameter am Ende der richtige für die aktuelle Client / Server Kombination ist. Daher muss mit etwas Zeit gerechnet bis es funktioniert, zumal das Debugging ausgesprochen schwierig ist! **Voraussetzung:** Diese Dokumentation funktioniert nur ab einer Oracle Datenbank 19.10 auf Linux oder Windows und einem Oracle Client ab der Version 12.2! ===Lizenz=== Aus der Lizenz Doku =>https://docs.oracle.com/en/database/oracle/oracle-database/19/dblic/Licensing-Information.html ..Note: Network encryption (native network encryption, network data integrity, and SSL/TLS) and strong authentication services (Kerberos, PKI, and RADIUS) are no longer part of Oracle Advanced Security and are available in all licensed editions of all supported releases of Oracle Database... Sehr gut, das heißt alle Edition können das verwenden! ---- === Umgebung === === Namensgebung - Was ist was === * Active Directory MS Server 2019 - Name der Domain **pipperr.local** * DB Server Linux 8 mit Oracle 19c - Name des DB Servers **apex01.pipperr.local** * DB Server Windows 2019 mit Oracle 19c - Name des DB Servers **windb01.pipperr.local** * AD User - Name des AD Users **dbuserapexdb** Aus diesen Namen ergibt sich der UserPrincipalName :** ..@>** wie z.B. "dbuserapexdb.apex01.pipperr.local@pipperr.local". ---- ==== Active Directory- AD User und keytab Datei anlegen ==== **AD Server 2019 ** === AD Service User === Im AD einen User als Service User für die Kerberos Keytab anlegen: New-ADUser ` -Name "dbuserapexdb" ` -UserPrincipalName "dbuserapexdb.apex01.pipperr.local@pipperr.local" ` -DisplayName "dbuserapexdb@pipperr.local" ` -Description "ServiceOracle Kerberos Service Principal APEX DB" ` -Path "CN=Managed Service Accounts,DC=pipperr,DC=local" ` -ChangePasswordAtLogon $false ` -PasswordNeverExpires $true ` -CannotChangePassword $true ` -Enabled $true ` -AccountPassword(Read-Host -AsSecureString "Password:") === KeyTab Datei erstellen === Eine Keytab Datei für den Datenbank Server auf dem AD Server exportieren: Das Kerberos " SPN - service principal name " ist wiederum **/DB_SERVER_NAME>.@>** wie "oracle/apex01.pipperr.local@pipperr.local" Als Administrative Shell starten: ktpass.exe -princ oracle/apex01.pipperr.local@pipperr.local ` -mapuser dbuserapexdb@pipperr.local ` -crypto all ` -pass xxxxxxxxxx ` -ptype KRB5_NT_PRINCIPAL ` -out ./apex01.pipperr.local.keytab Für mehr Hintergrund siehe => https://social.technet.microsoft.com/wiki/contents/articles/36470.active-directory-using-kerberos-keytabs-to-integrate-non-windows-systems.aspx === Persönlichen User für den Login im AD Anlegen === Mit diesem User wird dann später der DB Accounts angelegt und damit angemeldet! New-ADUser ` -Name "gunther" ` -UserPrincipalName "dbuserapexdb.apex01.pipperr.local@pipperr.local" ` -DisplayName "gunther@pipperr.local" ` -Description "Gunther Testuser" ` -Path "CN=Managed Service Accounts,DC=pipperr,DC=local" ` -ChangePasswordAtLogon $false ` -PasswordNeverExpires $true ` -CannotChangePassword $true ` -Enabled $true ` -AccountPassword(Read-Host -AsSecureString "Password:") ---- ==== Oracle DB konfigurieren ==== ===SQL Net=== ==krb5.conf == Unter $TNS_ADMIN des DB Servers ein Verzeichnis "kerberos" anlegen. Im Verzeichnis "kerberos" die Datei krb5.conf anlegen. krb5.conf [libdefaults] default_realm = PIPPERR.LOCAL clockskew = 6000 passwd_check_s_address = false noaddresses = true forwardable = yes [realms] PIPPERR.LOCAL = { kdc = 10.10.10.200:88 } [domain_realm] .pipperr.de= PIPPERR.LOCAL pipperr.de = PIPPERR.LOCAL Auf die Groß/KleinSchreibung achten! Domain Name in GROSSBUCHSTABEN! ==keytab== Die Keytab Datei vom AD "apex01.pipperr.local.keytab" in das Verzeichnis kopieren und in "keytab" umbennen. ==sqlnet.ora== Die SQLnet.ora anpassen sqlnet.ora: ############################################ # SQLNET.AUTHENTICATION_SERVICES= (BEQ,KERBEROS5) ######################################### # # Kerberos # #Following parameter is server-side only SQLNET.KERBEROS5_KEYTAB=/opt/oracle/product/19c/dbhome_1/network/admin/kerberos/keytab # SQLNET.KERBEROS5_CONF=/opt/oracle/product/19c/dbhome_1/network/admin/kerberos/krb5.conf SQLNET.KERBEROS5_CONF_MIT=TRUE SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle SQLNET.FALLBACK_AUTHENTICATION=TRUE SQLNET.KERBEROS5_CLOCKSKEW=6000 Listener der DB nach jeder Änderung neu starten! Für eine DB unter MS Windows die folgenden Settings verwenden: SQLNET.AUTHENTICATION_SERVICES = (NTS,KERBEROS5) SQLNET.NO_NTLM=FALSE SQLNET.KERBEROS5_KEYTAB=F:\oracle\product\19.3.0.0\dbhome_1\network\admin\kerberos\keytab SQLNET.KERBEROS5_CONF=F:\oracle\product\19.3.0.0\dbhome_1\network\admin\kerberos\krb5.conf SQLNET.KERBEROS5_CONF_MIT=TRUE SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle SQLNET.FALLBACK_AUTHENTICATION=TRUE SQLNET.KERBEROS5_CLOCKSKEW=6000 SQLNET.KERBEROS5_CC_NAME=MSLSA: === DB Parameter === **os_authent_prefix auf leer stellen!** select value from v$parameter where name = 'os_authent_prefix'; VALUE -------------- OPS$ alter system set os_authent_prefix='' scope=both sid='*'; **remote_os_authent auf false!** select value from v$parameter where name = 'remote_os_authent'; VALUE --------------- FALSE alter system set remote_os_authent='FALSE' scope=both sid='*'; ---- ==== Oracle DB User anlegen ==== User anlegen mit: create user kerbSchma identified externally as 'dbuserapexdb@PIPPERR.LOCAL'; grant create session to kerbSchma; grant connect to kerbSchema; -- External Information abfragen: select username, EXTERNAL_NAME from dba_users where EXTERNAL_NAME is not null; User benötigt direkt das "create session" Recht, nur die Connect Rolle ist nicht ausreichend! Wichtig, mit IDENTIFIED EXTERNALLY wird noch die Pre-CMU (Centrally Managed Users - CMU) Kerberos Funktionalität verwendet! Um das CMU Feature zu verwenden wird der User mit "IDENTIFIED GLOBALLY AS ‘distinguished_name’" angelegt! Allerdings muss dazu die DB so eingerichtet werden, das eine Abfrage des ADs möglich ist! Siehe dazu => [[dba:user_oracle_ad_integration|Oracle 19c - Centrally Managed Users - CMU - Autorisierung von DB Schemas/Usern in das Active Directory integrieren]] ---- ==== Linux - AD User an seinem zugehörigen Schema an der DB anmelden ==== ==Ticket erstellen== Zuerst muss ein Kerberos Ticket mit okinit angefordert werden: okinit gunther Kerberos Utilities for Linux: Version 19.0.0.0.0 - Production on 13-OCT-2021 17:47:50 Copyright (c) 1996, 2019 Oracle. All rights reserved. Configuration file : /opt/oracle/product/19c/dbhome_1/network/admin/kerberos/krb5.conf. Password for gunther@PIPPERR.LOCAL: Ticket anzeigen mit: oklist Kerberos Utilities for Linux: Version 19.0.0.0.0 - Production on 13-OCT-2021 19:23:27 Copyright (c) 1996, 2019 Oracle. All rights reserved. Configuration file : /opt/oracle/product/19c/dbhome_1/network/admin/kerberos/krb5.conf. Ticket cache: FILE:/tmp/krb5cc_54321 Default principal: gunther@PIPPERR.LOCAL Valid starting Expires Service principal 10/13/21 17:47:58 10/14/21 03:47:58 krbtgt/PIPPERR.LOCAL@PIPPERR.LOCAL renew until 10/14/21 17:47:50 10/13/21 17:48:00 10/14/21 03:47:58 oracle/apex01.pipperr.local@PIPPERR.LOCAL renew until 10/14/21 17:47:50 ==sqlnet.ora Client Umgebung == **krb5.conf** Datei krb5.conf aus der Server Konfiguration unter $TNS_ADMIN/kerberos/krb5.conf ablegen! **sqlnet.ora** sqlnet.ora: SQLNET.AUTHENTICATION_SERVICES= (KERBEROS5) NAMES.DIRECTORY_PATH= (TNSNAMES) SQLNET.KERBEROS5_CONF=/opt/oracle/product/19c/client1/network/admin/kerberos/krb5.conf SQLNET.KERBEROS5_CONF_MIT=TRUE SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle SQLNET.FALLBACK_AUTHENTICATION=TRUE SQLNET.KERBEROS5_CLOCKSKEW=6000 SQLNET.KERBEROS5_CC_NAME=/tmp/krb.cc ############################################ # Trace # bei Fehlern aktivieren #TRACE_LEVEL_CLIENT = SUPPORT #TRACE_UNIQUE_CLIENT = on #TRACE_DIRECTORY_CLIENT = c:\temp\sqlplus_trace #DIAG_ADR_ENABLED = OFF ==An der DB anmelden == Anmelden über SQL*Net mit sqlplus **/@**. Wie: sqlplus /@ORAGPI Abfragen wie der User autorisiert ist: select sys_context('userenv','authentication_method') from dual; SYS_CONTEXT('USERENV','AUTHENTICATION_METHOD') -------------------------------------------------- KERBEROS ---- ====Windows - AD User an seinem zugehörigen Schema an der DB anmelden ==== Mit Clients unter 12.2 auf Fehler gelaufen! auf den Wert von KERBEROS5_CC_NAME achten! Die möglichen Wert von SQLNET.KERBEROS5_CC_NAME: |C:\Temp\krb.cc| Kerberos Ticket wird über okinit manuell angelegt| |MSLSA:| Ticket Store in der aktuellen Session des Users verwenden| |OSMSFT: / / | Veraltet, in Verwendung vor 12.2 - gleiche Bedeutung wie MSLSA:| === Windows System ist Teil der Domain, User ist über die Domain angemeldet === **krb5.conf** Datei krb5.conf aus der Server Konfiguration unter %TNS_ADMIN%/kerberos/krb5.conf ablegen! **sqlnet.ora** sqlnet.ora: SQLNET.AUTHENTICATION_SERVICES= (KERBEROS5) SQLNET.KERBEROS5_CONF=C:\oracle\TNS_ADMIN\kerberos\krb5.conf SQLNET.KERBEROS5_CONF_MIT=TRUE SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle SQLNET.FALLBACK_AUTHENTICATION=TRUE SQLNET.KERBEROS5_CLOCKSKEW=6000 SQLNET.KERBEROS5_CC_NAME=MSLSA: der Parameter SQLNET.KERBEROS5_CC_NAME=OSMSFT: / / ist für Clients ab 12.2 veraltet! === User ist NICHT über die Domain angemeldet === **Ticket holen:** PS C:\oracle\TNS_ADMIN\kerberos> okinit dbuserapexdb Kerberos Utilities for 64-bit Windows: Version 19.0.0.0.0 - Production on 13-OCT-2021 19:19:54 Copyright (c) 1996, 2019 Oracle. All rights reserved. Configuration file : C:\oracle\TNS_ADMIN\kerberos\krb5.conf. Password for dbuserapexdb@PIPPERR.LOCAL: **Ticket anzeigen lassen:** PS C:\oracle\TNS_ADMIN\kerberos> oklist -f Kerberos Utilities for 64-bit Windows: Version 19.0.0.0.0 - Production on 13-OCT-2021 19:20:08 Copyright (c) 1996, 2019 Oracle. All rights reserved. Configuration file : C:\oracle\TNS_ADMIN\kerberos\krb5.conf. Ticket cache: FILE:C:\Temp\krb.cc Default principal: dbuserapexdb@PIPPERR.LOCAL Valid starting Expires Service principal 10/13/21 19:20:01 10/14/21 05:20:01 krbtgt/PIPPERR.LOCAL@PIPPERR.LOCAL renew until 10/14/21 19:19:54, Flags: RIA ==An der DB anmelden == Anmelden über SQL*Net mit sqlplus **/@**. Wie: sqlplus /@GPIDB ---- ====Probleme bei Login lösen des Client lösen==== siehe "Kerberos Troubleshooting Guide (Doc ID 185897.1)" **ORA-01017: invalid username/password; logon denied** Falls SQLNET.AUTHENTICATION_SERVICES = (NTS,KERBEROS5) in sqlnet.ora gesetzt, NTS entfernen und weiter testen In meine Fall wurde der eigentliche Fehler "ORA-12641: Authentication service failed to initialize" überdeckt! Auf die richtige Schreibweise für Kerberos **SQLNET.AUTHENTICATION_SERVICES= (KERBEROS5)** achten! **ORA-12641: Authentication service failed to initialize** Kerberos Connections using the Microsoft Native Cache "OSMSFT:" Fail with ORA-12641 (Doc ID 1599927.1), falls Server Fehler unter MS Windows keinen Dateinamen auf dem Server angeben (Parameter KERBEROS5_CC_NAME) **ORA-12631: Username retrieval failed** Dieser Fehler kann viele Ursachen haben wie z.B. in der kerb5.conf ein fehlerhaftes Domain Mapping in der "[domain_realm]" Section. Auch kann die Siehe dazu auch "non-forwardable” service tickets" => https://www.spotonoracle.com/?p=451 **Support** siehe => Kerberos Troubleshooting Guide (Doc ID 185897.1) Oder ab 19.x (8??) mit dem SQL*Net Parameter ""SQLNET.NO_NTLM=FALSE" erneut testen! ---- ==== DB Proxy User zum anmelden an einem anderen Schema ===== An einem anderen DB User per Proxy anmelden Zu Proxy User siehe => [[dba:proxy_connect|Oracle User Proxy Connection verwenden]] ===Proxy Rechte definieren=== sqlplus / as sysdba alter user GPI grant connect through KERBSCHMA; ===Anmelden mit Proxy=== sqlplus [GPI]/@GPIDB ---- ==== Im Oracle SQL*Developer anmelden ==== ! Auf OCI Treiber umstellen um External Authentifizierung verwenden ! Es kann auch direkt mit der OCI Thick Driver Lib gearbeitet werden. Das ist auch Voraussetzung für die Verwendung von Kerberos bzw. OS Authentifizierung im SQL Developer! Ablauf: * Instantclient Packet Basis + JDBC herunterladen von https://www.oracle.com/database/technologies/instant-client/winx64-64-downloads.html * Bei Bedarf gleich auch die Tools wie SQL*Plus und Loader mit hinzunehmen * Zips alle in ein Verzeichnis wie "H:\tools\instantclient_19_9" auspacken * Bei Bedarf unter dem Ordner für die tnsnames.ora einen Ordner .\network\admin anlegen * tnsnames.ora / sqlnet.ora dort ablegen * TNS_ADMIN Umgebungsvariable auf diesen Ordner zeigen lassen * Betriebssystem Pfad Variable so anpassen, dass der Instantclient Pfad H:\tools\instantclient_19_9 an erster Stelle steht * SQLDeveloper starten * Zu Not über ein Skript; damit der Pfad auch immer richtig gesetzt wird set PATH=H:\tools\instantclient_19_9 H:\tools\sqldeveloper\sqldeveloper.exe * Unter Einstellungen nach OCI suchen und dort den Speicherort des Instantclient hinterlegen und testen. * {{ :prod:oracle_sqldeveloper_oci_thin_client_setting.png | Oracle SQL Developer OCI Client Settings}} Zum Instant Client siehe auch auch => [[dba:oracle_sqlldr_instant_client12c|Oracle SQL*LDR - Auf dem Clientarbeitsplatz Windows 10 mit dem Instant Client 19 verwenden]] === Problem mit External / OS Authentifizierung im SQL Developer === Wichtig! Keine Usernamen und kein Passwort angeben! {{ :prod:oracle_sqldeveloper_connect_external_os_authentifizierung.png |Oracle SQL Developer Connect External / OS }} Wird der Pfad zur OCI Lib nicht gefunden kommt es nur zur Trivialen Fehlermeldung "Status: Nicht erfolgreich -Test nicht erfolgreich: ORA-01017: invalid username/password; logon denied" ohne weitere Hinweise.. Dann in Einstellungen ( siehe Screenshot) testen ob die OCI Lib geladen werden kann! ---- ==== Im Toad anmelden ==== Schlüsselwort "EXTERNAL" als Username angeben und Passwort leer lassen! ---- ==== Quellen ==== Oracle Doku: * https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/configuring-kerberos-authentication.html#GUID-17ED0290-B25B-4BA0-8DF2-0592973D0791 Web: * https://wiki.loopback.org/display/KB/Oracle+Database+12c+Kerberos+Configuration * https://blogs.oracle.com/database/post/make-someone-else-do-the-work-managing-oracle-database-19c-users-in-active-directory-part-1-kerberos * https://www.spotonoracle.com/?p=451 * http://oracledbtales.blogspot.com/2016/03/active-directory-authentication-with.html * https://gavinsoorma.com.au/knowledge-base/oracle-19c-database-and-windows-ad-integration/ * https://blog.pythian.com/part-4-implementing-oracle-database-single-sign-on-using-kerberos-active-directory-and-oracle-cmu/ Allgemein: * https://www.datasunrise.com/blog/professional-info/configuring-kerberos-authentication-protocol/ * Kerberos Fehlercodes => https://onlinelibrary.wiley.com/doi/pdf/10.1002/9781119390909.app2 * https://books.google.de/books?id=nEJRDwAAQBAJ&pg=PT426&lpg=PT426&dq=Obtain+AP_REQ+failed+with+error&source=bl&ots=Yy2xYllF3E&sig=ACfU3U3aChHgEA1vLM7dMBWzY6lAyCUXKg&hl=en&sa=X&ved=2ahUKEwiUrMf-v4v0AhVPLBoKHYrlBb0Q6AF6BAgSEAM#v=onepage&q=Obtain%20AP_REQ%20failed%20with%20error&f=false Sicherheit: * https://www.optiv.com/insights/source-zero/blog/kerberos-domains-achilles-heel