Die Konfiguration von Kerberos und die Einrichtung eines Benutzers mit Kerberos Authentifizierung bringt SSO (Single-Sign-On) mit sich.
- Setup der Umgebung
- Export der Keytabs
- Setup der Datenbank-Server
- Setup Client
- Anmeldung und Test der Konfiguration
- Konfiguration Oracle Enterprise Manager
- Konfiguration Oracle SQL-Developer
- Anmeldung mit dem Linux Client
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)
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:
[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.