Oracle Active Directory Anbindung (mit Kerberos und CMU)

//about

Ziel dieser Konfiguration ist es, die Benutzerverwaltung für den Zugriff auf Oracle Datenbanken in das Active Directory auszulagern. So können sich im zentralen Verzeichnis (AD) vorhandene Benutzer und Benutzerinnen im Single-Sign-On an für sie freigegebenen Datenbanken anmelden, ohne ein separates Passwort zu verwenden. Der Verwaltungsaufwand für die Datenbankadministration wird verringert und die Benutzerverwaltung wird von jemandem übernommen, der dafür zuständig ist.

Architektur

Seit der Oracle Datenbank Version 19 ist es möglich, das Active Directory (AD) Benutzerverzeichnis direkt für die Berechtigung (Authentification) der Konten in der Datenbank zu verwenden. In der Vergangenheit war dies nur mittels eines zwischengeschalteten LDAP-Servers, Oracle Internet Directory (OID) oder Oracle Unified Directory (OUD) möglich. Hierfür wird eine SSL-LDAP-Anbindung zwischen Datenbank und AD eingerichtet und ein Zugriffskonto für die Datenbank im AD erstellt. 

Die Zugriffskontrolle (Authorization) als Single Sign On kann generell mittels einer Ablage des Oracle Passwort Hashes in einem speziellen Attribut im AD oder per Kerberos erfolgen. Wir werden Kerberos verwenden, um die Definition eines zusätzlichen Attributes und die Installation einer zusätzlichen Komponente, die den Oracle Hash des Passwortes erstellt, zu vermeiden.

Für die Rechte- und Rollen-Verwaltung (Authorization) können einzelne User in Oracle, Shared Schemas oder Globale Rollen verwendet werden. In der ersten Umsetzungsphase, die in einem Proof Of Concept demonstriert wird, wird mit Shared Schemas gearbeitet: Ein AD-Benutzer, der einer bestimmten Rolle im AD zugewiesen ist, kann sich in den angeschlossenen Datenbanken als ein bestimmter, dieser AD-Rolle zugewiesener User anmeldet.

Technisch kommen in dieser Konfiguration die Methoden Kerberos und CMU (Centrally Managed Users) zum Einsatz. Zunächst muss die Datenbank als Kerberos-Client-Computer konfiguriert werden, damit sie Kerberos Service Tickets der AD-Benutzer verifizieren kann. Danach wird die Datenbank so konfiguriert, das sie eine SSL-LDAP-Verbindung zum AD-Server aufbauen kann, um die Gruppen- und Rechte-Konfiguration vor dort zu erfragen.

Technische Umsetzung

Vorbereitungen des AD-Servers

Installation des Oracle-Zugriffs-Benutzers im Active Directory

  1. Log in to a Windows domain controller of Microsoft Active Directory as an administrator who has administrative privileges to create a user account and grant permissions to the user account.
  2. Create the Oracle service directory user account as an Active Directory user.
  3. Grant the Oracle service directory user account in the Active Directory the following permissions on the properties of the Active Directory users who need to access Oracle databases:
    • Read properties (of Active Directory users who will log in to an Oracle database)
    • Write lockoutTime (property of Active Directory users who will use password authentication to log in to an Oracle database)
    • Control Access (of the orclCommonAttribute property of the Active Directory users who will use password authentication to log in to an Oracle database)

(Quelle: Oracle Security Guide – Managing Kerberos Authentication)

Der Zugriffsbenutzer wurde hier mOracleLDAP genannt.

TODO Vielleicht können hier noch Screenshots aus dem AD eingefügt werden?

Erstellen des Service Principal

Im folgenden werden beispielhaft folgende Hostnamen und Konfigurationsausprägungen aus dem Proof of Concept verwendet:

ParameterWert QS
Hostname (DB Server)orcl1.int.loopback.org
AD-DomäneLOOPBACK.ORG
DB CDBorcl1
DB PDBlooptest
AD-Serverad1.int.loopback.org

Diese müssen in andeen Umgebungen angepasst werden

kadmin.local:oracle/orcl1.int.loopback.org@LOOPBACK.ORG

Extraktion der Service Key Tabelle

Im späteren Verlauf wird eine sogenannte Keytab-Datei vom AD-Server benötigt.
Diese sollte sich (auf dem AD Server) wie folgt erzeugen lassen:

ktpass.exe -princ oracle/kadmin.local:oracle/orcl1.int.loopback.org@KERBEROS_DOMAIN -mapuser mOracleLDAP -pass tiger -out orcl1.keytab -ptype KRB5_NT_PRINCIPAL

Wobei KERBEROS_DOMAIN die QS-Kerberos-Domain und “tiger” das im vorherigen Schritt vergebene Passwort des AD-Users mOracleLDAP ist.
 
Kontrolle der entstandenen Datei:

oklist -k -t orcl1.keytab

Die entstandene Datei muss für den Datenbank-Server bereitgestellt werden.

Bereitstellen des SSL-Zertifikat des AD-Servers

Das Server-Zertifikat des AD-Servers muss bereitgestellt werden, um später in das Datenbank-Wallet aufgenommen werden zu können. 

Die Schritte aus diesem Kapitel (Vorbereitung AD Server) können vor einer Installation beauftragt werden. 

Konfiguration der Datenbank

Kerberos

SQLNet

Folgende Einträge müssen in der sqlnet.ora jeweils in der PDB im Verzeichnis $TNS_ADMIN angepasst oder hinzugefügt werden:

# Allgemeine SQLNet Konfiguration
NAMES.DIRECTORY_PATH= (TNSNAMES, HOSTNAME)
 
# Loopback.ORG Kerberos Konfiguration
SQLNET.AUTHENTICATION_SERVICES=(BEQ,KERBEROS5)
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle
SQLNET.KERBEROS5_CC_NAME=/tmp/krb5cc_userid
SQLNET.KERBEROS5_CLOCKSKEW=1200
SQLNET.KERBEROS5_CONF=/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/krb5.conf
SQLNET.KERBEROS5_KEYTAB=/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/orcl1.keytab
SQLNET.KERBEROS5_REALMS=SQLNET.KERBEROS5_KEYTAB=/u01/app/oracle/product/19.0.0.0/dbhome_1/network/admin/krb.realms
SQLNET.KERBEROS5_CONF_MIT=TRUE

Optional können folgende Konfigurationen für das Debugging aufgenommen werden:

#Loopback.ORG Trace File Konfiguration (Debugging)
#trace_level_server=32
#trace_file_server = svr_trc
#trace_directory_client=$ORACLE_HOME/network/trace
#trace_level_client = support
#trace_fileno_client=6
#trace_filelen_client=51200
#trace_unique_client=on
#trace_timestamp_client=on
#log_directory_client=$ORACLE_HOME/network/trace
#diag_adr_enabled=off
#trace_directory_okinit=/tmp
#trace_file_okinit=okinit
#trace_level_okinit = SUPPORT

Kerberos Client Konfiguration des Datenbank-Servers

Datei krb.conf (in $TNS_ADMIN)
LOOPBACK.ORG
LOOPBACK.ORG
loopback.org admin server
Datei krb5.conf
# Loopback.ORG Kerberos Konfiguration für AD
[libdefaults]
default_realm=LOOPBACK:ORG
[realms]
LOOPBACK.ORG = { kdc=ad1.loopback.org:88 }
[domain_realm]
.loopback.org = LOOPBACK.ORG
Datei krb5.realms
loopback.org LOOPBACK.ORG

Datenbank-Parameter

alter system set os_authent_prefix='' sid='*' scope spfile
alter system set remote_os_authent='FALSE' scope=spfile sid='*';

Nach den Änderungen an den Parametern muss die CDB neu gestartet werden.

Datenbank-Benutzer

An dieser Stelle legen wir den AD-Zugriffsbenutzer in der Datenbank an, um eine Referenz und Testmöglichkeit für Kerberos selbst zu erhalten:

CREATE USER mOracleLDAP IDENTIFIED EXTERNALLY AS 'mOracleLDAP@loopback.org';
GRANT CREATE SESSION TO mOracleLDAP;

Test

Die Anmeldung per Kerberos sollte sich nun auf der Datenbank (in der PDB) testen lassen:

oracle@orcl1> sqlplus /@KTEST
SQL*Plus: Release 19.0.0.0.0 - Production on Fri May 20 14:29:18 2022
Version 19.13.0.0.0
Copyright (c) 1982, 2021, Oracle.  All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.13.0.0.0
 
SQL> show user;
USER is "mOracleLDAP@LOOPBACK.ORG"
SQL>

CMU

Nachdem Kerberos funktioniert, kann die Datenbank nun für Centrally Managed Users (CMU) eingerichtet werden.
Dazu werden weitere Konfigurationen im Verzeichnis $TNS_ADMIN eingerichtet.

Dsi.ora

Die Datei Directory Service Information (dsi.ora) wird an Stelle der früher verwendeten ldap.ora eingesetzt, um Informationen zum AD-Server anzugeben.
Wir legen diese Datei in $TNS_ADMIN ab.

DSI_DIRECTORY_SERVERS = (loopback.org:389:636)
DSI_DEFAULT_ADMIN_CONTEXT = "dc=loopback,dc=org"
DSI_DIRECTORY_SERVER_TYPE = AD

Wallet

Ein Wallet wird benötigt, um die Anmeldeinformationen am AD-Server und das SSL-Zertifikat abzulegen.
Das Wallet soll nicht im $TNS_ADMIN-Verzeichnis abgelegt werden, sondern in: $ORACLE_BASE/admin/db_unique_name/pdb_guid/wallet/.
Die GUID kann in der CDB erfragt werden mit:

SQL> select pdb_name, guid from dba_pdbs;
Wallet anlegen
oracle@orcl1: /home/oracle/Loopback.ORG>orapki wallet create -wallet /u01/app/oracle/admin/ORCL1/DB5D6B892EDC9307E0536362B60A042E/wallet -auto_login

Das Wallet wird mit einem Passwort versehen, wie verwenden hier im Test die GUID der Datenbank.

Wallet füllen

Im Wallet werden zunächst drei Einträge angelegt für: 
1.     AD-Benutzer, der sich am AD anmelden kann
2.     LDAP-DN des Benutzers
3.     Passwort des Benutzers

oracle@orcl1: /home/oracle/Loopback.ORG>mkstore -wrl /u01/app/oracle/admin/ORCL1/DB5D6B892EDC9307E0536362B60A042E/wallet -createEntry ORACLE.SECURITY.USERNAME mOracleLDAP
Oracle Secret Store Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Enter wallet password:

oracle@orcl1: /home/oracle/Loopback.ORG>mkstore -wrl /u01/app/oracle/admin/ORCL1/DB5D6B892EDC9307E0536362B60A042E/wallet -createEntry ORACLE.SECURITY.DN CN=mOracleLDAP,DC=loopback,DC=org
Oracle Secret Store Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Enter wallet password:

oracle@orcl1: /home/oracle/Loopback.ORG>mkstore -wrl /u01/app/oracle/admin/ORCL1/DB5D6B892EDC9307E0536362B60A042E/wallet -createEntry ORACLE.SECURITY.PASSWORD
Oracle Secret Store Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Your secret/Password is missing in the command line
Enter your secret/Password:
Re-enter your secret/Password:
Enter wallet password:

Nun wird das SSL-Zertifikat des AD-Servers hinzugefügt:

oracle(ORCL1-LOOPTEST)@orcl1: /home/oracle/Loopback.ORG>orapki wallet add -wallet /u01/app/oracle/admin/ORCL1/DB5D6B892EDC9307E0536362B60A042E/wallet -cert /home/oracle/Loopback.ORG/loopca.pem -trusted_cert
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Cannot modify auto-login (sso) wallet
Enter wallet password:
Operation is successfully completed.

Auflisten des Wallet-Inhalts:

oracle(ORCL1-LOOPTEST)@orcl1: /home/oracle/Loopback.ORG>orapki wallet display -wallet /u01/app/oracle/admin/D3V4T_RZ1/DB5D6B892EDC9307E0536362B60A042E/wallet
Oracle PKI Tool Release 23.0.0.0.0 - Production
Version 23.0.0.0.0
Copyright (c) 2004, 2021, Oracle and/or its affiliates. All rights reserved.
Requested Certificates:
User Certificates:
Oracle Secret Store entries:
ORACLE.SECURITY.DN
ORACLE.SECURITY.PASSWORD
ORACLE.SECURITY.USERNAME
Trusted Certificates:
Subject:        CN=LoopCA,DC=loopback,DC=org

Parameter-Änderungen der PDB

Folgende Datenbank-Parameter müssen in der PDB gesetzt und diese dann durchgestartet werden: 

SQL> alter system set LDAP_DIRECTORY_ACCESS = 'PASSWORD' scope=spfile;
SQL> alter system set LDAP_DIRECTORY_SYSAUTH = YES SCOPE=SPFILE;
 
SQL> alter pluggable database LOOPTEST close immediate;
SQL> alter pluggable database LOOPTEST open; 
 
SQL> show parameter ldap
NAME                                 TYPE        VALUE
------------------------------------ ----------- --------------------
ldap_directory_access                string      PASSWORD
ldap_directory_sysauth               string      YES

Konfiguration des Oracle-Clients

Konfiguration eines Windows Clients für den Kerberos Zugriff. Kerberos wird von Active Directory selbst verwendet und ist bereits konfiguriert. Wenn sich der PC in der gleichen AD Domäne wie die Datenbank befindet und Das Windows korrekt in die Domäne konfiguriert ist erhält ein angemeldeter Domänen-Benutzer automatisch ein Kerberos-Ticket.

Krb5.conf

Diese Datei im $TNS_ADMIN-Verzeichnis des Oracle Clients ist inhaltlich identisch zu der im Datenbank-Server:

[libdefaults]
default_realm = LOOPBACK.ORG
[realms]
LOOPBACK.ORG = {
        kdc = ad1.int.loopback.org
}
[domain_realm]
.loopback.org = LOOPBACK.ORG
loopback.org = LOOPBACK.ORG

SQLNet

NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT) 
# Kerberos Loopback.ORG Configuration
SQLNET.AUTHENTICATION_SERVICES=(BEQ,TCPS,KERBEROS5PRE,KERBEROS5)
SQLNET.KERBEROS5_CONF=C:\app\client\product\19.0.0\client_1\network\admin\krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.KERBEROS5_CC_NAME=OSMSFT://

Test

C:\Users\S953249>klist
Current LogonId is 0:0x30236511
Cached Tickets: (2)
#0> Client: S953249 @ LOOPBACK.ORG
Server: krbtgt/LOOPBACK.ORG @ LOOPBACK.ORG
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40e10000 -> forwardable renewable initial pre_authent name_canonicalize
Start Time: 5/6/2022 13:26:42 (local)
End Time: 5/6/2022 23:26:42 (local)
Renew Time: 5/13/2022 13:26:42 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x41 -> PRIMARY FAST
Kdc Called: V-QS-DC08
#1> Client: S953249 @ LOOPBACK.ORG
Server: host/v-qs-app.loopback.org @ LOOPBACK.ORG
KerbTicket Encryption Type: AES-256-CTS-HMAC-SHA1-96
Ticket Flags 0x40a10000 -> forwardable renewable pre_authent name_canonicalize
Start Time: 5/6/2022 13:26:42 (local)
End Time: 5/6/2022 23:26:42 (local)
Renew Time: 5/13/2022 13:26:42 (local)
Session Key Type: AES-256-CTS-HMAC-SHA1-96
Cache Flags: 0x40 -> FAST
Kdc Called: V-QS-DC08.loopback.org
 
C:\Users\S953249>oklist
Kerberos Utilities for 64-bit Windows: Version 19.0.0.0.0 - Production on 04-MAY-2022 14:38:05
Copyright (c) 1996, 2019 Oracle. All rights reserved.
 
Configuration file : C:\app\client\S225783\product\19.0.0\client_1\network\admin\kerberos\krb5.conf.
Ticket cache: MSLSA:
Default principal: S953249@LOOPBACK.ORG
 
Valid starting Expires Service principal
05/04/22 14:34:46 05/04/22 23:58:57 LDAP/V-QS-DC08.loopback.org/loopback.org@LOOPBACK.ORG
renew until 05/11/22 13:58:57
05/04/22 13:58:57 05/04/22 23:58:57 host/v-qs-app012.loopback.org@LOOPBACK.ORG
renew until 05/11/22 13:58:57

(Für diesen Test wurde der Benutzer S953249@LOOPBACK.ORG als „identified externally” in der Datenbank angelegt)

Fachliche Umsetzung

Für die weitere Konfiguration wird im AD Verzeichnis eine Gruppe angelegt oder verwendet, welche Benutzer und Benutzerinnen für einen bestimmten Anwendungsfall zusammenfasst. Hier wurde hier die Gruppe „LA-ORACLE-ADMIN” verwendet, um Oracle-Datenbank-Administratoren zu bestimmen.
 
Mitglieder dieser Gruppe sollen im PoC in einem Sammel-Konto SHARED_ADMIN mit DBA-Rechten angemeldet werden.

Hier lassen sich sich für den realen Einsatz selbstverständlich andere Konzepte umsetzen.

Konfiguration der Benutzerverwaltung

AD-Gruppe überprüfen

C:\Users\S953249>dsquery group -name LA-ORACLE-ADMIN
"CN=LA-ORACLE-ADMIN,OU=Oracle,DC=loopback,DC=org"

Shared Schema in der Datenbank anlegen

SQL> create user SHARED_ADMIN identified globally as 'CN=LA-ORACLE-ADMIN,OU=Oracle,OU=Gruppen,DC=loopback,DC=org';
User created.
SQL> grant connect, create session to shared_admin;
Grant succeeded.
SQL> grant dba to shared_admin;
Grant succeeded.

Test und Anmeldung

C:\Users\S953249>oklist
Kerberos Utilities for 64-bit Windows: Version 19.0.0.0.0 - Production on 21-MAY-2022 13:25:46
Copyright (c) 1996, 2019 Oracle.  All rights reserved.
Configuration file : C:\app\client\S225783\product\19.0.0\client_1\network\admin\krb5.conf.
Ticket cache: MSLSA:
Default principal: S953249@LOOPBACK.ORG
Valid starting     Expires            Service principal
05/21/22 13:19:09  05/21/22 23:06:41  ldap/V-QS-DC08.loopback.org@LOOPBACK.ORG
        renew until 05/22/22 13:06:36
05/21/22 13:06:47  05/21/22 23:06:41  oracle/orcl1.loopback.org@LOOPBACK.ORG
        renew until 05/22/22 13:06:36

Weitere Hinweise

Fehlersuche

Anmeldefehler (Kerberos)

Invalid Username

ERROR:
ORA-01017: invalid username/password; logon denied

Kerberos funktioniert nicht.

Ist ein TGT (Ticket Granting Ticket) vorhanden? oklist -f?

Credential Retrieval Failed

2022-05-20T14:39:52.449904+02:00
Errors in file /u01/app/oracle/diag/rdbms/d3v4t_rz1/D3V4T1/trace/D3V4T1_ora_100390.trc:
ORA-00609: could not attach to incoming connection
ORA-12638: Credential retrieval failed

Hier hat regelmäßig geholfen:

  1. okinit (evtl auch vorher okdestry)
  2. Auf dem Windows PC ggf. neu anmelden
  3. CDB (nicht PDB) durchstarten

ORA-00609: could not attach to incoming connection
ORA-12631: Username retrieval failed

Possible cause: Wrong crypto in keytab (not -crypto AES256-SHA1)

Authentication Service Failed

ERROR:
ORA-12641: Authentication service failed to initialize

Siehe ORA-12638 (Folgefehler)

Literatur

  1. Oracle 19c Security Guide (https://docs.oracle.com/en/database/oracle/oracle-database/19/dbseg/database-security-guide.pdf
  2. Knowledge Base : Oracle Database 12c Kerberos Configuration – Loopback.ORG
  3. PART 4: Implementing Oracle Database Single Sign-on Using Kerberos, Active Directory, and Oracle CMU | Official Pythian®® Blog