Auswahl  

Konfigurieren und Nutzen des Oracle Connection Managers 

Oracle
DBA
RDBMS 11.2:RDBMS 12.x:RDBMS 18.3:RDBMS 19.3
21.09.20 (MM)
21.09.20
DBA, Netzwerk, Security

Passende Schulungen zum Thema

Immer wieder taucht folgendes Problem in der Praxis auf:

ein Oracle Client soll sich an einer Oracle Instanz anmelden, jedoch befinden sich der Client-Rechner und der DB-Server in unterschiedlichen TCP/IP-Netzen.
Alternativ kann das Problem auch durch Firewalls verursacht werden, die den direkten Zugriff unterbinden.

Die Lösung für dieses Problem lautet: Connection Manager (CMAN).

Der Connection Manager ist kein eigenes Produkt, sondern lediglich eine Option, die über die Oracle Client Software separat zu installieren ist (siehe Hinweise am Ende des Artikels). Der CMAN agiert als Proxy, der die Verbindungsanfrage eines Clients entgegennimmt und an den DB-Server weiterreicht. Er übernimmt somit Netzwerk-Routing Funktionalitäten.
Zur Nutzung des CMAN ist leider die Oracle EE Edition erforderlich.

Für ein konkretes Beispiel aus der Praxis gehen wir von folgender Situation aus:
Auf einem ersten Rechner (CL1) läuft der Client-Prozess, der sich mit mit der Datenbank, die auf einem zweiten Rechner (DB1) installiert ist, verbinden möchte. Auf einem dritten Rechner (CM1) ist der Connection Manager konfiguriert und gestartet. CL1 und DB1 befinden sich in unterschiedlichen Netzen und können sich nicht direkt erreichen. CM1 besitzt zwei Netzwerkkarten und kann sowohl mit CL1 wie auch mit DB1 kommunizieren.

Konfiguration des Connection Managers

Beginnen wir mit der Erstellung einer Konfigurationsdatei auf CM1. Diese Datei heißt CMAN.ORA und wird im $ORACLE_HOME/network/admin-Verzeichnis abgelegt.

# Beispiel für CMAN.ORA, der Alias-Name ist frei wählbar, hier lautet er CMAN_CM1.
# Der Port ist prinzipiell auch frei wählbar, muss aber natürlich in der Firwall vor CM1 freigeschaltet sein.
# Als Vorlage kann auch die CMAN.ORA-Datei aus $ORACLE_HOME/network/admin/samples verwendet und angepasst werden.

cman_cm1 =
(configuration=
  (address=(protocol=tcp)(host=cm1)(port=2020)) # Listener-Adresse des CMAN
  (parameter_list =                    # CMAN Konfigurationsparameter
    (aso_authentication_filter=off)      # Authentifizierung erforderlich - Mögliche Werte: on|off
    (connection_statistics=yes)          # sammelt Verbindungsstatistiken - Mögliche Werte: on|off
    (log_directory=/u01/app/oracle/diag/netcman/cm1/cman_cm1/alert)    # Verzeichnis für Logdateien
    (log_level=off)                      # Level des Loggings - Mögliche Werte: OFF | USER | ADMIN | SUPPORT
    (max_connections=256)                # Max. Anzahl an Verbindungen je Gateway-Prozess - Mögliche Werte: beliebige positive Zahl
    (idle_timeout=0)                     # Wert für Leerlauf Timeout in Sek - Mögliche Werte: beliebige positive Zahl
    (inbound_connect_timeout=0)          # Inbound Connect Timeout in Sek - Mögliche Werte: beliebige positive Zahl
    (session_timeout=0)                  # Session Timout in Sek - Mögliche Werte: beliebige positive Zahl
    (outbound_connect_timeout=0)         # Outbound Connect Timeout in Sek - Mögliche Werte: beliebige positive Zahl
    (max_gateway_processes=16)           # Max. Anzahl an gestarteten Gateway-Prozessen - Mögliche Werte: beliebige positive Zahl
    (min_gateway_processes=2)            # Mindestanzahl an verfügbaren Gateway-Prozessen - Mögliche Werte: beliebige positive Zahl
    (remote_admin=on)                    # Remote administration erlaubt - Mögliche Werte: on|off
    (trace_directory=/u01/app/oracle/diag/netcman/cm1/cman_cm1/trace)    # Verzeichnis für Tracedateien
    (trace_level=off)                    # Level des Tracings - Mögliche Werte: OFF | USER | ADMIN | SUPPORT
    (trace_timestamp=off)                # Zeitangabe beim Tracing - Mögliche Werte: Boolean values for on/off
    (trace_filelen=1000)                 # Länge der Tracedateien in KB - Mögliche Werte: beliebige positive Zahl
    (trace_fileno=1)                     # Nummer der Tracedatei beim zyklischen Tracing - Mögliche Werte: beliebige positive Zahl
    (max_cmctl_sessions=4)               # Max. Anzahl an gleichzeitigen CMCTL-Sessions - Mögliche Werte: beliebige positive Zahl
    (event_group=init_and_term,memory_ops)    # Event Logging: Event Gruppen, die mitprotokolliert werden sollen
  )
  (rule_list=            # Regelliste
    (rule=                 # Regel-Beschreibung
       (src=*)               # src = Quelle, Hostname oder IP des Clients - '*' für Alle, Subnetzangaben möglich 162.0.2.82/24
       (dst=*)               # dst = Ziel, Hostname oder IP des DB-Servers - '*' für Alle, Subnetzangaben möglich 162.0.2.82/24
       (srv=*)               # srv = SERVICE_NAME der Verbindung - '*' für Alle
       (act=accept)          # act = Action: 'accept', 'reject' oder 'drop'
       (action_list=         # Action List Specification:
         (aut=off)             # aut         = aso_authentication_filter
         (moct=0)              # moct        = outbound_connect_timeout
         (mct=0)               # mct         = session_timeout
         (mit=0)               # mit         = idle_timeout
         (conn_stats=on))      # conn_stats  = connect_statistics
    )
  )
)


Ebenfalls sollte die LISTENER.ORA-Datei auf CM1 passend zur CMAN.ORA angepasst werden

# Beispiel für LISTENER.ORA
cman_cm1 =
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = cm1)(PORT = 2020)))


Nun geht es an das Starten des Connection Managers auf CM1. Wechseln Sie dazu in das $ORACLE_HOME/bin-Verzeichnis ihrer Client-Installation und rufen Sie das Tool cmctl auf.

[oracle@cm1 bin]$ cmctl
/*
CMCTL for Linux: Version 19.0.0.0.0 - Production on 18-SEP-2020 09:58:50
Copyright (c) 1996, 2019, Oracle.  All rights reserved.
Welcome to CMCTL, type "help" for information.
*/


Beginnen Sie Ihre CMCTL-Session immer mit dem ADMINISTER-Kommando

CMCTL> administer
/*
Current instance CMAN_CM1 is not yet started
Connections refer to (DESCRIPTION=(address=(protocol=tcp)(host=cm1)(port=2020))).
The command completed successfully.
*/


Jetzt werden die notwendigen Prozesse für den Connection Manager erzeugt und gestartet

CMCTL:CMAN_cm1> startup
/*
Starting Oracle Connection Manager instance CMAN_CM1. Please wait...
CMAN for Linux: Version 19.0.0.0.0 - Production
Status of the Instance
----------------------
Instance name             cman_cm1
Version                   CMAN for Linux: Version 19.0.0.0.0 - Production
Start date                18-SEP-2020 09:59:22
Uptime                    0 days 0 hr. 0 min. 9 sec
Num of gateways started   2
Average Load level        0
Log Level                 OFF
Trace Level               OFF
Instance Config file      /u01/app/oracle/product/19.3.0/client_1/network/admin/cman.ora
Instance Log directory    /u01/app/oracle/diag/netcman/cm1/cman_cm1/alert
Instance Trace directory  /u01/app/oracle/diag/netcman/cm1/cman_cm1/trace
The command completed successfully.
*/


Hier die Liste der gestarteten ora-Prozesse unter Linux.

[oracle@cm1 bin]$ ps -ef | grep ora
/*
...
oracle   13798     1  0 09:59 ?        00:00:00 /u01/app/oracle/product/19.3.0/client_1/bin/cmadmin CMAN_cm1 -inherit
oracle   13802     1  0 09:59 ?        00:00:00 /u01/app/oracle/product/19.3.0/client_1/bin/tnslsnr ifile=/u01/app/oracle/product/ 19.3.0/client_1/network/admin/cman.ora cman_cm1 -inherit -mode proxy
oracle   13805     1  0 09:59 ?        00:00:00 /u01/app/oracle/product/19.3.0/client_1/bin/cmgw cmgw0 0 16 cman_cm1 SNLSM:d5868000
oracle   13807     1  0 09:59 ?        00:00:00 /u01/app/oracle/product/19.3.0/client_1/bin/cmgw cmgw1 1 16 cman_cm1 SNLSM:d5868000
...
*/


Wie aus der Liste zu entnehmen ist, werden drei verschiedene Typen von Prozessen gestartet:

  • Der Connection Manager Admin Prozess (cmadmin): steuert den Listener und die Gateway-Prozesse

  • Der Listener-Prozess (tnslsnr): nimmt den Request der Clients entgegen

  • Ein oder mehrere Gateway-Prozesse (cmgw<n>): ermöglichen das Weiterreichen der Client-Verbindungsanfragen

Hinweis: Die Gateway-Prozesse sind unter Windows nicht sichtbar.
 
Empfehlenswert ist auch die Status-Abfrage des Listeners CMAN_CM1

[oracle@cm1 trace]$ lsnrctl status cman_cm1
/*
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 18-SEP-2020 10:50:29
Copyright (c) 1991, 2019, Oracle.  All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=cm1)(PORT=2020)))
STATUS of the LISTENER
------------------------
Alias                     cman_cm1
Version                   TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date                18-SEP-2020 09:59:22
Uptime                    0 days 0 hr. 51 min. 7 sec
Trace Level               off
Security                  OFF
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/product/19.3.0/client_1/network/admin/cman.ora
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=172.30.30.48)(PORT=2020)))
Services Summary...
Proxy service "cmgw" has 1 instance(s).
  Instance "cman", status READY, has 2 handler(s) for this service...
Service "cmon" has 1 instance(s).
  Instance "cman", status READY, has 1 handler(s) for this service...
The command completed successfully
*/


Nachdem die Konfiguration der CM-Prozesse erfolgt ist, muss die TNSNAMES.ORA auf Client-Seite (hier: CL1) noch angepasst werden.

# Der Alias (hier: CM_DB1) ist natürlich wieder frei wählbar
CM_DB1 =
  (DESCRIPTION =
    (SOURCE_ROUTE = ON)
    (ADDRESS = (PROTOCOL = TCP)(HOST = CM1)(PORT = 2020))
    (ADDRESS = (PROTOCOL = TCP)(HOST = DB1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVICE_NAME=testdb)
    )
  )


Die Angabe von SOURCE_ROUTE = ON ist dabei von wesentlicher Bedeutung, da auf die Art gewährleistet wird, dass die Adressliste der Reihe nach durchlaufen wird.
Somit zeigt die erste Adresse auf den Listener des Connection Managers
    (ADDRESS = (PROTOCOL = TCP)(HOST = CM1)(PORT = 2020))
und die zweite Adresse gibt an, wohin die Verbindungsanfrage geroutet werden soll
    (ADDRESS = (PROTOCOL = TCP)(HOST = DB1)(PORT = 1521))
Der Rechner CM1 übernimmt damit den Request der Verbindung beim Datenbankserver DB1 und nicht mehr Clientrechner CL1.

Zu guter Letzt fehlt noch der Verbindungstest vom Client CL1 aus:

sqlplus scott@cm_db1
-- Connected.


Noch ein paar Hinweise zum Thema

Die Client-Installation für die Version 19c erfolgt unter Linux über die Datei LINUX.X64_193000_client.zip. Wählen Sie dabei den Typ "Benutzerdefiniert" aus.
Folgende Komponenten müssen Sie installieren:
Oracle Net, Oracle Connection Manager, Oracle Net Listener. Optional: SQL*Plus und Oracle Advanced Security.
 
Laut MOS Doc Id 1195833.1 unterstützt der Connection Manager ab der Version 10 das TCPS Protokoll nicht mehr (SSL über SQL*Net). Damit entfällt die Möglichkeit per Zertifikats-Autorisierung den Zugriff auf Datenbanken einzuschränken.

Machen Sie sich bewusst, dass die Basis-Konfiguration des Connection Managers ohne konkrete Regelangabe den Clients Tür und Tor für den Zugriff auf eine Datenbank öffnet.
Sie sollten sich daher aus Sicherheitsgründen eine eigens definierte Regelliste erstellen.
Hier ein Beispiel für eine spezielle RULE_LIST, bei der dem Rechner CL1 explizit der Zugriff auf den Service testdb erlaubt ist, dem Rechner CL2 allerdings der Zugriff auf Service proddb untersagt bleibt:

(rule_list=
    (rule=
      (src=CL2)(dst=DB1)(srv=proddb)(act=reject)
    )
    (rule=
      (src=CL1)(dst=DB1)(srv=testdb)(act=accept)
    )
  )  

 
Ebenso können Sie über das Setzen eines Passworts den Zugriff über cmctl sicherer machen.

CMCTL> administer
/*
Current instance CMAN_cm1 is already started
Connections refer to (DESCRIPTION=(address=(protocol=tcp)(host=cm1)(port=2020))).
The command completed successfully.
*/

CMCTL:CMAN_cm1> set password
/*
Enter Old password:
Enter New password:
Reenter New password:
The command completed successfully.
*/

CMCTL:CMAN_cm1> save_passwd
-- The command completed successfully.


Die CMAN.ORA-Datei wird dabei ergänzt

#----ADDED BY CMAN 18-SEP-2020 13:35:27---
password_cman_cm1 = B7FFF4C58F2080BB
#-----------------------------------------


Ab dem nächsten Aufruf von cmctl werden Sie nun das Passwort abgefragt.

CMCTL> administer
/*
Enter CMAN Password:
Current instance CMAN_orcl-8 is already started
Connections refer to (DESCRIPTION=(address=(protocol=tcp)(host=cm1)(port=2020))).
The command completed successfully.
*/


Die CM-Prozesse lassen sich über cmctl mittels SHUTDOWN beenden. Allerdings werden diese erst wirklich beendet, wenn die letzte Verbindung über den Connection Manager beendet worden ist. Neuanmeldungen sind nach dem SHUTDOWN nicht mehr möglich.

Weitere Interessante Kurs-Tipps zum Thema

Besuchen Sie uns doch bei einer unsere über 50 Oracle Schulungen in München - Unterhaching, oder verfolgen Sie die Training per Videostreaming bequem vom Home Office oder Büro aus.