===== 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