===== 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. {{ :dba:oracle_connection_manager_v01.png?600 | Oracle Connection Manager als Proxy zwischen verschiedenen Netzen}} Leider unterstützt der Connection Manager ab der Version 10 das TCPS (SSL über SQL*Net siehe [[dba:sql_net_ssl|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 {{ :dba:cman:cman_process_architectur_v01.png?600 |Oracle Connection Manager Process Overview}} 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 * Download hier => [[http://www.oracle.com/technetwork/database/enterprise-edition/downloads/database12c-linux-download-1959253.html|linuxamd64_12c_client.zip (64-bit) (912,923,006 bytes) (cksum - 1620565981)]] * 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 === Mit dem Oracle Connection Manager IMMER auch die Oracle Listener Komponente bei der Installation auswählen! 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 => [[linux:oracle_linux_basis_konfiguration_datenbank|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: ^Screenshot^task^ | {{ :dba:cman:oracle_cman_12c_installation_v01.png?400 |Installation CMAn}} | Installation starten - Custom auswählen - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v02.png?400 |Installation CMAn}} | Skip Software update - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v03.png?400 |Installation CMAn}} | Sprache auswählen - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v04.png?400 |Installation CMAn}} | Oracle Base und Oracle Home auswählen - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v05.png?400 |Installation CMAn}} | Oracle Inventory bestätigen - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v06.png?400 |Installation CMAn}} | Notwendige Komponenten auswählen: **\\SQL*Plus\\Oracle Connection Manager\\Oracle Net\\Oracle Listner\\** - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v07.png?400 |Installation CMAn}} | Vorrausetzungen werden geprüft - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v08.png?400 |Installation CMAn}} | Zusammenfassung - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v09.png?400 |Installation CMAn}} | Installation läuft - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v09_02.png?400 |Installation CMAN}}| Oracle Net Config Agent mit "Perform Typical" - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v10.png?400 |Installation CMAn}} | OraInventory UND Oracle Home Root Script ausführen! **/opt/oraInventory/orainstRoot.sh**\\und\\**/opt/oracle/product/12.1.0/client_1/root.sh** - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v12.png?400 |Installation CMAn}} | Root Script als root ausführen - weiter | | {{ :dba:cman:oracle_cman_12c_installation_v13.png?400 |Installation CMAn}} | Installation abschließen - finish | 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 " 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 [[http://www.heise.de/netze/tools/netzwerkrechner/| 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 => [[dba:sql_net_security|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: #!/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** * http://docs.oracle.com/cd/E11882_01/network.112/e10836/cman.htm#NETAG011 **cmctl** * http://docs.oracle.com/cd/E16655_01/network.121/e17611/cmctl.htm#NETRF002 ===Web=== * [[http://www.google.de/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCIQFjAA&url=http%3A%2F%2Fioug.itconvergence.com%2Fpls%2Fapex%2FDOOUG.download_my_file%3Fp_file%3D401.&ei=216wU4vHLuaV7AbOqIHQCw&usg=AFQjCNFgz2YbMZM0cXPG7RNYELUCdN5yFA&bvm=bv.69837884,d.ZGU|Deploying an Oracle Connection Manager von Peter Magee]] * http://www.oaktable.net/content/setting-oracle-connection-manager