Die Konfiguration von Kerberos und die Einrichtung eines Benutzers mit Kerberos Authentifizierung bringt SSO (Single-Sign-On) mit sich.

 

 

Setup der Umgebung

Hostname Funktion
dc1.demo.local Active Directory / Domänen Controller (Server 2019)
W10DEMO1.demo.local Windows 10 Professional Workstation
nfs.demo.local NFS-Server REHL 7.9 (Maipo)
grid1.demo.local Oracle Cloud Controll 13.4 REHL 7.9 (Maipo)
prod-db1.demo.local  Data Guard Node 1 / Oracle 19c / REHL 7.9 (Maipo)
prod-db2.demo.local Data Guard Node 2 / Oracle 19c / REHL 7.9 (Maipo)

 

Die Datenbank-User der Data Guard Datenbank sollen über Kerberos am AD authentifiziert werden.

 

Export der Keytabs

Für die Keytab-Datei wird ein Active Directory User benötigt.

Das Passwort für den User darf nicht ablaufen.

AES muss deativiert sein!

Der Export wird in der Regel auf dem Domänen-Controller durchgeführt.

Wichtig: Die Domäne muss in GROSSBUCHSTABEN sein!

Es darf ausschließlich "RC4-HMAC-NT" zur Verschlüsselung verwendet werden, nur mit "RC4-HMAC-NT" funktioniert das KEYTAB ohne UserPrincipalName!

Warum soll nur "RC4-HMAC-NT" verwendet werden!

Zur Authentifizierung kann sowohl der "userPricipalName" sowie der "servicePrincipalName" herangezogen werden.

Nur bei Verwendung des Verschlüsselungstypes "RC4-HMAC-NT" wird der "servicePrincipalName" herangezogen!

Wenn man AES benutzen möchte, dann muss für jedes KEYTAB ein eigener User angelegt werden!!!

D.h. der Kerberos User kann für mehrere Datenbank Server verwendet werden!

 

Sollten Sonderzeichen im Passwort verwendet werden, dann könnte ein Wechsel der Codepage helfen.

Eingabeaufforderung:

C:\>chcp 65001
Aktive Codepage: 65001.

Eingabeaufforderung Keytab exportieren:

#Server prod-db1.demo.local
C:\> ktpass -princ "oracle/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!" +dumpsalt -mapuser "DEMO\orakrb5" -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -setUPN -SetPass -pass Oracle123 -out  Z:\installs\kerberos\prod-db1.demo.local.keytab


#Server prod-db2.demo.local
C:\> ktpass -princ "oracle/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!" +dumpsalt -mapuser "DEMO\orakrb5" -crypto RC4-HMAC-NT -ptype KRB5_NT_PRINCIPAL -setUPN -SetPass -pass Oracle123 -out  Z:\installs\kerberos\prod-db2.demo.local.keytab

Wer es genau wissen will: https://docs.microsoft.com/de-de/archive/blogs/pie/all-you-need-to-know-about-keytab-files

Mit dem Kommando klist aus dem Java Tool Kit können die Principale des Keytab-Files angezeigt werden, hilfreich bei der Fehlersuche:

Eingabeaufforderung:

C:\Program Files (x86)\Java\jre1.8.0_271\bin>klist -e -t -k Z:\installs\kerberos\prod-db1.demo.local.keytab

Key tab: Z:\installs\kerberos\prod-db1.demo.local.keytab, 1 entry found.

[1] Service principal: oracle/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
         KVNO: 65
         Key type: 23
         Time stamp: Jan 01, 1970 01:00:00

C:\Program Files (x86)\Java\jre1.8.0_271\bin>klist -e -t -k Z:\installs\kerberos\prod-db2.demo.local.keytab

Key tab: Z:\installs\kerberos\prod-db2.demo.local.keytab, 1 entry found.

[1] Service principal: oracle/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
         KVNO: 65
         Key type: 23
         Time stamp: Jan 01, 1970 01:00:00

C:\Program Files (x86)\Java\jre1.8.0_271\bin>

 

Setup der Datenbank-Server

Anleitung zur Konfiguration der Oracle Datenbank-Server für die Authentifizierung der personalisierten Accounts.

Wichtig: Vorab prüfen ob der Server demo.local:88 erreichbar ist (TCP und UDP).

TCP: telnet demo.local 88

UDP: nc -z -v -u demo.local 88

Wenn "nein" Den Fehler suchen ggf. eine Firewall-Freischaltung beauftragen.

Die Konfiguration muss auf beiden Konten der Data Guard Umgebung durchgeführt werden. 

ToDo:

Anlegen der Verzeichnisse auf dem Primären und dem Standby Server:

mkdir -p /app/oracle/kerberos

Die passenden KEYTABS auf die Server nach /oracle/app/kerberos/ kopieren.

Da wir uns auf einer VMWare Workstation mit aktiviert "hgfs" befinden und das "installs" Verzeichnis auf allen VM's gemounted ist, ist es relativ einfach.

Beispiel:

# Server 1
[oracle@prod-db1@PROD18] /mnt/hgfs/installs/kerberos 
$ cp prod-db1.demo.local.keytab /app/oracle/kerberos/

$ ls -l /app/oracle/kerberos/
total 4
-rwxr-xr-x 1 oracle oinstall 78 Dec 19 11:16 prod-db1.demo.local.keytab

# Server 2
[oracle@prod-db2@PROD] /mnt/hgfs/installs/kerberos
$ cp prod-db2.demo.local.keytab /app/oracle/kerberos/
[oracle@prod-db2@PROD] /mnt/hgfs/installs/kerberos 
$ ls -l /app/oracle/kerberos/
total 4
-rwxr-xr-x 1 oracle oinstall 78 Dec 19 11:17 prod-db2.demo.local.keytab

Wichtig: Im KEYTAB steht der Servername, deshalb muss zwingend das korrekte KEYTAB-File verwendet werden.

 

Die SQLNET.ORA muss um die aufgehührten Bereiche erweitert werden.

Die Datei SQLNET.ORA enthält nun einen Verweis auf das KEYTAB-File, somit ist die SQLNET.ORA auf jedem Server unterschiedlich!

#Server 1
## Kerberos Client Auth.
SQLNET.KERBEROS5_KEYTAB=/app/oracle/kerberos/prod-db1.demo.local.keytab
SQLNET.KERBEROS5_CONF=/app/oracle/kerberos/krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle
SQLNET.AUTHENTICATION_SERVICES=(BEQ,KERBEROS5PRE,KERBEROS5)
SQLNET.FALLBACK_AUTHENTICATION=true
## Ende Kerberos Client Auth.


#Server 2
## Kerberos Client Auth.
SQLNET.KERBEROS5_KEYTAB=/app/oracle/kerberos/prod-db2.demo.local.keytab
SQLNET.KERBEROS5_CONF=/app/oracle/kerberos/krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle
SQLNET.AUTHENTICATION_SERVICES=(BEQ,KERBEROS5PRE,KERBEROS5)
SQLNET.FALLBACK_AUTHENTICATION=true
## Ende Kerberos Client Auth.

 

Die krb5.conf muss noch auf allen Servern verteilt werden. In unserer Konfiguratin nach "/app/oracle/kerberos/krb5.conf.

In unserer Umgebung ist die Konfiguration sehr einfach, da sich alle Server in der gleichen Domäne befinden.

[libdefaults]
default_realm = DEMO.LOCAL 

[realms]
DEMO.LOCAL = {
  kdc = dc1.demo.local:88
}

[domain_realm]
.demo.local = DEMO.LOCAL 
demo.local  = DEMO.LOCAL

 

Ggf. den Parameter os_authent_prefix zurücksetzen, auf beiden Seiten sowohl Primär sowie Standby:

alter system set os_authent_prefix='' scope=spfile;

 

Den User Account C##333666 zum testen anlegen.

Der User ist ein Windows Domänen Benutzer und hat den Namen Xaver Schmitt.

create user C##333666 identified EXTERNALLY as Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!';
Grant connect to C##333666 container=all;

 

Setup Client

Was wird benötigt:

Der Oracle Client mit der Option Advanced Security muss installiert sein.

Es wird eine SQLNET.ORA mit den aufgeführten Parametern benötigt:

(KERBEROS5PRE ist für Windows SSO, KERBEROS5 ist für Enterprise-Manager Login)

Auszug SQLNET.ORA
SQLNET.KERBEROS5_CC_NAME=OSMSFT://
SQLNET.AUTHENTICATION_SERVICES= (NTS,KERBEROS5PRE) 
SQLNET.KERBEROS5_CONF =c:\apps\kerberos\krb5.conf     
SQLNET.KERBEROS5_CONF_MIT = true
SQLNET.AUTHENTICATION_KERBEROS5_SERVICES=oracle
SQLNET.FALLBACK_AUTHENTICATION=true

Es wird eine krb5.conf Datei ausgerollt:

krb5.conf
[libdefaults]
default_realm = EASYCREDIT.INTERN
#default_tkt_enctypes = arcfour-hmac-md5
#default_tgs_enctypes = arcfour-hmac-md5
 
[realms]
EASYCREDIT.INTERN = {
  kdc = easycredit.intern:88
}
 
[domain_realm]
.tb.noris.de = EASYCREDIT.INTERN
tb.noris.de  = EASYCREDIT.INTERN

Anmeldung und Test der Konfiguration

Anmeldung mit SQL*Plus:

C:\Users\333666>sqlplus /@pdb_eval

SQL*Plus: Release 19.0.0.0.0 - Production on Sa Dez 19 12:08:22 2020
Version 19.3.0.0.0

Copyright (c) 1982, 2019, Oracle.  All rights reserved.

Letzte erfolgreiche Anmeldezeit: Sa Dez 19 2020 12:06:42 +01:00

Verbunden mit:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

SQL> col username format a20;
SQL> col external_name format a20;
SQL> show con_name

CON_NAME
------------------------------
PDB_EVAL
SQL> show user
USER ist "C##333666"
SQL> select username, external_name from dba_users where username = 'C##333666';

USERNAME             EXTERNAL_NAME
-------------------- --------------------
C##333666            Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

SQL>
SQL> select host_name from v$instance;

HOST_NAME
----------------------------------------------------------------
prod-db1.demo.local

SQL>

### Nach dem switchover der Data Guard Konfiguration

SQL> select host_name from v$instance;

HOST_NAME
----------------------------------------------------------------
prod-db2.demo.local

 

Test des Kerberos-Token (Auf der Workstation gibt es das Kommando klist mehrmals, einmal im Java Tool Kit und einmal unter C:\windows\system32!):

 

Zwischengespeicherte Tickets: (3)

...

#1>     Client: 333666 @ DEMO.LOCAL
        Server: oracle/prod-db1.demo.local @ DEMO.LOCAL
        KerbTicket (Verschlüsselungstyp): RSADSI RC4-HMAC(NT)
        Ticketkennzeichen 0x40210000 -> forwardable pre_authent name_canonicalize
        Startzeit: 12/19/2020 12:04:11 (lokal)
        Endzeit:   12/19/2020 22:03:53 (lokal)
        Erneuerungszeit: 0
        Sitzungsschlüsseltyp: RSADSI RC4-HMAC(NT)
        Cachekennzeichen: 0
        KDC aufgerufen: dc1.demo.local

...

### Nach dem switchover

#1>     Client: 333666 @ DEMO.LOCAL
        Server: oracle/prod-db2.demo.local @ DEMO.LOCAL
        KerbTicket (Verschlüsselungstyp): RSADSI RC4-HMAC(NT)
        Ticketkennzeichen 0x40210000 -> forwardable pre_authent name_canonicalize
        Startzeit: 12/19/2020 12:19:03 (lokal)
        Endzeit:   12/19/2020 22:03:53 (lokal)
        Erneuerungszeit: 0
        Sitzungsschlüsseltyp: RSADSI RC4-HMAC(NT)
        Cachekennzeichen: 0
        KDC aufgerufen: dc1.demo.local

 

Konfiguration Oracle Enterprise Manager

Fehlersuche im Logfile: Error stack from <EM_INSTANCE_HOME>/em/EMGC_OMS*/sysman/log/emoms.trc or <EM_INSTANCE_HOME>/em/EMGC_OMS*/sysman/log/emoms.log file

Debug aktivieren:

emctl set property -name log4j.rootCategory -value "DEBUG, emlogAppender, emtrcAppender" -module logging

Debug deaktivieren:

emctl set property -name log4j.rootCategory -value "ERROR, emlogAppender, emtrcAppender" -module logging

Damit die Anmeldung an der Zieldatenbank funktioniert muss in der SQLNET.ORA der aufgeführte Parameter gesetzt sein! Bitte die Reihenfolge beachten!

SQLNET.ORA:

SQLNET.AUTHENTICATION_SERVICES=(BEQ,KERBEROS5PRE,KERBEROS5)

Hier muss nur die /etc/krb5.conf angepasst werden:

/etc/krb5.conf:

# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/

[logging]
 default = FILE:/var/log/krb5libs.log
 kdc = FILE:/var/log/krb5kdc.log
 admin_server = FILE:/var/log/kadmind.log

[libdefaults]
 dns_lookup_realm = false
 ticket_lifetime = 24h
 renew_lifetime = 7d
 forwardable = false
 rdns = false
 pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
 default_realm = DEMO.LOCAL
# default_ccache_name = KEYRING:persistent:%{uid}

[realms]
 DEMO.LOCAL = {
  kdc = dc1.demo.local:88
#  admin_server = kerberos.example.com
 }

[domain_realm]
 .demo.local = DEMO.LOCAL
  demo.local = DEMO.LOCAL

Damit der Benutzer "Benannte Zugangsdaten" anlegen kann, benötigt er die Berechtigung im OMS:

EM-Ressourcenberechtigungen → Benannte Zugangsdaten

Benannte Zugangsdaten in der bash auf dem OMS anlegen:

Oracle Enterprise Manger Server (OMS):

# Anmeldung:
emcli login -username=sysman
 
#Zugangsdaten anlegen (Bsp: Mein Account 333666):
emcli create_named_credential -auth_target_type=oracle_database -cred_scope=Instance -target_type=oracle_database -target_name=CDB_PROD_DB1 -cred_type=DBKerberosCreds -cred_name="MarkusKerb" -attributes='DBKerberosUserName:333666;DBKerberosPassword:Oracle123'

 

Benannte Zugangsdaten über das Enterprise Manger GUI anlegen:

 

An der DB mit der Kerberos-Zugangsdaten anmelden:

 

 

Konfiguration Oracle SQL-Developer

Es ist eine Client Full-Client Installation erforderlich, der Instant-Client reicht leider nicht.

 

Einrichten der Verbindung

 Benutzername und Kennwort müssen LEER sein!

 

Anmeldung mit dem Linux Client

Die Konfiguration analog wie beim Server, jedoch ist kein KEYTAB erfoderlich.

 SQLNET.ORA

## Kerberos Client Auth.
SQLNET.KERBEROS5_CONF=/app/oracle/kerberos/krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle
SQLNET.AUTHENTICATION_SERVICES=(BEQ,KERBEROS5PRE,KERBEROS5)
SQLNET.FALLBACK_AUTHENTICATION=true
## Ende Kerberos Client Auth.

krb5.conf

[libdefaults]
default_realm = DEMO.LOCAL 

[realms]
DEMO.LOCAL = {
  kdc = dc1.demo.local:88
}

[domain_realm]
.demo.local = DEMO.LOCAL 
demo.local  = DEMO.LOCAL

Mit "okinit" kann wird das Kerberos-Ticket angefordert:

[oracle@usermgr@USERMGR] /app/oracle/product/18c/network/admin 
$ okinit 333666

Kerberos Utilities for Linux: Version 18.0.0.0.0 - Production on 19-DEC-2020 14:36:28

Copyright (c) 1996, 2017 Oracle.  All rights reserved.

Configuration file : /oracle/app/kerberos/krb5.conf.
Password for Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!: 
[oracle@usermgr@USERMGR] /app/oracle/product/18c/network/admin 

Nun ist eine Anmeldung ohne User und Passwort möglich:

$ sqlplus /@pdb_eval

SQL*Plus: Release 18.0.0.0.0 - Production on Sat Dec 19 14:37:51 2020
Version 18.11.0.0.0

Copyright (c) 1982, 2018, Oracle.  All rights reserved.

Letzte erfolgreiche Anmeldezeit: Sa Dez 19 2020 14:32:53 +01:00

Verbunden mit: 
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.9.0.0.0

SQL> show user;
USER ist "C##333666"
SQL> 

Mit "oklist" können die Kerberos-Tickets angeszeigt werden:

oracle@usermgr@USERMGR] /app/oracle/product/18c/network/admin 
$ oklist

Kerberos Utilities for Linux: Version 18.0.0.0.0 - Production on 19-DEC-2020 14:38:20

Copyright (c) 1996, 2017 Oracle.  All rights reserved.

Configuration file : /oracle/app/kerberos/krb5.conf.
Ticket cache: FILE:/tmp/krb5cc_54321
Default principal: Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!

Valid starting     Expires            Service principal
12/19/20 14:36:32  12/20/20 00:36:32  krbtgt/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
	renew until 12/20/20 14:36:29
12/19/20 14:37:52  12/20/20 00:36:32  oracle/Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!
[oracle@usermgr@USERMGR] /app/oracle/product/18c/network/admin 

Wichtig: Ich habe einmal zum testen auf einem Datenbankserver okinit ausgeführt. Dieses hat sehr eigenartige Auswirkungen. Deshalb nach Möglichkeit niemals "okinit" auf einen DB-Server ausführen.

Wenn dieses doch aus Versehen vorkommen sollte, dann muss der Ticket Cache von Hand gelöscht werden!

Die Datei mit dem Ticket-Cache wird vom Kommande "okinit" mit ausgegeben.