Inhaltsverzeichnis
SQL*Net Proxy und Firewall mit dem 12c CMAN, dem Oracle Connection Manager implementieren
Mit dem Oracle Connection Manager, dem Cman, kann das SQL*Net Protokoll über einen Rechner zwischen verschiedenem Netzwerk„geroutet“ werden.
Der Cman ist bereits sehr lange Bestandteil der Oracle Installation, heute kann das der CMan in der Oracle Client Installation gefunden werden. Ursprünglich war einer der Haupteinsatz Zwecke das Routen zwischen verschiedenen Netzwerk Protokollen, zum Beispiel in einer SPX/IPX Welt nach TCP/IP.
Heute ist der CMan sehr praktisch um Proxy Funktionalitäten zwischen verschiedenen TCP/IP Netzen zu realisieren.
Leider unterstützt der Connection Manager ab der Version 10 das TCPS (SSL über SQL*Net siehe SSL - Secure Sockets Layer - für SQL*Net aktivieren) Protokoll nicht mehr!(siehe auch TCPS Support in Connection Manager (Doc ID 1195833.1) )
Damit entfällt leider ein interessanter Einsatzzweck, per Zertifikats Autorisierung den Zugriff auf Datenbanken einzuschränken.
Test einer Sway Präsentation zu diesem Thema ⇒ https://sway.com/qD3FgMoEBZkBu7oY
Die vollständige Präsentation finden Sie hier ⇒ http://www.pipperr.de/knowhow/cman/oracle_connection_manager_cman.html oder auf Slideshare.
[slideshare id=51535647&doc=oracleconnectionmanagercmandoagsigsecuritymai2015-150812085850-lva1-app6891]
Lizenz Überlegungen
Leider ist der Oracle Connection Manager nur zusammen mit der Oracle EE Edition verfügbar, siehe für 12c hier ⇒ http://docs.oracle.com/database/121/DBLIC/editions.htm#DBLIC116
Architektur
- Bündelt SQL*Net-Verbindungen
- Erweiterte Sicherheitsüberprüfungen
- Protokoll-Wandlung (TCP/IP –> SPX/IPX )
- Firewall-Architektur
Der Oracle Connection Manager wird über den cmctl gestartet, dieses Control Utility startet zuerst den Prozess cmadmin, dieser Prozess steuert den Listener und die Gateway Prozesse für das SQL*Net Routing.
Installation unter Linux 64bit
Ablauf:
- Installationspacket für den Oracle Client auswählen und herunterladen
- Client Software inkl. Cman installieren
- Client Software mit letzten Patch ausstatten
- Patch 18031528: DATABASE PATCH SET UPDATE 12.1.0.1.3 (Apr 2014) bzw. höher vom Support Portal laden (alternativ Oracle Grid Infrastructure System Patch - 18139660 )
- OPatch Patch - Patch 6880880: OPatch patch of version 12.1.0.1.2 for Oracle software releases 12.1.0.x (OCT 2013)
- Connection Manager konfigurieren und starten
Client mit Oracle Connection Manager installieren
Oracle User auf dem System anlegen und Oracle Base Verzeichnis anlegen.
Im Prinzip kann die Client Installation auch gleich einer Basis Oracle Installation durchgeführt werden, siehe ⇒ Eine Oracle Linux 6 Umgebung für eine Oracle Installation vorbereiten
Als User root das Oracle Basisverzeichnis anlegen:
mkdir -p /opt/oracle chown oracle:oinstall /opt/oracle mkdir -p /opt/oraInventory chown oracle:oinstall /opt/oraInventory/
Installationsquelle als User Oracle nach /home/oracle/install kopieren, auspacken und installieren.
Als User oracle:
# installationsverzeichnis mkdir /home/oracle/install # Testen ob die Checksum des Installationpackets auch stimmt! # laut Oracle Website - 1620565981 cksum linuxamd64_12c_client.zip 1620565981 912923006 linuxamd64_12c_client.zip # Auspacken unzip linuxamd64_12c_client.zip # Installation starten cd client ./runInstaller
Installation durchführen:
Mit dem letzten Patch versehen
Patch „18031528: DATABASE PATCH SET UPDATE 12.1.0.1.3 (Jun 2014)“ und „OPatch Patch - Patch 6880880: OPatch patch of version 12.1.0.1.2 for Oracle software releases 12.1.0.x (OCT 2013)“ auf den Server kopieren.
# Altes Opatch Sichern mv /opt/oracle/product/12.1.0/client_1/OPatch /opt/oracle/product/12.1.0/client_1/OPatch_OLD #Neu auspacken unzip p6880880_121010_Linux-x86-64.zip -d /opt/oracle/product/12.1.0/client_1 #test mit: /opt/oracle/product/12.1.0/client_1/OPatch/opatch version OPatch Version: 12.1.0.1.2 #Patch auspacken: unzip p18031528_121010_Linux-x86-64_database.zip export ORACLE_HOME=/opt/oracle/product/12.1.0/client_1 cd ./18031528 /opt/oracle/product/12.1.0/client_1/OPatch/opatch apply .... You have not provided an email address for notification of security issues. Do you wish to remain uninformed of security issues ([Y]es, [N]o) [N]: Y ... Is the local system ready for patching? [y|n] y ... #Testen mit: /opt/oracle/product/12.1.0/client_1/OPatch/opatch lsinventory ... Patch 18031528 : applied on Sun Jun 29 16:33:28 CEST 2014 Unique Patch ID: 17262469.1 Patch description: "Database Patch Set Update : 12.1.0.1.3 (18031528)" ....
Umgebung des Users einrichten:
vi .bashrc export ORACLE_HOME=/opt/oracle/product/12.1.0/client_1 export PATH=$ORACLE_HOME/bin:$PATH . .bashrc
Oracle Connection Manager Konfiguration
Konfiguration erstellen
Die Konfiguration erfolgt über die Datei $ORACLE_HOME/network/admin/cman.ora.
Erste Start Konfiguration (siehe Support Node - Doc ID 733421.1) erstellen:
cman_gpi = (configuration= (address=(protocol=tcp)(host=oradb12c01.pipperr.local)(port=1999)) (parameter_list = (aso_authentication_filter=off) (connection_statistics=yes) (log_level=admin) (max_connections=256) (idle_timeout=0) (inbound_connect_timeout=10) (session_timeout=0) (outbound_connect_timeout=0) (max_gateway_processes=16) (min_gateway_processes=2) (remote_admin=on) (trace_level=off) (trace_timestamp=off) (trace_filelen=1000) (trace_fileno=1) (max_cmctl_sessions=4) (event_group=init_and_term,memory_ops) ) (rule_list= (rule= (src=*)(dst=*)(srv=*)(act=accept) (action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on)) ) ) )
Starten
Das administrative Utility ist das Programm cmctl. Nach dem Start des cmctl muss sich mit dem „administer <cman_name>“ an den Connection Manager angemeldet werden.
Start:
cd $ORACLE_HOME/bin ./cmctl CMCTL> administer cman_gpi Current instance cman_gpi is not yet started Connections refer to (address=(protocol=tcp)(host=oradb12c01.pipperr.local)(port=1999)). The command completed successfully. CMCTL:cman_gpi> startup Starting Oracle Connection Manager instance cman_gpi. Please wait... TNS-04077: WARNING: No password set for the Oracle Connection Manager instance. CMAN for Linux: Version 12.1.0.1.0 - Production Status of the Instance ---------------------- Instance name cman_gpi Version CMAN for Linux: Version 12.1.0.1.0 - Production Start date 29-JUN-2014 20:29:16 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 /opt/oracle/product/12.1.0/client_1/network/admin/cman.ora Instance Log directory /opt/oracle/diag/netcman/oradb12c01/cman_gpi/alert Instance Trace directory /opt/oracle/diag/netcman/oradb12c01/cman_gpi/trace The command completed successfully.
Nach dem Start kann das Logfile unter $ORACLE_BASE/diag/netcman/ eingesehen werden.
Über die PS Liste kann auch geprüft werden ob alle Connection Manager Prozesse auch laufen:
$ ps uafx | grep cm .. /opt/oracle/product/12.1.0/client_1/bin/cmadmin cman_gpi -inherit .. /opt/oracle/product/12.1.0/client_1/bin/tnslsnr ifile=/opt/oracle/product/12.1.0/client_1/network/admin/cman.ora cman_gpi -inherit -mode proxy .. /opt/oracle/product/12.1.0/client_1/bin/cmgw cmgw0 0 16 cman_gpi SNLSM:99224000 .. /opt/oracle/product/12.1.0/client_1/bin/cmgw cmgw1 1 16 cman_gpi SNLSM:99224000
Test mit der Start Konfiguration
Mit der obigen Start cman.ora arbeitet der Connection Manager ohne Einschränkungen.
Erster Test mit folgenden tnsnames.ora Eintrag:
cman_gpi_db= (DESCRIPTION = (SOURCE_ROUTE = YES) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.178.110 )(PORT = 1999) ) (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.178.57)(PORT = 1521) ) (CONNECT_DATA = (SERVICE_NAME=GPI) ) )
Der Schlüssel zu diesem Eintrag ist der Parameter SOURCE_ROUTE, die Verbindung erfolgt zuerst an den CMan, der weiß dann über den zweiten ADRESS Eintrag wo hin die Verbindung geleitet werden soll.
Konfiguration "härten"
In der einfachen Basis Konfiguration darf jeder sich mit dem Connection Manager verbinden und wird je nach tnsnames Eintrag einfach weitergeleitet.
Access Rules einstellen
Nach folgenden Muster können die Regeln eingestellt werden:
(RULE_LIST= (RULE= (SRC=host) (DST=host) (SRV=service_name) (ACT={accept|reject|drop}) (ACTION_LIST=AUT={on|off} ((CONN_STATS={yes|no})(MCT=time)(MIT=time)(MOCT=time))) (RULE= ...))
Parameter | Beschreibung |
---|---|
SRC | Quelle, kann als IP Subnet mit / Notation angegeben werden wie 192.168.178.0/24 (siehe zum Beispiel für die CIDR-Suffix den Heise online Rechner |
DST | Ziel, angabe wie Quelle |
SRV | Oracle Service Name |
ACT | accept, reject, oder drop der Verbindung |
ACTION_LIST: The rule-level parameter settings for some parameters.
Parameter:
- AUT: Oracle Database security authentication on client side.
- CONN_STATS: Log input and output statistics.
- MCT: Maximum connect time.
- MIT: Maximum idle timeout.
- MOCT: Maximum outbound connect time.
siehe auch http://docs.oracle.com/cd/E16655_01/network.121/e17611/cman.htm#NETRF337
Wenn die Default Rule angepasst wird, muss die lokale Regel für den Connection des cmctl auf den Connction Manager hinterlegt werden
(rule_list= (rule= (src=oradb12c01.pipperr.local) (dst=127.0.0.1) (srv=cmon) (act=accept) ) )
Beispiel:
(RULE_LIST= (RULE=(SRC=192.168.178.0/8) (DST=192.168.188.56) (SRV=GPI_DATA) (ACT=accept) ) )
Password setzen
Das Password kann nicht direkt in der „cman.ora“ hinterlegt werden, sondern wird im „cmctl“ Utiltiy gesetzt und dann verschlüsselt in der „cman.ora“ gespeichert.
cmctl CMCTL> administer cman_gpi CMCTL:cman_gpi> startup .. TNS-04077: WARNING: No password set for the Oracle Connection Manager instance. .. CMCTL:cman_gpi> set password Enter Old password: Enter New password: Reenter New password: The command completed successfully. CMCTL:cman_gpi> save_passwd The command completed successfully. # Was wird erzeugt cat cman.ora #----ADDED BY CMAN 18-MAY-2015 09:29:34--- password_cman_gpi = 10D34223DA9F8D28 #-
Beim nächsten Anmelden wird nach dem Passwort gefragt
SQL*Net Verschlüsselung
Die Parametrisierung der symmetrischen SQL*Net Protokol Verschlüsselung ( siehe ⇒ Das SQL*Net Protokoll mit einer symmetrischen Verschlüsselung wie DES / AES oder RC4 schützen findet nur auf dem Client und auf dem Server statt!
Auf dem CMAN muss dazu nichts konfiguriert werden!
siehe auch Dokument ⇒ „ORA-12564 when using native encryption settings in sqlnet.ora on CMAN server (Doc ID 1538702.1)“
Weitere Härtungsmaßnahmen für die Umgebung
Nur noch die Verbindung an den Datenbank Listener über den Connection Manager zulassen:
sqlnet.ora des Oracle DB Listeners anpassen:
#Prüfung aktivieren TCP.VALIDNODE_CHECKING=YES #Nur noch diese Liste von Hosts zulassen TCP.INVITED_NODES=(192.168.178.110)
Probleme
TNS-04012: Unable to start Oracle Connection Manager instance
CMCTL:cman1> startup
TNS-04012: Unable to start Oracle Connection Manager instance.
Der TNS-04012 sagt leider wenig aus, in meine Fall war die cman.ora fehlerhaft!
Oracle Support:
- 733421.1 Troubleshooting Guide: TNS-04012: Unable to Start Oracle Connection Manager Instance
Fehler **TNS-04011: Oracle Connection Manager instance not yet started.**
Nach dem Start des Connection Manager kann mit cmctl die Verwaltung nicht mehr durchgeführt werden.
Fehler:
CMCTL> administer cman_pb Current instance cman_pb is not yet started Connections refer to (address=(protocol=tcp)(host=oradb12c01.pipperr.local)(port=1999)). The command completed successfully. CMCTL:cman_pb> show all TNS-04011: Oracle Connection Manager instance not yet started.
Lösung:
In meiner Umgebung war die Rule bzgl. Connect auf sich selbst fehlerhaft. Wird mit Rules gearbeitet, muss eine Regel aufgenommen werden, das der locale Client mit dem Connection Manager Admin Prozess kommunizieren darf.
Regel:
(rule=(src=oradb12c01.pipperr.local)(dst=127.0.0.1)(srv=cmon)(act=accept)) (rule=(src=oradb12c01.pipperr.local)(dst=*)(srv=cmon)(act=accept))
??Warum reicht nicht nur die localhost rule?? Sehr seltsam …..
Auto Start einrichten
Als user root folgende Datei nach /etc/init.d/oraConnectionManager kopieren und „aktivieren“.
/etc/init.d/oraConnectionManager:
- oraConnectionManager
#!/bin/bash # # Run-level Startup script OracleConnectionManager # # chkconfig: 2345 08 92 # description: Starts, stops Oracle Connection Manager # # ### BEGIN INIT INFO # Provides: OracleConnectionManager # Required-Start: # Required-Stop: # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop OracleConnectionManager # Description: Start, stop and save OracleConnectionManager ### END INIT INFO # Source function library. . /etc/init.d/functions ORACLE_USER=oracle ORACLE_HOME=/opt/oracle/product/12.1.0/client_1 ORACLE_CMAN_NAME=cman_gpi_db #Start or stop the Oracle NoSQL Node case "$1" in start) # Oracle Connection Manager start echo -n "Starting Oracle Connection Manager: " su - $ORACLE_USER -c "export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} startup exit EOScipt" echo "OK" ;; stop) # Oracle Oracle Connection Manager shutdown echo -n "Shutdown Oracle Connection Manager: " su - $ORACLE_USER -c "export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} shutdown exit EOScipt" echo "OK" ;; status) # status echo -n "Status Oracle Connection Manager: " su - $ORACLE_USER -c "export ORACLE_HOME=$ORACLE_HOME; $ORACLE_HOME/bin/cmctl << EOScipt administer ${ORACLE_CMAN_NAME} show all exit EOScipt" ;; reload|restart) $0 stop $0 start ;; *) echo "Usage: $0 start|stop|restart|reload|status" exit 1 esac exit 0
Start Script einrichten:
# datei nach /etc/init.d/oraConnectionManager # rechte chmod 777 /etc/init.d/oraConnectionManager # chkconfig --add oraConnectionManager # chkconfig | grep oraConnectionManager
Datenbank am Connection Manager als Service anmelden
Remote Listner in Target Database
In der Single Target DB anmelden und Remote Listener setzen
ALTER system SET remote_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=oradb12c01.pipperr.local)(PORT = 1999))' scope=BOTH;
In einer Oracle RAC Cluster Konfiguration mit Scan Listener muss ein TNS Eintrag für den Remote Listener Parameter erstellt werden, in dem alle Scan Listener IP Adressen UND der Oracle Connection Manager aufgeführt ist.
Siehe auch Doc ID 1375897.1
Im cmctl kontrollieren
CMCTL:cman_gp> show service ... (ADDRESS=(PROTOCOL=tcp)(HOST=::1)(PORT=9116)) Service "xe" has 1 instance(s). Instance "xe", status READY, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:2 refused:0 state:ready REMOTE SERVER (ADDRESS=(PROTOCOL=TCP)(HOST=GPILOCALHOST)(PORT=1521)) ....
TNS Eintrag auf dem Client
cman_gpi_XE= (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST=oradb12c01.pipperr.local)(PORT = 1999) ) (CONNECT_DATA = (SERVICE_NAME=XE) ) )
Test mit tnsping und sqlplus.
Siehe auch:
- Force Connections to a Specific Database Service When two Identical Services are Registered to CMAN (Doc ID 1455068.1) - wird über eine Rule abgewickelt
Quellen
Oracle
Support
- A Guide to CMAN Configuration for 10g and Newer Releases (Doc ID 298916.1)
- Integrating Connection Manager (CMAN) into a RAC+SCAN Environment (Doc ID 1556300.1)
- ORA-12564 when using native encryption settings in sqlnet.ora on CMAN server (Doc ID 1538702.1)
Overview
cmctl