Marco Burmeister

  private Homepage



Oracle - Network encryption / Netzwerk Verschlüsselung für Datenbankverbindung

Bei Oracle Datenbanken gibt es verschiedene Möglichkeiten die Verbindung zur Datenbank zu verschlüsseln.
Hier soll es um eine relativ einfache Variante gehen, die oftmals keine Anpassung auf Client-Seite erfordert. Das hängt aber von der Art der Einstellung und dem Client ab.
Mit dieser Anleitung ist es möglich sicherzustellen, dass niemand den Netzwerkverkehr im Klartext mitlesen kann.

Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!

Die Seite ist in die folgenden Bereiche eingeteilt:




top Netzwerk Verschlüsselung für Datenbankverbindung - Allgemein

Mit dem hier beschriebenen Vorgehen wird die Kommunikation zwischen Client und Datenbank für die Datenbank-Session verschlüsselt. Damit kann dann mit einem Netzwerk-Tool nicht mehr der Inhalt der Kommunikation im Klartext mitgelesen werden.
Im Ergebnis ist es wie der Unterschied zwischen der Verbindung mit einem Linux Server via TELNET (= keine Verschlüsselung) oder SSH (=mit Verschlüsselung).
In der Oracle Dokumentation gibt es noch weitere Hinweise. Hier möchte ich nur die einfache Fassung beschreiben.
Wir können auf Seite des Servers oder auf Seit des Clients Einstellungen vornehmen, welche die Verbindungsverschlüsselung aktivieren. Im Standard sind beide Seiten so eingestellt, dass sie verschlüsselte Verbindung akzeptieren (Einstellung ACCEPTED - siehe weiter unten).
Das bedeutet, dass die Anpassung am Datenbank Server gleich alle eingehenden Verbindungen betreffen wird, aber die Einstellung am Client nur den Verbindungsaufbau von diesem Client zum Server beeinflusst.
Die Parameter / Einstellungen können für die Datenbank Instanz in der sqlnet.ora unterhalb von $ORACLE_HOME/network/admin bzw. dem Pfad von TNS_ADMIN definiert werden. Für den Client kann die Einstellung wahlweise über den Connect-String mitgegeben werden oder ebenfalls via Eintrag in sqlnet.ora, die unterhalb von $ORACLE_HOME/network/admin oder dem Pfad der in TNS_ADMIN definiert ist, liegen muss.
Es gibt insgesamt 4 Kern-Einstellungen, die das Verhalten der Verbindungsaufnahme steuern.


Aus diesen Parametern ergibt sich eine Matrix:
Client
REJECTED
Client
ACCEPTED
Client
REQUESTED
Client
REQUIRED
Server
REJECTED
Server
ACCEPTED
🔒🔒
Server
REQUESTED
🔒🔒🔒
Server
REQUIRED
🔒🔒🔒

Bedeutung der Symbole:
SymbolBedeutung
Verbindung wird hergestellt
keine Verbindung
🔒Verbindung wird hergestellt und ist verschlüsselt

Hinweis: In der Oracle Dokumentation gibt es noch einige Rand-Informationen zu den o.a. Fällen, die im Fall von Problemen mit der Verbindungsherstellung zwischen Client und Server eine Rolle spielen könnten (siehe unten bei den Links).

Zusätzlich zu den o.a. Parametern kann noch der Verschlüsselungs-Typ und ein Checksum-Typ festgelegt werden.
Die folgenden Verschlüsselungs-Typen sind gültige Werte:
Als Checksum-Typ kann einer der folgenden verwendet werden: Der Checksum-Typ MD5 sollte nicht mehr verwendet werden und ist in bestimmten Oracle DB Versionen im Status deprecated.

Das sind die grundlegenden Informationen zum Thema. In den nächsten Abschnitten finden sich Vorschläge zur Konfiguration.

top Netzwerk Verschlüsselung für Datenbankverbindung - Server-Einstellung

Aus den ganzen Möglichkeiten auf Seiten der Datenbank Instanz die notwendigen Einstellungen vorzunehmen, habe ich oft die folgende verwendet:
Die Einträge sind in der sqlnet.ora unterhalb des Pfades der Variable TNS_ADMIN bzw. $ORACLE_HOME/network/admin vorzunehmen.
In dem Beispiel habe ich in der sqlnet.ora die Verbindungsaufnahme in verschlüsselter Form verlangt. Ebenso wird eine Checksum verlangt. Bei den verwendeten AES- und SHA-Typen hatte ich mich zwischen Sicherheit und Last / Aufwand ein wenig zu entscheiden und bin bei den angegebenen Werten gelandet.
# Encryption
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.ENCRYPTION_TYPES_SERVER = (AES256)
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_TYPES_SERVER = (SHA256)
# Encryption


top Netzwerk Verschlüsselung für Datenbankverbindung - Client-Einstellung

Beim Client haben wir drei Möglichkeiten. Es hängt von der Situation ab, welches Szenario sinnvoll ist.

SzenarioBeschreibung
[keine Aktion]Wir nehmen keine Einstellung vor. Da Oracle einige Standad-Werte vorgibt, werden wir eine verschlüsselte Verbindung erhalten, wenn wir von Seiten der Datenbank Instanz eine Verschlüsselung erzwingen.
ACHTUNG: Hier kann es mit alten (Oracle) Clients vielleicht zu Problemen kommen.
Das Verhalten ist hier nicht immer vorhersehbar.
Oracle Client mit sqlnet.oraHier gehen wir von einem Client aus, welcher auch die sqlnet.ora als Datei für Einstellungen kennt. Die entsprechenden Einstellungen werden im Anschluss gezeigt und ähneln denen der Datenbank Instanz. Die Schlüsselworte sind nur auszutauschen und der Modus zu prüfen.
Bei diesem Verfahren können wir ein bestimmtes Verhalten erwarten.
Oracle Connect-StringHier geben wir im Connect-String schon Dinge vor.
Wir können z.B. bei einem JDBC Connect String den folgenden String ergänzen (Security=(ENCRYPTION_LEVEL=REQUIRED)(CRYPTO_CHECKSUM_CLIENT=REQUIRED)), um eine verschlüsselte Verbindung zu erzwingen.
Bei diesem Verfahren können wir ein bestimmtes Verhalten erwarten.

sqlnet.ora-Einstellung
In dem Beispiel habe ich in der sqlnet.ora die Verbindungsaufnahme in verschlüsselter Form akzeptiert. Ebenso wird eine Checksum akzeptiert. Bei den verwendeten AES- und SHA-Typen hatte ich mich zwischen Sicherheit und Last / Aufwand ein wenig zu entscheiden und bin bei den angegebenen Werten gelandet. Sicherer wäre es wenn wir die verschlüsselte Form verlangen. Aber in meinem Beispiel überlasse ich der Datenbank den Zwang zur Einhaltung.
# Encryption
SQLNET.ENCRYPTION_CLIENT=ACCEPTED
SQLNET.ENCRYPTION_TYPES_CLIENT=(AES256,AES192,AES128)
SQLNET.CRYPTO_CHECKSUM_CLIENT=ACCEPTED
SQLNET.CRYPTO_CHECKSUM_TYPES_CLIENT=(SHA256,SHA384,SHA512)
# Encryption


JDCB-Connect-String
Beispiel für einen Oracle Connect String im JDBC Format:
Ohne Verschlüsselung
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<host>)(PORT=<Port>))(CONNECT_DATA=(SERVICE_NAME=<Servicename>)))
Mit Verschlüsselung
jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=<host>)(PORT=<Port>))(CONNECT_DATA=(SERVICE_NAME=<Servicename>))(Security=(ENCRYPTION_LEVEL=REQUIRED)(CRYPTO_CHECKSUM_CLIENT=REQUIRED)))

top Netzwerk Verschlüsselung für Datenbankverbindung - Prüfung Verbindung

Jetzt haben wir die Verschlüsselung eingerichtet und möchten herausfinden, ob die Verbindung zur Datenbank wirklich verschlüsselt wird.
Hierzu können wir das folgende Statement verwenden:
Für die eigene Verbindung:
select network_service_banner
from v$session_connect_info
where sid in (select distinct sid from v$mystat);

Für eine beliebige Verbindung (SID muss bekannt sein):
select network_service_banner
from v$session_connect_info
where sid = <SID>;


Es gibt nun eine kleine Liste als Ausgabe.
Wenn die Verbindung verschlüsselt ist, wird die folgende Ausgabe angezeigt:

NETWORK_SERVICE_BANNER
-------------------------------------------------------------------------------------
TCP/IP NT Protocol Adapter for Linux: Version 12.1.0.2.0 - Production
Encryption service for Linux: Version 12.1.0.2.0 - Production
AES256 Encryption service adapter for Linux: Version 12.1.0.2.0 - Production
Crypto-checksumming service for Linux: Version 12.1.0.2.0 - Production
SHA1 Crypto-checksumming service adapter for Linux: Version 12.1.0.2.0 - Production
(Anmerkung: \ = Zeilenumbruch)
(Ausgabe ist gekürzt!)
NETWORK_SERVICE_BANNER
----------------------------------------------
TCP/IP NT Protocol Adapter [...] - Production
Encryption service [...] - Production
AES256 Encryption service adapter [...] - Production
Crypto-checksumming service [...] - Production
SHA1 Crypto-checksumming service [...] - Production

Wenn die Verbindung unverschlüsselt ist, wird die folgende Ausgabe angezeigt:
NETWORK_SERVICE_BANNER
-------------------------------------------------------------------------------------
TCP/IP NT Protocol Adapter for Linux: Version 12.1.0.2.0 - Production
Encryption service for Linux: Version 12.1.0.2.0 - Production
Crypto-checksumming service for Linux: Version 12.1.0.2.0 - Production
(Anmerkung: \ = Zeilenumbruch)
(Ausgabe ist gekürzt!)
NETWORK_SERVICE_BANNER
----------------------------------------------
TCP/IP NT Protocol Adapter [...] - Production
Encryption service [...] - Production
Crypto-checksumming service [...] - Production


top Netzwerk Verschlüsselung für Datenbankverbindung - Cloud Control


Einführung
Auch Cloud Control kann mit verschlüsselten Verbindungen zur Oracle Repository Datenbank umgehen.
Zur Aktivierung sind bei Cloud Control 13.5 ein paar Dinge einzustellen. Darum soll es in diesem Abschnitt gehen.

Vorarbeiten
Bevor wir bei Cloud Control die Einstellungen für die verschlüsselte Datenbankverbindung konfigurieren, muss folgendes vorbereitet sein:



Cloud Control Einstellungen
Wir müssen hier an zwei Stellen die gewünschten Einstellungen vornehmen. Zunächst müssen wir mittels emctl Einstellungen vornehmen. Im Anschluss ist die Datei emgc.properties zu pflegen.

Wir beginnen mit dem Befehle emctl. Die folgenden Befehle müssen einzeln ausgeführt werden, da das Passwort vom Cloud Control Datenbank-Benutzer sysman abgefragt wird. Die Parameter und Werte entsprechen den Einstellungen für den Client und der sqlnet.ora. Diese Befehle können wir nur erfolgreich absetzen, wenn Cloud Control gestartet ist.
emctl set property -name oracle.sysman.core.conn.enableEncryption -value 'true'
emctl set property -name oracle.net.encryption_client -value 'REQUESTED'
emctl set property -name oracle.sysman.core.conn.encryption_types_client -value '( AES256 )'
emctl set property -name oracle.net.crypto_checksum_client -value 'REQUESTED'
emctl set property -name oracle.sysman.core.conn.crypto_checksum_types_client -value '( SHA256 )'
(Anmerkung: \ = Zeilenumbruch)
emctl set property -name \
oracle.sysman.core.conn.enableEncryption -value 'true'

emctl set property -name \
oracle.net.encryption_client -value 'REQUESTED'

emctl set property -name \
oracle.sysman.core.conn.encryption_types_client \
-value '( AES256 )'

emctl set property -name \
oracle.net.crypto_checksum_client -value 'REQUESTED'

emctl set property -name \
oracle.sysman.core.conn.crypto_checksum_types_client \
-value '( SHA256 )'



Im Anschluss an diese Einstellung stoppen wir Cloud Control komplett.

Wir wechseln dann in das Verzeichnis vom installierten Cloud Control (hier Version 13.5) (Syntax des Pfads: /oracle/u01/app/oracl/product/gc_instance_<Versionsnummer>/em/<Instanz>).
Das Verzeichnis heisst dann /oracle/u01/app/oracl/product/gc_instance_13500/em/EMGC_OMS1.
Hier ergänzen wird in der Datei emgc.properties die folgenden Zeilen:
oracle.sysman.core.conn.enableEncryption=true
oracle.net.encryption_client=REQUESTED
oracle.net.encryption_types_client=(AES256)
oracle.net.crypto_checksum_client=REQUESTED
oracle.net.crypto_checksum_types_client=(SHA256)

Die Parameter und Werte entsprechen wieder den Einstellungen für den Client und der sqlnet.ora.

Cloud Control Aktualisierungen / Updates - zu beachten
Wenn wir im Cloud Control ein neues RU einspielen möchten oder ein Upgrade ausführen wollen, sollten wir vorher die Einstellungen für die Datenbank-Verbindungsverschlüsselung anpassen.
Bei meinen bisherigen Arbeiten gab es Verbindungsprobleme der jeweiligen Update-Tools, wenn bei der Datenbankinstanz die Verschlüsselung der Verbindung erzwungen wurde (Einstellung REQUIRED).

Für die Zeit von solchen Wartungsarbeiten stelle ich daher in der sqlnet.ora der Datenbankinstanz die Einstellungen der sqlnet.ora wie folgt um und starte danach die Datenbankinstanz durch.
vorher
SQLNET.ENCRYPTION_SERVER = REQUIRED
SQLNET.CRYPTO_CHECKSUM_SERVER = REQUIRED

nachher
SQLNET.ENCRYPTION_SERVER = ACCEPTED
SQLNET.CRYPTO_CHECKSUM_SERVER = ACCEPTED


Nachdem ich die Aktualisierung eingespielt habe, stoppe ich am Ende das komplette Cloud Control und stelle in der sqlnet.ora der Datenbankinstanz die alten Einstellungen zum Themen Verbindungsverschlüsselung wieder her.


top Links zum Thema


Hinweis:
Für die Richtigkeit der Daten übernehme ich keine Gewähr!
Für den Inhalt von Internet-Seiten, auf die von dieser Seite verwiesen wird, übernehme ich keine Verantwortung!