1. Start
  2. Unternehmen
  3. Blog
  4. Sichere Verbindung per TCPS

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

Kommentar schreiben

* Diese Felder sind erforderlich