Sichere Verbindung per TCPS
Einleitung
Die Kommunikation zwischen einer Oracle Datenbank und den Clients kann nicht nur per nativer SQL*Net Verschlüsselung geschützt werden sondern auch per TCPS. Diese Möglichkeit ist ohne zusätzliche Kosten in allen Editionen der Oracle Datenbank benutzbar. Allerdings ist die Einrichtung nicht ganz so trivial wie die Aktivierung der SQL*Net Verschlüsselung.
Im Grunde muss auf dem Datenbankserver ein Wallet mit privatem Schlüssel erstellt werden, der Client benötigt dann das zugehörige Zertifikat und schon kommt eine sichere Verbindung zustande.
Auf dem Server
Zuerst wird also ein Verzeichnis erstellt, in das Wallet abgelegt werden kann. Das Wallet selbst wird dann mittels "orapki" erstellt und ein selbst signierter Schlüssel erzeugt. Zu beachten ist dabei, dass der CN dem Hostnamen entspricht. Die Gültigkeitsdauer wird in Tagen angegeben, hier im Beispiel sind es also 5 Jahre.
[oracle@vm121 ~]$ mkdir -p /u01/app/oracle/wallet/listener
[oracle@vm121 ~]$ orapki wallet create -wallet /u01/app/oracle/wallet/listener -pwd OraclE-01 -auto_login_local
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Vorgang wurde erfolgreich abgeschlossen.
[oracle@vm121 ~]$ hostname
vm121.support.robotron.de
[oracle@vm121 ~]$ orapki wallet add -wallet /u01/app/oracle/wallet/listener -pwd OraclE-01 -dn "CN=$(hostname)" -keysize 1024 -self_signed -validity 1825
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Vorgang wurde erfolgreich abgeschlossen.
[oracle@vm121 ~]$ orapki wallet display -wallet /u01/app/oracle/wallet/listener
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Requested Certificates:
User Certificates:
Subject: CN=vm121.support.robotron.de
Trusted Certificates:
Subject: CN=vm121.support.robotron.de
[oracle@vm121 ~]$ ll /u01/app/oracle/wallet/listener
insgesamt 8
-rw------- 1 oracle oinstall 2541 29. Jun 11:14 cwallet.sso
-rw------- 1 oracle oinstall 0 29. Jun 11:13 cwallet.sso.lck
-rw------- 1 oracle oinstall 2496 29. Jun 11:14 ewallet.p12
-rw------- 1 oracle oinstall 0 29. Jun 11:13 ewallet.p12.lck
Jetzt muss dem Listener noch bekannt gemacht werden, wo sich das Wallet befindet. Dazu wird die LISTENER.ORA entsprechend ergänzt.
[oracle@vm121 ~]$ cat << EOF >> $ORACLE_HOME/network/admin/listener.ora
> WALLET_LOCATION =
> (SOURCE =
> (METHOD = FILE)
> (METHOD_DATA =
> (DIRECTORY = /u01/app/oracle/wallet/listener)
> )
> )
>
> SSL_CLIENT_AUTHENTICATION = FALSE
>
> EOF
Weiterhin braucht der Listener noch einen entsprechenden Endpunkt um auf TCPS reagieren zu können. Bei Verwendung der Grid Infrastructure geht das recht simpel, ansonsten müsste der Endpunkt auch in der LISTENER.ORA eingetragen werden. Außerdem muss noch die Authentifizierung via SSL deaktiviert werden, denn die wird für eine einfache TCPS-Verbindung nicht benötigt.
[oracle@vm121 ~]$ srvctl modify listener -listener listener -endpoints "TCP:1521/TCPS:2484"
[oracle@vm121 ~]$ lsnrctl status
LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 19-JUL-2022 13:12:24
Copyright (c) 1991, 2021, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER)))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production
Start Date 29-JUN-2022 11:47:15
Uptime 20 days 1 hr. 25 min. 9 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/grid/19/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/vm121/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=LISTENER)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=10.16.36.121)(PORT=1521)))
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=10.16.36.121)(PORT=2484)))
Services Summary...
[...]
Zuguterletzt muss auch noch die SQLNET.ORA des betreffenden Datenbank Homes angepasst werden, denn auch diese benötigt die Informationen zum Ablageort des Wallets sowie die Einstellungen zur Authentifizierung.
[oracle@vm121 ~]$ cat << EOF >> $ORACLE_HOME/network/admin/sqlnet.ora
> WALLET_LOCATION =
> (SOURCE =
> (METHOD = FILE)
> (METHOD_DATA =
> (DIRECTORY = /u01/app/oracle/wallet/listener)
> )
> )
>
> SSL_CLIENT_AUTHENTICATION = FALSE
> EOF
Vorbereitung für Clients
Die Clients benötigen zum Verbindungsaufbau lediglich das Zertifikat in einem Wallet. Dementsprechend kann das Wallet auch schon auf dem Datenbankserver vorbereitet werden. Das Wallet muss daher in einem separaten Verzeichnis erstellt werden.
[oracle@vm121 ~]$ mkdir wallet_client
[oracle@vm121 ~]$ cd wallet_client/
[oracle@vm121 wallet_client]$ orapki wallet create -wallet $(pwd) -pwd OraclE-01 -auto_login
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Vorgang wurde erfolgreich abgeschlossen.
Das Zertifikat wird nun aus dem Server-Wallet exportiert und in das zukünftige Client-Wallet importiert.
[oracle@vm121 ~]$ orapki wallet export -wallet "/u01/app/oracle/wallet/listener" -pwd OraclE-01 -dn "CN=$(hostname)" -cert wat
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Vorgang wurde erfolgreich abgeschlossen.
[oracle@vm121 wallet_client]$ orapki wallet add -wallet $(pwd) -pwd OraclE-01 -trusted_cert -cert /u01/app/oracle/wallet/listener/$(hostname)-certificate.crt
Oracle PKI Tool Release 19.0.0.0.0 - Production
19.4.0.0.0 : Version {1}
Copyright (c) 2004, 2021, Oracle und/oder der verbundenen Unternehmen. All rights reserved. Alle Rechte vorbehalten.
Vorgang wurde erfolgreich abgeschlossen.
Dazu kann auch gleich die passende SQLNET.ORA und TNSNAMES.ORA für die Clients dort abgelegt werden.
[oracle@vm121 wallet_client]$ cat << EOF > sqlnet.ora
> WALLET_LOCATION =
> (SOURCE =
> (METHOD = FILE)
> (METHOD_DATA =
> (DIRECTORY = "/home/oracle/tcps")
> )
> )
>
> SSL_CLIENT_AUTHENTICATION = FALSE
> SSL_SERVER_DN_MATCH=ON
> EOF
[oracle@vm121 wallet_client]$ cat << EOF > tnsnames.ora
> asm19_ssl =
> (DESCRIPTION=
> (ADDRESS=
> (PROTOCOL=TCPS)
> (HOST=vm121.support.robotron.de)
> (PORT=2484)
> )
> (CONNECT_DATA=
> (SERVER=dedicated)
> (SERVICE_NAME=asm19a)
> )
> (SECURITY=(SSL_SERVER_CERT_DN="CN=vm121.support.robotron.de"))
> )
> EOF
Dann muss für die Clients gegebenenfalls noch der Pfad zum Wallet angepasst werden, mehr ist nicht zu tun. Der Eintrag in der TNSNAMES.ORA benutzt nun den neuen Endpunkt für TCPS und definiert, welches Zertifikat zum Aufbau der Verbindung benutzt werden soll.
Auf den Clients
Damit der Client nun die Verbindung über TCPS aufbauen kann, müssen die Konfigurationsdateien sowie das Client Wallet bereitgestellt werden. All das wurde im vorangegangenen Schritt bereits erstellt und muss nur noch kopiert werden.
[oracle@vm171 ~]$ mkdir tcps
[oracle@vm171 ~]$ cd tcps/
[oracle@vm171 tcps]$ scp -r vm121:/home/oracle/wallet_client/*wallet* .
[oracle@vm171 tcps]$ scp -r vm121:/home/oracle/wallet_client/*ora .
[oracle@vm171 tcps]$ ll
total 16
-rw------- 1 oracle oinstall 757 Jul 19 12:53 cwallet.sso
-rw------- 1 oracle oinstall 0 Jul 19 12:53 cwallet.sso.lck
-rw------- 1 oracle oinstall 712 Jul 19 12:53 ewallet.p12
-rw------- 1 oracle oinstall 0 Jul 19 12:53 ewallet.p12.lck
-rw-r--r-- 1 oracle oinstall 193 Jul 19 12:55 sqlnet.ora
-rw-r--r-- 1 oracle oinstall 278 Jul 19 12:55 tnsnames.ora
Für das Beispiel passt hier bereits der vorkonfigurierte Pfad zum Wallet und die Einstellungen können direkt verwendet werden indem TNS_ADMIN auf das Verzeichnis zeigt.
[oracle@vm171 tcps]$ export TNS_ADMIN=$(pwd)
[oracle@vm171 tcps]$ tnsping asm19_ssl
TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 19-JUL-2022 12:55:31
Copyright (c) 1997, 2020, Oracle. All rights reserved.
Used parameter files:
/home/oracle/tcps/sqlnet.ora
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION= (ADDRESS= (PROTOCOL=TCPS) (HOST=vm121.support.robotron.de) (PORT=2484)) (CONNECT_DATA= (SERVER=dedicated) (SERVICE_NAME=asm19a)) (SECURITY=(SSL_SERVER_CERT_DN=CN=vm121.support.robotron.de)))
OK (60 msec)
Bereits das "tnsping" verwendet TCPS, ist also irgendwo ein Fehler in der Konfiguration, würde dieser an dieser Stelle hervortreten. Der Verbindungsaufbau mit SQL*Plus (oder jedem beliebigen anderen Client) funktioniert wie gewohnt, nur das Netzwerkprotokoll ändert sich. Über den SYS_CONTEXT kann das Protokoll ermittelt werden und dient somit als Check, ob die Verbindung auch tatsächlich über TCPS verschlüsselt ist.
[oracle@vm171 tcps]$ sqlplus system/oracle@asm19_ssl
SQL*Plus: Release 19.0.0.0.0 - Production on Tue Jul 19 12:55:34 2022
Version 19.9.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Last Successful login time: Tue Jul 19 2022 12:49:24 +02:00
Connected to:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.13.0.0.0
SQL> SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') FROM dual;
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
--------------------------------------------------------------------------------
tcps
Hier im Beispiel wurde Linux als Client verwendet, das Ganze funktioniert analog natürlich auch unter Windows. Dazu muss lediglich der Pfad zum Wallet in der SQLNET.ORA angepasst werden.
C:\Users\marco.mischke\Downloads\wallet_client>dir
Datenträger in Laufwerk C: ist Windows
Volumeseriennummer: AA0A-FA2B
Verzeichnis von C:\Users\marco.mischke\Downloads\wallet_client
19.07.2022 12:47 <DIR> .
19.07.2022 12:47 <DIR> ..
19.07.2022 12:47 757 cwallet.sso
19.07.2022 12:47 712 ewallet.p12
19.07.2022 14:22 213 sqlnet.ora
19.07.2022 12:47 278 tnsnames.ora
4 Datei(en), 1.960 Bytes
2 Verzeichnis(se), 223.529.111.552 Bytes frei
C:\Users\marco.mischke\Downloads\wallet_client>type sqlnet.ora
WALLET_LOCATION =
(SOURCE =
(METHOD = FILE)
(METHOD_DATA =
(DIRECTORY = "C:\Users\marco.mischke\Downloads\wallet_client")
)
)
SSL_CLIENT_AUTHENTICATION = FALSE
SSL_SERVER_DN_MATCH=ON
C:\Users\marco.mischke\Downloads\wallet_client>set TNS_ADMIN=C:\Users\marco.mischke\Downloads\wallet_client
C:\Users\marco.mischke\Downloads\wallet_client>sqlplus system/oracle@asm19_ssl
SQL*Plus: Release 19.0.0.0.0 - Production on Di Jul 19 14:22:37 2022
Version 19.15.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Letzte erfolgreiche Anmeldezeit: Di Jul 19 2022 13:59:59 +02:00
Verbunden mit:
Oracle Database 19c Standard Edition 2 Release 19.0.0.0.0 - Production
Version 19.13.0.0.0
SQL> SELECT sys_context('USERENV', 'NETWORK_PROTOCOL') FROM dual;
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL')
--------------------------------------------------------------------------------
tcps
Fazit
Mit TCPS existiert neben der nativen SQL*Net Verschlüsselung eine weitere kostenlose Möglichkeit, den Netzwerkverkehr zwischen einer Oracle Datenbank und deren Clients zu verschlüsseln. Die Einrichtung ist zwar etwas aufwändiger, dafür wird auch der komplette Netzwerkverkehr bereits ab dem Aufbau der Verbindung verschlüsselt und nicht nur die Paketinhalte bei Kommunikation nachdem die Verbindung aufgebaut wurde.
Kommentare
Keine Kommentare