Inhaltsverzeichnis
Oracle 21c -Der CMAN,Oracle Connection Manager, im Traffic Director Mode (TDM)
Zur Grundinstallation des CMAN siehe ⇒ Oracle 21c - SQL*Net Proxy und Firewall mit dem Oracle Connection Manager CMAN implementieren - Einsatz als Standby DB Proxy für ältere Java Apps
CMAN Standard <=> Traffic Director Mode (TDM)
CMAN Klassisch ⇒ SQL*Net Proxy ⇒ Leitet Anfrage weiter indem die Anfrage über den CMAN getunnelt wird.
Traffic Director Mode TDM ⇒ SQL*Net Endpunkt für das Connection Pooling ⇒ Verwaltet eigene Verbindung zur Datenbank
Siehe auch Connection Pooling mit der 11g ⇒ Database Resident Connection Pooling (DRCP)
Einsatzzweck
Ideal als Proxy für die Datenbank in der Cloud für Client Server Architekturen
Konfigurieren
- TDM User in der DB anlegen
- Muss das Connect Recht explizit besitzen!
- CMAN Server als Remote Listener in der Ziel Datenbank anlegen
- CMAN Konfigurieren
- TDM Parameter einstellen
- Wallet für den Connect zur DB hinterlegen
- Client Konfigurieren
User in der Zieldatenbank
Proxy User für den Connect Through anlegen:
CREATE USER cman_tdm IDENTIFIED BY "SecretPWD2023"; GRANT CONNECT TO cman_tdm;
Applications-User anlegen und berechtigen:
CREATE USER gpipperr IDENTIFIED BY "GanzAnderesPWD2023"; GRANT CONNECT,resource TO gpipperr ; GRANT UNLIMITED TABLESPACE TO gpipperr ; -- ALTER USER gpipperr GRANT CONNECT through cman_tdm ;
Testen (Password ist das PWD vom User C:
sqlplus cman_tdm[gpipperr]@CMAN2_GPIDB23c
Hier über eine TNS Alias der bereits auf den CMAN zeigt und die Session für den Anwender tunnelt, siehe CMAN Grundlagen Artikel.
Datenbank registieren
In meinen Fall hat der CMAN die IP-Adresse 10.10.10.96.
Als sys / as sysdba ab der CDB anmelden:
ALTER system SET remote_listener='(ADDRESS=(PROTOCOL=tcp)(HOST=10.10.10.96)(PORT = 1999))' scope=BOTH; -- neu anmelden mit: ALTER system register;
Wallet mit dem User Credentials anlegen
mkstore -createCredential <DB Service Name> <DB Proxy User> <DB Proxy User’s Password>
mkdir /opt/oracle/wallet # Wallet anlegen, PWD merken und aufschreiben!! mkstore -wrl /opt/oracle/wallet/wallet-cman-tdm -create # User PWD für den Service hinterlegen mkstore -wrl /opt/oracle/wallet/wallet-cman-tdm -createCredential freedb1 cman_tdm "SecretPWD2023"
Falls auf dem DB Host angelegt, Wallet auf den CMAN Server kopieren:
scp -r wallet-cman-tdm/ 10.10.10.96:/opt/oracle/wallet
CMAN konfigurieren
Template:
cman1 = (configuration= (address=(protocol=tcp)(host=<CMAN_HOST>)(port=<CMAN_PORT>)) (parameter_list = (tdm=true) (tdm_threading_mode=<shared||dedicated>) (tdm_shared_threads_min=5) (tdm_shared_threads_max=20) (max_connections=50) (idle_timeout=0) (registration_invited_nodes = <DB_HOST_NAME_OR_IP_ADDRESS>) ... (max_gateway_processes=8) (min_gateway_processes=3) ... ) (rule_list= (rule= (src=*)(dst=*)(srv=*)(act=accept) (action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on)) 11 TECHNICAL BRIEF / An Oracle Database connection proxy for scalable and highly available applications ) ) ) wallet_location = (source = (method = file) (method_data = (directory="<wallet_location>"))) sqlnet.wallet_override = true
Daraus ergibt sich für meine Umgebung:
cman_gpi = (configuration= (address= (protocol=tcp)(host=cman21c.pipperr.local)(port=1999)) (parameter_list = (tdm=true) (tdm_threading_mode=dedicated) (tdm_shared_threads_min=5) (tdm_shared_threads_max=20) (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) (VALID_NODE_CHECKING_REGISTRATION=2) (REGISTRATION_INVITED_NODES=10.10.10.*) (USE_SERVICE_AS_TNSNAMES_ALIAS=ON) (USE_SID_AS_SERVICE=ON) (ENABLE_IP_FORWARDING=TRUE) ) (rule_list= (rule= (src=10.10.10.1/24)(dst=*)(srv=*)(act=accept) (action_list=(aut=off)(moct=0)(mct=0)(mit=0)(conn_stats=on)) ) ( rule= (src=cman21c)(dst=127.0.0.1)(srv=cmon)(act=accept) ) ( rule= (src=cman21c)(dst=*)(srv=cmon)(act=accept) ) ) ) wallet_location = (source = (method = file) (method_data = (directory="/opt/oracle/wallet/wallet-cman-tdm"))) sqlnet.wallet_override = true
cman stoppen und starten: als Oracle user
cmctl CMCTL> administer cman_gpi CMCTL> shutdown CMCTL> startup CMCTL> show tdm ax Call Wait Time : 30 Max Txn Call Wait Time : 30 Min Shared Threads : 5 Max Shared Threads : 20 Threading Mode : Dedicated # # Prüfe ob die DB sich auch angemeldet hat!!! # CMCTL>show service .. Service "freedb1" has 1 instance(s). Instance "FREE", status READY, has 1 handler(s) for this service... .. # # # falls nicht auf der Ziel Datenbank mit sys an der CDB anmelden # und # alter system register;
Client konfigurieren und testen
tnsnames.ora TNS-Alias hinterlegen
CMAN2_GPIDB23c = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.10.96)(PORT = 1999)) (CONNECT_DATA = (SERVICE_NAME = FREEDB1) ) )
Anmelden OHNE Proxy Connect:
C:\oracle\product\21\instantclient_21_11\sqlplus gpipperr@CMAN2_GPIDB23c SQL*Plus: Release 21.0.0.0.0 - Production on Tue Nov 7 20:08:41 2023 Version 21.11.0.0.0 Copyright (c) 1982, 2022, Oracle. All rights reserved. Enter password: Connected to: Oracle Database 23c Free, Release 23.0.0.0.0 - Developer-Release Version 23.2.0.0.0 connected via Oracle Connection Manager in Traffic Director mode 21.12.0.0.0 GPIPPERR@CMAN2_GPIDB23c-oracledb23c01>show user USER is "GPIPPERR" GPIPPERR@CMAN2_GPIDB23c-oracledb23c01>SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM dual; SYS_CONTEXT('USERENV','PROXY_USER') ------------------------------------ CMAN_TDM GPIPPERR@CMAN2_GPIDB23c-oracledb23c01>SELECT SYS_CONTEXT('USERENV','IP_ADDRESS') FROM dual; SYS_CONTEXT('USERENV','IP_ADDRESS') -------------------------------------- 10.10.10.96
Auf den Text „connected via Oracle Connection Manager in Traffic Director mode 21.12.0.0.0“ achten! IP Adresse ist die des CMAN!
Und schon hat sich der DBA ausgesperrt!
„ORA-28725: invalid CMAN in Traffic Director mode configuration“ und „ORA-12692: functionality (Logon as SYSDBA) not supported by Oracle Connection Manager in Traffic Director mode“
sys@CMAN_GPIDB23c as sysdba ORA-12692: functionality (Logon as SYSDBA) not supported by Oracle Connection Manager in Traffic Director mode system@CMAN_GPIDB23c .. ORA-28725: invalid CMAN in Traffic Director mode configuration ..
Lösung für System ist dann genau einfach:
ALTER USER system GRANT CONNECT through cman_tdm ;
Proxy User über TDM
Zu Proxy User siehe Oracle User Proxy Connection verwenden
Test Case
HR User anlege und granten:
CREATE USER hr IDENTIFIED BY gpi; CREATE USER hr IDENTIFIED BY gpi; ALTER USER HR GRANT CONNECT THROUGH gpipperr;
Auf der lokalen Maschine kann sich nun der User „gpipper“ an HR anmelden und bleibt der Proxy User:
sqlplus gpipperr[HR]@//localhost:1521/freedb1 HR@//localhost:1521/freedb1-oracledb23c01>show user USER is "HR" HR@//localhost:1521/freedb1-oracledb23c01>SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM dual; SYS_CONTEXT('USERENV','PROXY_USER') --------------- GPIPPERR
So ist da die Idee dahinter !
Jezt über den CMAN:
sqlplus gpipperr[HR]@CMAN_GPIDB23c .. ORA-28725: invalid CMAN in Traffic Director mode configuration ..
Rechte richtig vergeben:
sqlplus system@CMAN_GPIDB23c ALTER USER HR GRANT CONNECT through cman_tdm ;
Testen:
sqlplus gpipperr[HR]@CMAN2_GPIDB23c Connected TO: Oracle DATABASE 23c Free, Release 23.0.0.0.0 - Developer-Release Version 23.2.0.0.0 connected via Oracle Connection Manager IN Traffic Director mode 21.12.0.0.0 HR@CMAN2_GPIDB23c-oracledb23c01>SHOW USER USER IS "HR" HR@CMAN2_GPIDB23c-oracledb23c01>SELECT SYS_CONTEXT('USERENV','PROXY_USER') FROM dual; SYS_CONTEXT('USERENV','PROXY_USER') --------------- CMAN_TDM
D.h. meine Proxy User Information ist nun nicht mehr so ganz richtig, der ursprüngliche User ist damit verschwunden!
Das kann auf das Auditing / Logging so einige unangenehme Überraschungen bedeuten!
Quellen
Oracle:
Blogs: