Benutzer-Werkzeuge

Webseiten-Werkzeuge


dba:user_oracle_ad_kerberos_integration

Kerberos für die Authentifizierung eines AD Users in der Oracle DB verwenden - inkl. 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!

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 'gunther@PIPPERR.LOCAL';
 
GRANT CREATE SESSION TO kerbSchma;

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
der Parameter SQLNET.KERBEROS5_CC_NAME=OSMSFT: / / ist für Clients ab 12.2 veraltet!
An der DB anmelden

Anmelden über SQL*Net mit sqlplus /@<TNS_ALIAS>.

Wie:

sqlplus /@GPIDB

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:

User ist NICHT über die Domain angemeldet

Ticket holen und anzeigen lassen:

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:
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!

ORA-12641: Authentication service failed to initialize

Kerberos Connections using the Microsoft Native Cache „OSMSFT:“ Fail with ORA-12641 (Doc ID 1599927.1)

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.


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

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/10/15 21:51 von gpipperr