Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:user_oracle_ad_kerberos_integration

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 ⇒ 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 : <AD USER>.<DB_SERVER_NAME>.<DB_SERVER_DOMAIN>@><AD DOMAIN NAME> 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 <KERBEROS Methodenname>/DB_SERVER_NAME>.<DB_SERVER_DOMAIN>@><AD DOMAIN 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 ⇒ 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 /@<TNS_ALIAS>.

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 /@<TNS_ALIAS>.

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)


DB Proxy User zum anmelden an einem anderen Schema

An einem anderen DB User per Proxy anmelden

Zu Proxy User siehe ⇒ 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:

    • 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.
  •  Oracle SQL Developer OCI Client Settings

Zum Instant Client siehe auch auch ⇒ 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!

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

Cookies helfen bei der Bereitstellung von Inhalten. Diese Website verwendet Cookies. Mit der Nutzung der Website erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Computer gespeichert werden. Außerdem bestätigen Sie, dass Sie unsere Datenschutzerklärung gelesen und verstanden haben. Wenn Sie nicht einverstanden sind, verlassen Sie die Website. Weitere Information
"Autor: Gunther Pipperr"
dba/user_oracle_ad_kerberos_integration.txt · Zuletzt geändert: 2021/11/29 11:21 von gpipperr