Configurazione dell'accesso UTL_HTTP utilizzando certificati e un portafoglio Oracle - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Configurazione dell'accesso UTL_HTTP utilizzando certificati e un portafoglio Oracle

Amazon RDS supporta l'accesso alla rete in uscita sulle tue istanze DB RDS per Oracle. Per connettere l'istanza database alla rete, puoi utilizzare i seguenti pacchetti PL/SQL:

UTL_HTTP

Questo pacchetto effettua chiamate HTTP da SQL e PL/SQL. Puoi utilizzarlo per accedere ai dati su Internet tramite HTTP. Per ulteriori informazioni, consulta UTL_HTTP nella documentazione di Oracle.

UTL_TCP

Questo pacchetto fornisce funzionalità di accesso lato client TCP/IP in PL/SQL. Questo pacchetto è utile per le applicazioni PL/SQL che usano protocolli Internet ed e-mail. Per ulteriori informazioni, consulta UTL_TCP nella documentazione di Oracle.

UTL_SMTP

Questo pacchetto fornisce interfacce ai comandi SMTP che consentono a un client di inviare messaggi di posta elettronica a un server SMTP. Per ulteriori informazioni, consulta UTL_SMTP nella documentazione di Oracle.

Completando le seguenti attività, puoi configurare UTL_HTTP.REQUEST affinché funzioni con siti Web che richiedono certificati di autenticazione client durante l'handshake SSL. Puoi anche configurare l'autenticazione con password affinché UTL_HTTP acceda ai siti Web modificando i comandi di generazione del portafoglio Oracle wallet e la procedura DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE. Per ulteriori informazioni, consulta DBMS_NETWORK_ACL_ADMIN nella documentazione di Oracle Database.

Nota

Puoi adattare le seguenti attività per UTL_SMTP, il che consente di inviare e-mail tramite SSL/TLS (incluso Amazon Simple Email Service).

Considerazioni sulla configurazione dell'accesso UTL_HTTP

Prima di configurare l'accesso, considerate quanto segue:

  • È possibile utilizzare SMTP con l'opzione UTL_MAIL. Per ulteriori informazioni, consulta Oracolo UTL _ MAIL.

  • Il nome del DNS (Domain Name Server) dell'host remoto può essere uno qualsiasi dei seguenti:

    • Risolvibile pubblicamente.

    • L'endpoint di un'istanza database Amazon RDS.

    • Risolvibile attraverso un server DNS personalizzato. Per ulteriori informazioni, consulta Configurazione di un server personalizzato DNS.

    • Il nome DNS privato di un'istanza Amazon EC2 nello stesso VPC o in un VPC in peering. In questo caso, assicurarsi che il nome sia risolvibile attraverso un server DNS personalizzato. In alternativa, per utilizzare il DNS fornito da Amazon, è possibile abilitare l'attributo enableDnsSupport nelle impostazioni VPC e abilitare il supporto alla risoluzione DNS per la connessione VPC in peering. Per ulteriori informazioni, consulta la sezione sul supporto DNS nel tuo VPC e quella sulla modifica della tua connessione VPC in peering.

    • Per connetterti in modo sicuro a risorse SSL/TLS remote, ti consigliamo creare e caricare portafogli Oracle personalizzati. Utilizzando la funzionalità di integrazione di Amazon S3 con Amazon RDS for Oracle, è possibile scaricare un portafoglio da Amazon S3 sulle istanze database Oracle. Per informazioni sull'integrazione di Amazon S3 per Oracle, consultare Integrazione Amazon S3.

  • Se l'opzione SSL Oracle è configurata per ogni istanza, è possibile stabilire collegamenti di database tra istanze database di Oracle tramite un endpoint SSL/TLS. Non è richiesta alcuna configurazione aggiuntiva. Per ulteriori informazioni, consulta Oracle Secure Sockets Layer.

Passaggio 1: ottieni il certificato root per un sito Web

Per consentire all'istanza DB RDS for Oracle di stabilire connessioni sicure a un sito Web, aggiungi il certificato CA principale. Amazon RDS utilizza il certificato root per firmare il certificato del sito Web al portafoglio Oracle.

È possibile ottenere il certificato root in vari modi. Ad esempio, puoi eseguire le operazioni seguenti:

  1. Utilizza un server Web per visitare il sito Web protetto dal certificato.

  2. Scarica il certificato root utilizzato per la firma.

Per i servizi AWS, i certificati root sono in genere disponibili nell'Amazon Trust Services Repository.

Passaggio 2: crea un portafoglio Oracle

Crea un portafoglio Oracle contenente sia i certificati del server Web che i certificati di autenticazione client. L'istanza Oracle RDS utilizza il certificato del server Web per stabilire una connessione sicura al sito Web. Il sito Web ha bisogno del certificato client per autenticare l'utente del database Oracle.

È possibile configurare connessioni sicure senza utilizzare certificati client per l'autenticazione. In questo caso, puoi ignorare i passaggi del keystore Java nella seguente procedura.

Per creare un portafoglio Oracle
  1. Posiziona i certificati root e client in un'unica directory, quindi passa a questa directory.

  2. Converti il certificato client .p12 nel keystore Java.

    Nota

    Se non utilizzi certificati client per l'autenticazione, puoi ignorare questo passaggio.

    Nell'esempio seguente viene convertito il certificato client denominato client_certificate.p12 nel keystore Java denominato client_keystore.jks. Il keystore viene quindi incluso nel portafoglio Oracle. La password del keystore è P12PASSWORD.

    orapki wallet pkcs12_to_jks -wallet ./client_certificate.p12 -jksKeyStoreLoc ./client_keystore.jks -jksKeyStorepwd P12PASSWORD
  3. Crea una directory per il tuo portafoglio Oracle diversa dalla directory dei certificati.

    Nell'esempio seguente viene creata la directory /tmp/wallet.

    mkdir -p /tmp/wallet
  4. Crea un portafoglio Oracle nella directory del portafoglio.

    Nell'esempio seguente viene impostata la password del portafoglio Oracle su P12PASSWORD, che è la stessa password utilizzata dal keystore Java in un passaggio precedente. L'utilizzo della stessa password è comodo, ma non necessario. Il parametro -auto_login attiva la caratteristica di accesso automatico, in modo che non sia necessario specificare una password ogni volta che si desidera accedervi.

    Nota

    Specifica una password diversa dal prompt mostrato qui come best practice per la sicurezza.

    orapki wallet create -wallet /tmp/wallet -pwd P12PASSWORD -auto_login
  5. Aggiungi il keystore Java al tuo portafoglio Oracle.

    Nota

    Se non utilizzi certificati client per l'autenticazione, puoi ignorare questo passaggio.

    Nell'esempio seguente viene aggiunto il keystore client_keystore.jks al portafoglio Oracle denominato /tmp/wallet. In questo esempio, si specifica la stessa password del keystore Java e del portafoglio Oracle.

    orapki wallet jks_to_pkcs12 -wallet /tmp/wallet -pwd P12PASSWORD -keystore ./client_keystore.jks -jkspwd P12PASSWORD
  6. Aggiungi il certificato root per il tuo sito Web di destinazione al portafoglio Oracle.

    Nell'esempio seguente viene aggiunto un certificato denominato Root_CA.cer.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Root_CA.cer -pwd P12PASSWORD
  7. Aggiungi eventuali certificati intermedi.

    Nell'esempio seguente viene aggiunto un certificato denominato Intermediate.cer. Ripeti questo passaggio tutte le volte necessarie per caricare tutti i certificati intermedi.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Intermediate.cer -pwd P12PASSWORD
  8. Verifica che il tuo portafoglio Oracle appena creato disponga dei certificati richiesti.

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

Passaggio 3: scarica il tuo portafoglio Oracle nella tua istanza RDS for Oracle

In questo passaggio, carichi il tuo portafoglio Oracle su Amazon S3 e poi scarichi il portafoglio da Amazon S3 nella tua istanza RDS for Oracle.

Per scaricare il tuo portafoglio Oracle nella tua istanza database RDS for Oracle
  1. Completare i prerequisiti per l'integrazione di Amazon S3 con Oracle e aggiungere l'opzione S3_INTEGRATION all'istanza database Oracle. Assicurarsi che il ruolo IAM per l'opzione abbia accesso al bucket Amazon S3 che si sta utilizzando.

    Per ulteriori informazioni, consulta Integrazione Amazon S3.

  2. Accedei all'istanza database come utente principale e quindi crea una directory Oracle per contenere il portafoglio Oracle.

    Nell'esempio seguente viene creata una directory Oracle denominata WALLET_DIR.

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

    Per ulteriori informazioni, consulta Creazione ed eliminazione di directory nello spazio di archiviazione dati principale.

  3. Carica il portafoglio Oracle sul tuo bucket Amazon S3.

    Puoi utilizzare qualsiasi tecnica di caricamento supportata.

  4. Se stai ricaricando un portafoglio Oracle, elimina il portafoglio esistente. Altrimenti, passare alla fase successiva.

    Nell'esempio seguente viene rimosso il portafoglio esistente denominato cwallet.sso.

    EXEC UTL_FILE.FREMOVE ('WALLET_DIR','cwallet.sso');
  5. Scarica il portafoglio Oracle dal bucket Amazon S3 sull'istanza database Oracle.

    Nell'esempio seguente viene scaricato il portafoglio denominato cwallet.sso dal bucket Amazon S3 denominato my_s3_bucket nella directory dell'istanza database denominata WALLET_DIR.

    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. (Facoltativo) Scarica un portafoglio Oracle protetto da password.

    Scarica questo portafoglio solo se vuoi richiedere una password per ogni utilizzo del portafoglio. Nell'esempio seguente viene scaricato il portafoglio protetto da password ewallet.p12.

    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. Verifica lo stato dell'attività del database.

    Sostituisci l'ID attività restituito dai passaggi precedenti per dbtask-1234567890123-4567.log nell'esempio seguente.

    SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-4567.log'));
  8. Controlla il contenuto della directory che stai utilizzando per memorizzare il portafoglio Oracle.

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

    Per ulteriori informazioni, consulta Generazione di un elenco dei file in una directory di istanze database.

Passaggio 4: concedi le autorizzazioni utente per il portafoglio Oracle

Puoi creare un nuovo utente database o configurare un utente esistente. In entrambi i casi, è necessario configurare l'utente per accedere al portafoglio Oracle per le connessioni sicure e l'autenticazione client tramite certificati.

Per concedere autorizzazioni utente per il portafoglio Oracle
  1. Accedi all'istanza database RDS for Oracle come utente principale.

  2. Se non desideri configurare un utente del database esistente, creare un nuovo utente. Altrimenti, passare alla fase successiva.

    Nell'esempio seguente viene creato un utente del database denominato my-user.

    CREATE USER my-user IDENTIFIED BY my-user-pwd; GRANT CONNECT TO my-user;
  3. Concedi l'autorizzazione all'utente del database nella directory contenente il portafoglio Oracle.

    L'esempio seguente consente l'accesso in lettura all'utente my-user nella directory WALLET_DIR.

    GRANT READ ON DIRECTORY WALLET_DIR TO my-user;
  4. Concedi l'autorizzazione all'utente del database per utilizzare il pacchetto UTL_HTTP.

    Il seguente programma PL/SQL garantisce a UTL_HTTP l'accesso all'utente my-user.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  5. Concedi l'autorizzazione all'utente del database per utilizzare il pacchetto UTL_FILE.

    Il seguente programma PL/SQL garantisce a UTL_FILE l'accesso all'utente my-user.

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

Passaggio 5: configura l'accesso a un sito Web dall'istanza database

In questa fase, configuri l'utente del database Oracle in modo che possa connettersi al sito Web di destinazione utilizzando UTL_HTTP, il portafoglio Oracle caricato e il certificato client. Per ulteriori informazioni, consulta Configuring Access Control to an Oracle Wallet (Configurazione del controllo dell'accesso a un portafoglio Oracle) nella documentazione di Oracle Database.

Per configurare l'accesso a un sito Web dall'istanza database RDS for Oracle
  1. Accedi all'istanza database RDS for Oracle come utente principale.

  2. Crea una voce di controllo dell'accesso (ACE) host per il tuo utente e il sito Web di destinazione su una porta sicura.

    L'esempio seguente configura my-user per accedere a secret.encrypted-website.com sulla porta 443 sicura.

    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; /
    Importante

    L'unità di programma precedente può causare il seguente errore:. PLS-00201: identifier 'XS_ACL' must be declared Se viene restituito questo errore, sostituisci la riga che assegna un valore principal_type con la riga seguente, quindi riesegui l'unità di programma:

    principal_type => 2));

    Per ulteriori informazioni sulle costanti nel pacchetto PL/SQLXS_ACL, vedere Real Application Security Administrator's and Developer's Guide nella documentazione di Oracle Database.

    Per ulteriori informazioni, consulta Configuring Access Control for External Network Services (Configurazione del controllo dell'accesso per servizi di rete esterni) nella documentazione di Oracle Database.

  3. (Facoltativo) Crea un ACE per il tuo sito Web utente e di destinazione sulla porta standard.

    Potrebbe essere necessario utilizzare la porta standard se alcune pagine Web sono servite dalla porta standard del server Web (80) anziché dalla porta sicura (443).

    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. Verifica che le voci di controllo dell'accesso siano presenti.

    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. Concedi l'autorizzazione all'utente del database per utilizzare il pacchetto UTL_HTTP.

    Il seguente programma PL/SQL garantisce a UTL_HTTP l'accesso all'utente my-user.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  6. Conferma l'esistenza di liste di controllo dell'accesso correlate.

    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. Concedi l'autorizzazione all'utente del database di utilizzare i certificati per l'autenticazione client e il portafoglio Oracle per le connessioni.

    Nota

    Se non utilizzi certificati client per l'autenticazione, puoi ignorare questo passaggio.

    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; /

Passaggio 6: testa le connessioni dall'istanza database a un sito Web

In questa fase, configuri l'utente del database in modo che possa connettersi al sito Web utilizzando UTL_HTTP, il portafoglio Oracle caricato e il certificato client.

Per configurare l'accesso a un sito Web dall'istanza database RDS for Oracle
  1. Accedi all'istanza database RDS for Oracle come utente del database con autorizzazioni UTL_HTTP.

  2. Conferma che una connessione al sito Web di destinazione può risolvere l'indirizzo host.

    Nell'esempio seguente si ottiene l'indirizzo host da secret.encrypted-website.com.

    SELECT UTL_INADDR.GET_HOST_ADDRESS(host => 'secret.encrypted-website.com') FROM DUAL;
  3. Testa una connessione non riuscita.

    La seguente query ha esito negativo perché UTL_HTTP richiede la posizione del portafoglio Oracle con i certificati.

    SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  4. Verifica l'accesso al sito web utilizzando UTL_HTTP.SET_WALLET e selezionando da DUAL.

    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. (Facoltativo) Testa l'accesso al sito Web memorizzando la query in una variabile e utilizzando EXECUTE IMMEDIATE.

    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. (Facoltativo) Individua la posizione del file system della directory del portafoglio Oracle.

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

    Utilizza l'output del comando precedente per effettuare una richiesta HTTP. Ad esempio, se la directory è rdsdbdata/userdirs/01, esegui la seguente query.

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