Konfigurieren des UTL_HTTP-Zugriffs mit Zertifikaten und einer Oracle Wallet - Amazon Relational Database Service

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Konfigurieren des UTL_HTTP-Zugriffs mit Zertifikaten und einer Oracle Wallet

Amazon RDS unterstützt ausgehenden Netzwerkzugriff auf Ihre DB-Instances von RDS für Oracle. Verbinden Sie Ihre DB-Instance mithilfe der folgenden PL/SQL-Pakete mit dem Netzwerk:

UTL_HTTP

Dieses Paket macht HTTP-Aufrufe von SQL und PL/SQL. Sie können damit über HTTP auf Daten im Internet zugreifen. Weitere Informationen finden Sie unter UTL_HTTP in der Oracle-Dokumentation.

UTL_TCP

Dieses Paket bietet clientseitige TCP/IP-Zugriffsfunktionalität in PL/SQL. Dieses Paket ist nützlich für PL/SQL-Anwendungen, die Internetprotokolle und E-Mails verwenden. Weitere Informationen finden Sie unter UTL_TCP in der Oracle-Dokumentation.

UTL_SMTP

Dieses Paket bietet Schnittstellen zu den SMTP-Befehlen, die es einem Client ermöglichen, E-Mails an einen SMTP-Server zu senden. Weitere Informationen finden Sie unter UTL_SMTP in der Oracle-Dokumentation.

Wenn Sie die folgenden Aufgaben ausführen, können Sie UTL_HTTP.REQUEST konfigurieren, um mit Websites zu arbeiten, die während des SSL-Handshakes Clientauthentifizierungszertifikate benötigen. Sie können auch die Kennwortauthentifizierung für UTL_HTTP-Zugriff auf Websites konfigurieren, indem Sie die Befehle für das Generieren der Oracle Wallet und den Prozess DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE ändern. Weitere Informationen finden Sie unter DBMS_NETWORK_ACL_ADMIN in der Dokumentation zu Oracle Database.

Anmerkung

Sie können folgende Aufgaben für UTL_SMTP anpassen, mit denen Sie E-Mails über SSL/TLS senden (einschließlich Amazon Simple Email Service).

Überlegungen zur Konfiguration des UTL_HTTP-Zugriffs

Berücksichtigen Sie Folgendes, bevor Sie den Zugriff konfigurieren:

  • Sie können SMTP mit der Option UTL_MAIL verwenden. Weitere Informationen finden Sie unter Oracle UTL_MAIL.

  • Der DNS-Name (Domain Name Server) des Remote-Hosts kann einer der folgenden sein:

    • Öffentlich auflösbar.

    • Der Endpunkt einer Amazon RDS-DB-Instance.

    • Auflösbar über einen benutzerdefinierten DNS-Server. Weitere Informationen finden Sie unter Einrichten eines benutzerdefinierten DNS-Servers.

    • Der private DNS-Name einer Amazon EC2-Instance in derselben VPC oder einer gleichrangigen VPC. Stellen Sie in diesem Fall sicher, dass der Name über einen benutzerdefinierten DNS-Server auflösbar ist. Alternativ können Sie für die Verwendung des von Amazon bereitgestellten DNS das Attribut enableDnsSupport in den VPC-Einstellungen und den Support für DNS-Auflösung für die gleichrangige VPC-Verbindung aktivieren. Weitere Informationen finden Sie unter DNS-Unterstützung für Ihre VPC und Ändern Ihrer VPC-Peering-Verbindung.

    • Für eine sichere Verbindung mit Remote-SSL/TLS-Ressourcen empfehlen wir Ihnen, benutzerdefinierte Oracle Wallets zu erstellen und hochzuladen. Mittels der Funktion zur Amazon S3-Integration in Amazon RDS for Oracle können Sie ein Wallet von Amazon S3 auf Oracle-DB-Instances herunterladen. Weitere Informationen über die Amazon S3-Integration für Oracle finden Sie unter Amazon S3-Integration.

  • Sie können Datenbankverbindungen zwischen Oracle-DB-Instances über einen SSL/TLS-Endpunkt einrichten, wenn die Oracle-SSL-Option für jede Instance konfiguriert ist. Weitere Konfigurationseinstellungen sind nicht erforderlich. Weitere Informationen finden Sie unter Oracle Secure Sockets Layer.

Schritt 1: Abrufen des Stammzertifikats für eine Website

Damit die DB-Instance von RDS für Oracle sichere Verbindungen zu einer Website herstellen kann, fügen Sie das Stammzertifizierungsstellenzertifikat hinzu. Amazon RDS verwendet das Stammzertifikat, um das Website-Zertifikat für die Oracle Wallet zu signieren.

Sie können das Stammzertifikat auf verschiedene Arten abrufen. Sie können z. B. Folgendes tun:

  1. Verwenden Sie einen Webserver, um die durch das Zertifikat gesicherte Website aufzurufen.

  2. Laden Sie das Stammzertifikat herunter, das zum Signieren verwendet wurde.

Für AWS-Services werden die Zertifikate üblicherweise im Amazon Trust Services Repository hinterlegt.

Schritt 2: Erstellen einer Oracle Wallet

Erstellen Sie eine Oracle Wallet, die sowohl die Webserver-Zertifikate als auch die Clientauthentifizierungszertifikate enthält. Die RDS-Oracle-Instance verwendet das Webserver-Zertifikat, um eine sichere Verbindung zur Website herzustellen. Die Website benötigt das Clientzertifikat, um den Oracle-Datenbankbenutzer zu authentifizieren.

Möglicherweise möchten Sie sichere Verbindungen konfigurieren, ohne Clientzertifikate für die Authentifizierung zu verwenden. In diesem Fall können Sie die Java-Keystore-Schritte im folgenden Prozess überspringen.

Erstellen einer Oracle Wallet
  1. Hinterlegen Sie die Root- und Clientzertifikate in einem einzelnen Verzeichnis und wechseln Sie dann in dieses Verzeichnis.

  2. Konvertieren Sie das .p12-Clientzertifikat in den Java-Keystore.

    Anmerkung

    Wenn Sie keine Clientzertifikate für die Authentifizierung verwenden, können Sie diesen Schritt überspringen.

    Im folgenden Beispiel wird das Clientzertifikat mit dem Namen client_certificate.p12 zum Java-Keystore mit dem Namen client_keystore.jks konvertiert. Der Keystore wird dann in die Oracle Wallet integriert. Das Keystore-Passwort lautet P12PASSWORT.

    orapki wallet pkcs12_to_jks -wallet ./client_certificate.p12 -jksKeyStoreLoc ./client_keystore.jks -jksKeyStorepwd P12PASSWORD
  3. Erstellen Sie ein Verzeichnis für Ihre Oracle Wallet, das sich vom Zertifikatsverzeichnis unterscheidet.

    Im folgenden Beispiel wird das Verzeichnis /tmp/wallet erstellt.

    mkdir -p /tmp/wallet
  4. Erstellen Sie eine Oracle Wallet in Ihrem Wallet-Verzeichnis.

    Im folgenden Beispiel wird das Oracle-Wallet-Passwort auf P12PASSWORT festgelegt. Das ist das gleiche Passwort, das der Java-Keystore in einem vorherigen Schritt verwendet hat. Die Verwendung desselben Passworts ist praktisch, aber nicht notwendig. Der Parameter -auto_login aktiviert die automatische Anmeldefunktion, sodass Sie nicht jedes Mal ein Passwort angeben müssen, wenn Sie darauf zugreifen möchten.

    Anmerkung

    Geben Sie aus Sicherheitsgründen ein anderes Passwort als hier angegeben an.

    orapki wallet create -wallet /tmp/wallet -pwd P12PASSWORD -auto_login
  5. Fügen Sie den Java-Keystore zu Ihrer Oracle Wallet hinzu.

    Anmerkung

    Wenn Sie keine Clientzertifikate für die Authentifizierung verwenden, können Sie diesen Schritt überspringen.

    Im folgenden Beispiel wird der Keystore client_keystore.jks zur Oracle Wallet namens /tmp/wallet hinzugefügt. In diesem Beispiel geben Sie das gleiche Passwort für den Java-Keystore und die Oracle Wallet an.

    orapki wallet jks_to_pkcs12 -wallet /tmp/wallet -pwd P12PASSWORD -keystore ./client_keystore.jks -jkspwd P12PASSWORD
  6. Fügen Sie das Stammzertifikat für Ihre Ziel-Website der Oracle Wallet hinzu.

    Im folgenden Beispiel wird ein Zertifikat mit dem Namen Root_CA.cer hinzugefügt.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Root_CA.cer -pwd P12PASSWORD
  7. Hinzufügen von Zwischenzertifikaten

    Im folgenden Beispiel wird ein Zertifikat mit dem Namen Intermediate.cer hinzugefügt. Wiederholen Sie diesen Schritt so oft wie nötig, bis Sie alle Zwischenzertifikate geladen haben.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Intermediate.cer -pwd P12PASSWORD
  8. Bestätigen Sie, dass Ihre neu erstellte Oracle Wallet über die erforderlichen Zertifikate verfügt.

    orapki wallet display -wallet /tmp/wallet -pwd P12PASSWORD

Schritt 3: Herunterladen Ihrer Oracle Wallet auf Ihre RDS-for-Oracle-Instance

In diesem Schritt laden Sie Ihre Oracle Wallet auf Amazon S3 hoch und laden dann die Wallet von Amazon S3 auf Ihre RDS-for-Oracle-Instance herunter.

Laden Sie Ihre Oracle Wallet auf Ihre RDS-for-Oracle-Instance herunter wie folgt:
  1. Erfüllen Sie die Voraussetzungen für die Amazon S3-Integration in Oracle und fügen Sie die Option S3_INTEGRATION zu Ihrer Oracle-DB-Instance hinzu. Stellen Sie sicher, dass die IAM-Rolle für die Option Zugriff auf den Amazon S3-Bucket hat, den Sie verwenden.

    Weitere Informationen finden Sie unter Amazon S3-Integration.

  2. Melden Sie sich als Hauptbenutzer bei Ihrer DB-Instance an und erstellen Sie dann ein Oracle-Verzeichnis für die Oracle Wallet.

    Im folgenden Beispiel wird ein Oracle-Verzeichnis mit dem Namen WALLET_DIR erstellt.

    EXEC rdsadmin.rdsadmin_util.create_directory('WALLET_DIR');

    Weitere Informationen finden Sie unter Erstellen und Löschen von Verzeichnissen im Hauptdatenspeicherbereich.

  3. Laden Sie die Oracle Wallet zu Ihrem Amazon S3 Bucket hoch.

    Sie können jede unterstützte Upload-Technik verwenden.

  4. Wenn Sie eine Oracle Wallet erneut hochladen, löschen Sie die vorhandene Wallet. Andernfalls überspringen Sie diesen Schritt und gehen Sie direkt zum nächsten.

    Im folgenden Beispiel wird die vorhandene Wallet mit dem Namen cwallet.sso entfernt.

    EXEC UTL_FILE.FREMOVE ('WALLET_DIR','cwallet.sso');
  5. Laden Sie die Oracle Wallet aus Ihrem Amazon S3 Bucket zur Oracle-DB-Instance herunter.

    Im folgenden Beispiel wird die Wallet mit dem Namen cwallet.sso aus dem Amazon S3 Bucket mit dem Namen my_s3_bucket in das DB-Instance-Verzeichnis mit dem Namen WALLET_DIR heruntergeladen.

    SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'my_s3_bucket', p_s3_prefix => 'cwallet.sso', p_directory_name => 'WALLET_DIR') AS TASK_ID FROM DUAL;
  6. (Optional) Laden Sie eine kennwortgeschützte Oracle Wallet herunter.

    Laden Sie diese Wallet nur herunter, wenn Sie für jede Verwendung der Wallet eine Passworteingabe fordern. Im folgenden Beispiel wird die passwortgeschützte Wallet ewallet.p12 heruntergeladen.

    SELECT rdsadmin.rdsadmin_s3_tasks.download_from_s3( p_bucket_name => 'my_s3_bucket', p_s3_prefix => 'ewallet.p12', p_directory_name => 'WALLET_DIR') AS TASK_ID FROM DUAL;
  7. Überprüfen Sie den Status Ihrer DB-Anfrage.

    Ersetzen Sie die von den vorangegangenen Schritten zurückgegebene Aufgaben-ID für dbtask-1234567890123-4567.log im folgenden Beispiel.

    SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-4567.log'));
  8. Überprüfen Sie den Inhalt des Verzeichnisses, das Sie zum Speichern der Oracle Wallet verwenden.

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'WALLET_DIR'));

    Weitere Informationen finden Sie unter Auflisten von Dateien in einem DB-Instance-Verzeichnis.

Schritt 4: Erteilen Sie Benutzerberechtigungen für die Oracle Wallet

Sie können entweder einen neuen Datenbankbenutzer erstellen oder einen vorhandenen Benutzer konfigurieren. In beiden Fällen müssen Sie den Benutzer so konfigurieren, dass er auf die Oracle Wallet zugreift, um sichere Verbindungen und Clientauthentifizierung mit Zertifikaten zu erhalten.

Erteilen Sie Benutzerberechtigungen für die Oracle Wallet wie folgt:
  1. Melden Sie sich als Hauptnutzer bei Ihrer RDS-for-Oracle-DB-Instance an.

  2. Wenn Sie keinen bestehenden Datenbankbenutzer konfigurieren möchten, erstellen Sie einen neuen Benutzer. Andernfalls überspringen Sie diesen Schritt und gehen Sie direkt zum nächsten.

    Im folgenden Beispiel wird ein Datenbankbenutzer mit dem Namen my-user erstellt.

    CREATE USER my-user IDENTIFIED BY my-user-pwd; GRANT CONNECT TO my-user;
  3. Erteilen Sie Ihrem Datenbankbenutzer die Berechtigung für das Verzeichnis, das Ihre Oracle Wallet enthält.

    Im folgenden Beispiel wird dem Benutzer my-user Lesezugriff für das Verzeichnis WALLET_DIR gewährt.

    GRANT READ ON DIRECTORY WALLET_DIR TO my-user;
  4. Erteilen Sie Ihrem Datenbankbenutzer die Berechtigung zur Nutzung des Pakets UTL_HTTP.

    Das folgende PL/SQL-Programm gewährt dem Benutzer my-user UTL_HTTP-Zugriff.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  5. Erteilen Sie Ihrem Datenbankbenutzer die Berechtigung zur Nutzung des Pakets UTL_FILE.

    Das folgende PL/SQL-Programm gewährt dem Benutzer my-user UTL_FILE-Zugriff.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_FILE', UPPER('my-user')); END; /

Schritt 5: Konfigurieren des Zugriffs auf eine Website von Ihrer DB-Instance

In diesem Schritt konfigurieren Sie Ihren Oracle Datenbankbenutzer so, dass er sich über UTL_HTTP, die hochgeladene Oracle Wallet und das Clientzertifikat mit Ihrer Zielwebsite verbinden kann. Weitere Informationen finden Sie unter Configuring Access Control to an Oracle Wallet in der Dokumentation zur Oracle Database.

Konfigurieren des Zugriffs auf eine Website von Ihrer Oracle-DB-Instance
  1. Melden Sie sich als Hauptnutzer bei Ihrer RDS-for-Oracle-DB-Instance an.

  2. Erstellen Sie einen Host Access Control Entry (ACE) für Ihren Benutzer und die Zielwebsite auf einem sicheren Port.

    Im folgenden Beispiel wird my-user so konfiguriert, dass er Zugriff auf secret.encrypted-website.com auf dem sicheren Port 443 erhält.

    BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'secret.encrypted-website.com', lower_port => 443, upper_port => 443, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; /
    Wichtig

    Die vorhergehende Programmeinheit kann zu folgendem Fehler führen: PLS-00201: identifier 'XS_ACL' must be declared. Wenn dieser Fehler zurückgegeben wird, ersetzen Sie die Zeile, die einen Wert zuweist, principal_type durch die folgende Zeile und führen Sie dann die Programmeinheit erneut aus:

    principal_type => 2));

    Weitere Informationen zu Konstanten im PL/SQL-Paket finden Sie XS_ACLunter Administratorhandbuch für Real Application Security und Entwicklerhandbuch in der Oracle-Database-Dokumentation.

    Weitere Informationen finden Sie unter Configuring Access Control for External Network Services in der Dokumentation zur Oracle Database.

  3. (Optional) Erstellen Sie einen ACE für Ihren Benutzer und Ihre Zielwebsite am Standardport.

    Möglicherweise müssen Sie den Standardport verwenden, wenn einige Webseiten vom Standard-Webserver-Port (80) anstelle des sicheren Ports (443) bereitgestellt werden.

    BEGIN DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE( host => 'secret.encrypted-website.com', lower_port => 80, upper_port => 80, ace => xs$ace_type(privilege_list => xs$name_list('http'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); -- If the program unit results in PLS-00201, set -- the principal_type parameter to 2 as follows: -- principal_type => 2)); END; /
  4. Bestätigen Sie, dass die Zugriffssteuerungseinträge existieren.

    SET LINESIZE 150 COLUMN HOST FORMAT A40 COLUMN ACL FORMAT A50 SELECT HOST, LOWER_PORT, UPPER_PORT, ACL FROM DBA_NETWORK_ACLS ORDER BY HOST;
  5. Erteilen Sie Ihrem Datenbankbenutzer die Berechtigung zur Nutzung des Pakets UTL_HTTP.

    Das folgende PL/SQL-Programm gewährt dem Benutzer my-user UTL_HTTP-Zugriff.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  6. Bestätigen Sie, dass verwandte Zugriffssteuerungslisten existieren.

    SET LINESIZE 150 COLUMN ACL FORMAT A50 COLUMN PRINCIPAL FORMAT A20 COLUMN PRIVILEGE FORMAT A10 SELECT ACL, PRINCIPAL, PRIVILEGE, IS_GRANT, TO_CHAR(START_DATE, 'DD-MON-YYYY') AS START_DATE, TO_CHAR(END_DATE, 'DD-MON-YYYY') AS END_DATE FROM DBA_NETWORK_ACL_PRIVILEGES ORDER BY ACL, PRINCIPAL, PRIVILEGE;
  7. Erteilen Sie Ihrem Datenbankbenutzer die Berechtigung, Zertifikate für die Clientauthentifizierung und Ihr Oracle Wallet für Verbindungen zu verwenden.

    Anmerkung

    Wenn Sie keine Clientzertifikate für die Authentifizierung verwenden, können Sie diesen Schritt überspringen.

    DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE( wallet_path => 'file:/' || l_wallet_path, ace => xs$ace_type(privilege_list => xs$name_list('use_client_certificates'), principal_name => 'my-user', principal_type => xs_acl.ptype_db)); END; /

Schritt 6: Testen der Verbindungen Ihrer DB-Instance zu einer Website

In diesem Schritt konfigurieren Sie Ihren Datenbankbenutzer so, dass er sich über UTL_HTTP, die hochgeladene Oracle Wallet und das Clientzertifikat mit der Website verbinden kann.

Konfigurieren des Zugriffs auf eine Website von Ihrer Oracle-DB-Instance
  1. Melden Sie sich bei Ihrer RDS-for-Oracle-DB-Instance als Datenbankbenutzer mit UTL_HTTP-Berechtigungen an.

  2. Bestätigen Sie, dass eine Verbindung zu Ihrer Zielwebsite die Hostadresse auflösen kann.

    Im folgenden Beispiel wird die Host-Adresse von secret.encrypted-website.com abgerufen.

    SELECT UTL_INADDR.GET_HOST_ADDRESS(host => 'secret.encrypted-website.com') FROM DUAL;
  3. Testen Sie eine fehlgeschlagene Verbindung.

    Die folgende Abfrage schlägt fehl, da UTL_HTTP den Speicherort der Oracle Wallet mit den Zertifikaten benötigt.

    SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  4. Testen Sie den Website-Zugriff durch die Verwendung von UTL_HTTP.SET_WALLET wählen Sie DUAL aus.

    DECLARE l_wallet_path all_directories.directory_path%type; BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; UTL_HTTP.SET_WALLET('file:/' || l_wallet_path); END; / SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  5. (Optional) Testen Sie den Website-Zugriff, indem Sie Ihre Abfrage in einer Variable speichern und EXECUTE IMMEDIATE verwenden.

    DECLARE l_wallet_path all_directories.directory_path%type; v_webpage_sql VARCHAR2(1000); v_results VARCHAR2(32767); BEGIN SELECT DIRECTORY_PATH INTO l_wallet_path FROM ALL_DIRECTORIES WHERE UPPER(DIRECTORY_NAME)='WALLET_DIR'; v_webpage_sql := 'SELECT UTL_HTTP.REQUEST(''secret.encrypted-website.com'', '''', ''file:/' ||l_wallet_path||''') FROM DUAL'; DBMS_OUTPUT.PUT_LINE(v_webpage_sql); EXECUTE IMMEDIATE v_webpage_sql INTO v_results; DBMS_OUTPUT.PUT_LINE(v_results); END; /
  6. (Optional) Suchen Sie den Dateisystemspeicherort Ihres Oracle-Wallet-Verzeichnisses.

    SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => 'WALLET_DIR'));

    Verwenden Sie die Ausgabe des vorherigen Befehls, um eine HTTP-Anfrage zu stellen. Lautet das Verzeichnis rdsdbdata/userdirs/01, führen Sie beispielsweise die folgende Abfrage aus.

    SELECT UTL_HTTP.REQUEST('https://secret.encrypted-website.com/', '', 'file://rdsdbdata/userdirs/01') FROM DUAL;