Zurück zur Übersicht

Online Magazin

Namen von (Oracle-)Datenbanken einfach verwalten

Key Visual Hack der Woche

Jedes Unternehmen mit einer grösseren Anzahl an Datenbanken profitiert von einem Verzeichnis, in dem die Namen der Datenbanken gespeichert sind. Doch wie verwaltet man ein solches Verzeichnis mit möglichst wenig Aufwand? Z. B. indem man einen 389 Directory Server benutzt. Lass uns gemeinsam einen solchen Server für eine Oracle-Datenbank installieren.

 

von Stefan Oehrli

Sowohl als Datenbank-Administratorin oder -Administrator wie auch als Endnutzerin oder -nutzer braucht man, um auf eine Oracle-Datenbank zuzugreifen, drei Dinge: ihren Hostnamen, Port und den Datenbank- bzw. Servicenamen. Bei kleineren Umgebungen können Oracle-User problemlos mithilfe einer tnsnames.ora Datei auf die Datenbanken zugreifen. Doch bei grösseren Umgebungen mit mehreren Oracle-Datenbanken und hunderten Clients wird die Verwaltung und Verteilung der tnsnames.ora Dateien schwierig – nimmt der/die Administrator*in etwa eine Änderung vor, muss er/sie dies allen, die auf den Server der Datenbank zugreifen wollen, einzeln mitteilen. Was also tun? Ich empfehle zur einfacheren Verwaltung ein LDAP-Verzeichnis.

Diese Idee ist nicht neu und es gibt dabei mehrere Ansätze:

  • Verwendung eines Oracle Directory
  • Einrichtung von Oracle Enterprise User Security (EUS)
  • Eintragung und Verwaltung in MS Active Directory
  • Verwendung eines LDAP-Servers (389 Directory Server oder OpenLDAP)

Gerade die letzte Methode (obwohl nicht offiziell dokumentiert und damit auch nicht offiziell unterstützt) bietet zwei entscheidende Vorteil:

  1. Sowohl mit dem 389 Directory Server als auch mit OpenLDAP ist es vergleichsweise einfach, ein zentrales Verzeichnis für die Oracle Net Service Namen oder ora zu erstellen. Ein eigenständiger LDAP-Server steht in wenigen Minuten. Mit etwas mehr Aufwand lassen sich auch sichere SSL-Zertifikate, erweiterte Directory Information Tree (DIT) mit verschiedenen Suffixen, sowie die Replikation usw. einfach konfigurieren.
  2. Durch die Verwendung eines Open Source LDAP-Servers bleiben die Kosten überschaubar.


Lass uns gemeinsam Schritt für Schritt anschauen, wie man einen 389 Directory Server installiert und konfiguriert (Noob Hack) und wie man anschliessend einen Oracle-Kontext herstellt (Pro Hack).

Abbildung 1: LDAP basierte Auflösung von Oracle Net Service Namen (Skizze Stefan Oehrli)

Abbildung 1: LDAP-basierte Auflösung von Oracle-Net-Service-Namen (Skizze Stefan Oehrli)

Noob Hack

389 Directory Server für Namensauflösung

Voraussetzungen und Anforderungen:

  • Keine spezifischen Hardware-Anforderungen
  • Empfehlung: mindestens 2 CPU-Kerne und 16 GB Speicher


Vorbereitung

Die Software für den 389 Directory Server steht bei Oracle Enterprise Linux 8 im zusätzlichen Repository Oracle Linux 8 Application Stream als Module 389-ds zur Verfügung.


Zuerst prüfen und aktivieren wir das Modul:

sudo yum module --available list 389-ds
sudo yum -y module enable 389-ds


Dann öffnen wir die lokalen Firewall-Ports für LDAP und LSAPS:

sudo firewall-cmd --list-all --permanent --zone=public
sudo firewall-cmd --permanent --add-service=ldap --zone=public
sudo firewall-cmd --permanent --add-service=ldaps --zone=public
sudo firewall-cmd --permanent --add-port=9090/tcp --zone=public
sudo firewall-cmd –reload
sudo firewall-cmd --list-all --permanent --zone=public


Mit einer spezifischen GID erstellen wir die Gruppe dirsrv und weisen oracle als Betriebssystembenutzer dieser Gruppe zu:

sudo groupadd --gid 520 dirsrv
cat /etc/group
sudo usermod -a -G dirsrv oracle

(Dieser Schritt ist optional. Alternativ kann man die Administration des LDAP-Server entweder als Benutzer root oder immer via LDAPS ausführen.)


Installation

Das Modul 389-ds haben wir bereits aktiviert. Mit dem Kommando yum installieren wir die Pakete und Abhängigkeiten für den 389 Directory Server:

sudo yum install 389-ds-base sscg


Konfiguration

Nun starten wir die Konfiguration des 389 Directory Server für den Oracle-Net-Service. Zunächst erstellen wir mithilfe einer Vorlage eine Directory-Server-Instanz:

sudo dscreate create-template /tmp/oraNet.inf


Als nächstes passen wir die Vorlage an, und zwar insbesondere die folgenden Werte:

  • full_machine_name – Vollqualifizierter Hostname des Servers
  • instance_name – Name der LDAP Instanz
  • root_password – Passwort für den Root-Benutzer des LDAP-Servers
  • suffix – Basis-DN für den Directory Information Tree (DIT) des LDAP-Servers



Nachfolgend zeige ich dir ein Beispiel für den Aufbau einer Instanz mit dem Namen oraNet auf dem Host ldap1.trivadislabs.com mit der Basis-DN dc=trivadislabs,dc=com:

[general]
full_machine_name = ldap1.trivadislabs.com
start = true
[slapd]
instance_name = oraNet
port = 389
root_password = Welcome1
secure_port = 636
self_sign_cert = true
self_sign_cert_valid_months = 24
[backend-userroot]
create_suffix_entry = true
suffix = dc=trivadislabs,dc=com


Die Instanz erstellen wir als OS-Benutzer root mit dem Befehl dscreate:

sudo dscreate from-file /tmp/oraNet.inf


Das Kommando dscreate erstellt nicht nur die Instanz, sondern gleich auch die entsprechenden start/stop-Skripte respektive einen Service. Ob die Instanz läuft, lässt sich mit dem Kommando dsctl prüften. Alternativ kann man auch gleich direkt den Status des Service mit dem Kommando systemctl prüfen:

sudo dsctl –list
sudo systemctl status dirsrv@oraNet.service


Nun laden wir die Oracle-spezifischen Schemadefinitionen. Dazu kopieren wir die Datei 90orclNet.ldif in das entsprechende Instanz-Verzeichnis und starten die Instanz anschliessend neu. Diese Datei enthält die entsprechenden LDAP-Objektklassen und -attribute, welche für Oracle-Net-Service-Name-Objekte benötigt werden:

curl -Lf https://url.oradba.ch/90orclNet -o /tmp/90orclNet.ldif
sudo cp /tmp/90orclNet.ldif /etc/dirsrv/slapd-oraNet/schema/90orclNet.ldif
sudo systemctl restart dirsrv@oraNet.service


Mit dem Kommando dsctl prüfen wir erneut den Status der LDAP-Instanz:

sudo dsctl $(dsctl --list) status
sudo dsctl $(dsctl --list) healthcheck


Beim Ausführen der LDAP-Befehle, muss man jeweils das Passwort angeben. Damit man dies nicht jedes Mal interaktiv tun muss, kann man das Passwort temporär in einer Datei abspeichern und mit dem Parameter -y den LDAP-Befehlen übergeben. Die Passwortdatei sollte man anschliessend wieder löschen:

echo "Welcome1" | tr -d '\n' >.oraNetDirectoryManager.pwd
chmod 600 .oraNetDirectoryManager.pwd


So weit so gut: Der Verzeichnisserver ist fertig und bereit Informationen aufzunehmen. Wenn dir das bereits weiterhilft, kannst du dich jetzt zurücklehnen. Wenn du aber die entsprechenden Oracle-Net-Service-Namen registrieren willst, bleib noch einen Moment dran: Denn dazu braucht es einen Oracle-Kontext, den wir im «Pro Hack» etablieren.

Noch mehr Tipps und Tricks aus der Welt der Daten:

Wie kann man den Modulo-Operator für Data Analysis benutzen? Finde es hier heraus.

Wie erreichts du in 4 Schritten mehr Datenschutz auf deinem Smartphone? Die Antwort findest du hier.

Bestellungen von Kunden zusammenzählen – wie macht man das, wenn mehr Bestellungen berücksichtigt werden müssen, als im ausgewählten Zeitraum sichtbar sind? Hier gibt's eine konkrete Anleitung.

Pro Hack

389 Directory Server mit Oracle-Kontext

Um den Oracle-Kontext einzurichten, erstellen wir als Erstes ein Objekt cn=OracleContext mit der Klasse orclContext in der Base DN dc=trivadislabs,dc=com:

ldapadd -h $(hostname -f) -p 389 -x -D "cn=Directory Manager" \
-y .oraNetDirectoryManager.pwd <<-EOI
dn: cn=OracleContext,dc=trivadislabs,dc=com
Objektklasse: orclContext
cn: OracleContext
EOI


Die Oracle-Clients führen die Anfragen für die Auflösung der Oracle-Net-Service-Namen in der Regel mit einer anonymen LDAP-Abfrage bzw. mit einem anonymen Bind durch. In der Standardkonfiguration müssen wir dies zwingend mit entsprechenden ACI-Regeln freischalten:

ldapadd -h $(hostname -f) -p 389 -x -D "cn=Directory Manager" \
-y .oraNetDirectoryManager.pwd <<-EOI
dn: dc=trivadislabs,dc=com
changetype: modify
add: aci
aci: (targetattr!="userPassword||authPassword")(version 3.0; acl "Anonymous read access"; allow (read,search,compare) userdn="ldap:///anyone";)
EOI


Nachdem der leere 389-Verzeichnisserver nun bereit ist für die Erfassung von Oracle-Net-Service-Namen, können wir die Einträge erfassen, z.B. mit dem Kommando ldapadd, LDAP Browser, etc. Im folgenden Beispiel fügen wir mit dem Kommando ldapadd einen Eintrag mit dem Namen TDB02 und dem entsprechenden Oracle-Net-Description-String hinzu:

ldapadd -h $(hostname -f) -p 389 -x -D "cn=Directory Manager" \
-y .oraNetDirectoryManager.pwd <<-EOI
dn: cn=TDB02,cn=OracleContext,dc=trivadislabs,dc=com
Objektklasse: top
Objektklasse: orclNetService
cn: TDB02
orclNetDescString: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db19)(PORT=1521)) (CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TDB02.trivadislabs.com))(UR=A))
EOI


Einträge verändern geht mit dem Befehl Idapmodify, ...

ldapmodify -h $(hostname -f) -p 389 -x -D "cn=Directory Manager" \
-y .oraNetDirectoryManager.pwd <<-EOI
dn: cn=TDB02,cn=OracleContext,dc=trivadislabs,dc=com
changetype: modify
ersetzen: orclNetDescString
orclNetDescString: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=db19)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=TDB02.trivadislabs.com))(UR=A))
EOI


... suchen mit ldapsearch, ...

ldapsearch -h $(hostname -f) -p 389 -x -LLL -b "dc=trivadislabs,dc=com" -s sub "(&(objectclass=orclNetService)(cn=TDB0*))"


... und löschen mit ldapdelete:

ldapdelete -h $(hostname -f) -p 389 -x -D "cn=Directory Manager" \
-y .oraNetDirectoryManager.pwd \
cn=TDB03,cn=OracleContext,dc=trivadislabs,dc=com


Bevor wir die LDAP-basierten Oracle-Net-Service-Namen nutzen können, müssen wir noch die Oracle-Net-Konfiguration anpassen. Dazu müssen wir die Reihenfolge der Namensauflösung in $TNS_ADMIN/sqlnet.ora mit dem Parameter NAMES.DIRECTORY_PATH anpassen und LDAP an die erste Stelle setzen:

NAMES.DIRECTORY_PATH=(LDAP, TNSNAMES, EZCONNECT )


Darüber hinaus müssen wir die Datei $TNS_ADMIN/ldap.ora erstellen. Darin wird der Konfiguration des LDAP-Servers wie folgt angegeben:

DIRECTORY_SERVERS=(ldap1.trivadislabs.com:389:636)
DEFAULT_ADMIN_CONTEXT="dc=trivadislabs,dc=com"
DIRECTORY_SERVER_TYPE=OID


Und tadaa: Die Oracle-Net-Konfiguration ist abgeschlossen! Mit dem Kommando tnsping kannst du nun noch überprüfen, ob der Oracle-Net-Service-Name über LDAP oder tnsnames.ora aufgelöst wird.

Referenzen

Oracle® Database, Database Net Services Reference 21c – Appendix B LDAP Schema for Oracle Net Services https://docs.oracle.com/en/database/oracle/oracle-database/21/netrf/index.html

Red Hat Directory Server 11, Product Documentation https://access.redhat.com/documentation/en-us/red_hat_directory_server/11

Oehrli Stefan (2022), GitHub Gist mit LDAP Schema für Oracle Net Services
https://url.oradba.ch/90orclNet

Oehrli Stefan (2022), GitHub Projekt oehrlis/389ds 389 Directory Server in Docker

Oracle® Database, Database Administrator's Reference 21c for Microsoft Windows - Using Oracle Database with Microsoft Active Directory, https://docs.oracle.com/en/database/oracle/oracle-database/21/ntqrf/index.html

Fedora 389 Directory Server, https://directory.fedoraproject.org

Deine Ansprechperson

HIER FINDEST DU WEITERE ARTIKEL UNSERER DATA & AI EXPERT*INNEN:

TechTalk
Cloud Datenplattform

TechTalk Audio: Data Engineer
TechTalk
Key Visual Tech Talk
Cloud Gesundheit

Privacy by Design: Sensible Daten schützen
TechTalk
Key Visual Tech Talk
KI Gesundheit

Wie AlphaFold hilft, Medikamente zu finden