Oracle*Net Verbindungen via SSH Tunnel auf Linux Systemen

von Michael Künzner (Kommentare: 0)

Autor: Michael Künzner, Senior Professional its-people GmbH

Michael Künzner

Warum sollten wir SSH-Tunnel für Oracle*Net Verbindungen verwenden?

Die Antwort ist einfach, zum Beispiel:

  • Sie sind hinter einer Firewall

oder

  • Sie wollen keinen neuen Port öffnen (bzw. nicht zulassen)

oder

  • der Service wurde so konzipiert, dass er nur intern verwendet werden kann

oder

  • die Architektur oder Richtlinien bestimmen, dass wir SSH-Tunnel benutzen müssen

oder wie im beschriebenen Oracle*Net Beispiel weiter unten

  • Sie müssen Anfragen an Dienste weiterleiten, der auf einem Port des Datenbank Servers läuft, der möglicherweise von einer Firewall blockiert wird oder anderweitig nur zugänglich ist, wenn Sie bei diesem Remote Server angemeldet sind.

Für diesen letzten Punkt, nehmen wir an, Sie haben eine Instanz einer Oracle Datenbank, die hinter einer Firewall auf einem Remote Server läuft und der einzige Port, auf den externe Hosts zugreifen können, ist TCP-Port 22 (Standard für SSH). Mit Hilfe eines SSH-Tunnels mit Port-Weiterleitung können Sie sqlplus oder SQL Developer auf Ihrem Laptop zum Laufen bringen, so dass er sich mit Ihrer Oracle Datenbank verbinden kann.

In dem folgenden Beispiel wird eine Oracle*Net Verbindung zwischen einem Oracle Client oder Application Server (ol7node5) und den Datenbankserver (ol7node6) über SSH-Tunnel konfiguriert.

Dafür wird folgendes vorausgesetzt:

  1. OpenSSH ist auf dem Linux Client oder Application Server und auf dem Datenbankserver installiert und unterstützt schlüsselbasierte Authentifizierung.
  1. Verwendung des Oracle Client (JDBC/OCI/Thin/...) auf dem Linux Client oder Application Server, um Zugriff auf den Datenbankserver zu erhalten

oder

  1. über Oracle Datenbank Links, um zwei Datenbankserver miteinander zu verbinden

oder

  1. die Verwendung von Oracle Client Dienstprogrammen (DATAPUMP/RMAN/tnsping/...) auf dem Linux Client oder Application Server, um den Datenbankserver über Oracle*Net zu verbinden.

Falls noch nicht vorhanden, müssen zunächst die SSH-Schlüsselpaare generiert werden

Generierung eines SSH-Schlüsselpaares mit ssh-keygen

Auf allen UNIX- und UNIX-ähnlichen Plattformen (einschließlich Solaris und Linux) enthält die OpenSSH Installation das Dienstprogramm ssh-keygen zur Erzeugung von SSH-Schlüsselpaaren.

  1. Navigieren Sie zu Ihrem Home-Verzeichnis und prüfen sie, ob das Verzeichnis .ssh existiert:
[oracle@ol7node5 ~]$ cd $HOME 
[oracle@ol7node5 ~]$ ls -al .ssh
  1. Führen Sie das Dienstprogramm ssh-keygen aus, legen sie mit -t den Keytyp (dsa | ecdsa | ed25519 | rsa) und mit -b die Anzahl der Bits im Key fest:
[oracle@ol7node5 ~]$ ssh-keygen -b 4096 -t rsa

Das Dienstprogramm ssh-keygen fordert Sie nun auf, eine Passphrase für den privaten Schlüssel einzugeben.

  1. Geben Sie eine Passphrase für den privaten Schlüssel ein, oder drücken Sie die Eingabetaste, um einen privaten Schlüssel ohne Passphrase zu erstellen:

Enter passphrase (empty for no passphrase): Passphrase

Hinweis: Eine Passphrase ist nicht erforderlich. Sie sollten aber eine Passphrase als Sicherheitsmaßnahme angeben, um den privaten Schlüssel vor unbefugter Verwendung zu schützen. Wenn Sie eine Passphrase angeben, muss ein Benutzer die Passphrase jedes Mal eingeben, wenn der private Schlüssel verwendet wird!

Das Dienstprogramm ssh-keygen fordert Sie auf, die Passphrase erneut einzugeben.

  1. Geben Sie die Passphrase erneut ein oder drücken Sie erneut die Eingabetaste, um mit der Erstellung eines privaten Schlüssels ohne Passphrase fortzufahren:

Enter the same passphrase again: Passphrase

  1. Das Dienstprogramm ssh-keygen zeigt an, dass der private Schlüssel als id_rsa und der öffentliche Schlüssel als id_rsa.pub im Verzeichnis .ssh angelegt wurden. Es zeigt auch Informationen über den Schlüssel-Fingerabdruck und das Zufallsbild an.

Der public key muss jetzt noch auf den Datenbankserver (ol7node6) kopiert werden mit

[oracle@ol7node5 .ssh]$ scp id_rsa.pub ol7node6:/home/oracle/.ssh

und auf dem Datenbank Server in die authorized_keys Datei kopiert werden

[oracle@ol7node6 .ssh]$ cat id_rsa.pub >> authorized_keys 

in einem nächsten Schritt wird der SSH-Tunnel zum Datenbankserver konfiguriert.

Erstellen eines SSH-Tunnels mit dem ssh-Dienstprogramm unter Linux

Die Linux-Plattform enthält das Dienstprogramm ssh, einen SSH-Client, der SSH-Tunnel unterstützt.

Bevor Sie das Dienstprogramm ssh verwenden, um einen SSH-Tunnel zu erstellen, benötigen Sie folgendes:

  • Die IP-Adresse oder der Name des Datenbankservers
  • Die private SSH-Schlüsseldatei, die sich mit dem öffentlichen Schlüssel paart, der während des Erstellungsprozesses der Datenbankimplementierung verwendet wird.
  • Die Portnummer, für die Sie einen SSH-Tunnel erstellen möchten.

So erstellen Sie einen SSH-Tunnel für einen Port mit dem Dienstprogramm SSH unter Linux:

[oracle@ol7node5 ~]$ ssh -M -S tunnel-socket-name -fnNT -i private-key-file -L local-port:target-host:target-port userid@target-host

wobei:

  • tunnel-socket-name (z.B. ol7node6-tunnel-socket) zur Steuerung der SSH Verbindung.
  • private-key-file (z.B. ~/.ssh/id_rsa) ist der Pfad zur privaten SSH-Schlüsseldatei.
  • local-port (z.B. 21521) ist die Nummer eines verfügbaren Ports auf Ihrem Linux-System. Geben Sie eine Portnummer größer als 1023 und kleiner als 49152 an, um Konflikte mit Ports zu vermeiden, die für das System reserviert sind. Als gute Praxis und der Einfachheit halber sollten Sie die gleiche Portnummer angeben wie diejenige, zu der Sie einen Tunnel erstellen.
  • target-host (z.B. 192.168.56.62) oder Servername (z.B. ol7node6).
  • target-port (z.B. 1521) ist die Portnummer, zu der Sie einen Tunnel erstellen möchten.
  • weitere SSH Optionen siehe man ssh.

In diesem Beispiel sieht das SSH Kommando also wie folgt aus:

[oracle@ol7node5 ~]$ ssh -M -S ol7node6-tunnel-socket -fnNT -i ~/.ssh/id_rsa -L 21521:ol7node6:1521 oracle@ol7node6

Die SSH Verbindung kann über den Socket überprüft und beendet werden:

[oracle@ol7node5 ~]$ ssh -S ol7node6-tunnel-socket -O check oracle@ol7node6 Master running (pid=29312)[oracle@ol7node5 ~]$ ssh -S ol7node6-tunnel-socket -O exit oracle@ol7node6

Wenn Sie sich zum ersten Mal mit dem Zielknoten verbinden, werden Sie vom ssh-Dienstprogramm aufgefordert, den öffentlichen Schlüssel zu bestätigen. Geben Sie als Antwort auf die Aufforderung yes ein.

In einem abschließenden Schritt wird Oracle*Net auf dem Linux Client oder Application Server konfiguriert.

tnsnames.ora auf dem Linux Client oder Application Server konfigurieren

Um die Datenbank DB121S auf dem Datenbankserver ol7node6 über den SSH-Tunnel zu erreichen muss noch die tnsnames.ora auf dem Client oder Applikationsserver wie folgt ergänzt oder angepasst werden:

DB121S =  (DESCRIPTION =    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 21521))    (CONNECT_DATA =      (SERVER = DEDICATED)      (SERVICE_NAME = DB121S.de.oracle.com)    )  )

prüfen mit

[oracle@ol7node5 ~]$ tnsping db121sTNS Ping Utility for Linux: Version 12.1.0.2.0 - Production on 18-DEC-2017 00:10:01Copyright (c) 1997, 2014, Oracle.  All rights reserved.Used parameter files:Used TNSNAMES adapter to resolve the aliasAttempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 21521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = DB121S.de.oracle.com)))OK (10 msec)

Jetzt können sie sich über sqlplus@db121s mit der Datenbank verbinden und der Netzwerkverkehr wird durch das ssh auf der Client-Seite verschlüsselt und durch das ssh auf der Server-Seite wieder entschlüsselt.

Die Verbindung funktioniert, solange wie die SSH-Tunnelverbindung besteht. Falls diese SSH-Tunnelverbindung dauerhaft zur Verfügung stehen soll, müsste sie noch entsprechend abgesichert werden, z.B. durch autossh und durch automatischen Start beim reboot des Clients oder Applikationsservers.

Einige Werkzeuge, wie Oracle SQL Developer oder MobaXterm unterstützen SSH-Tunnels in der Benutzeroberfläche des Werkzeuges.

Zurück

Einen Kommentar schreiben