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 nelle istanze database RDS per Oracle. Per connettere l'istanza DB alla rete, è possibile utilizzare i seguenti PL/SQL pacchetti:

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 TCP/IP lato client nelle PL/SQL. This package is useful to PL/SQL applicazioni che utilizzano protocolli Internet e posta elettronica. 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, valuta quanto segue:

  • Puoi utilizzare SMTP con l’opzione UTL_MAIL. Per ulteriori informazioni, consulta UTL_MAIL di Oracle.

  • 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 Impostazione di un server DNS personalizzato.

    • 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 connettersi in modo sicuro alle SSL/TLS risorse remote, si consiglia di 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

Affinché l’istanza database RDS per Oracle possa stabilire connessioni sicure a un sito web, aggiungi il certificato CA root. 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 quanto riguarda AWS i servizi, i certificati root in genere risiedono nell'archivio Amazon Trust Services.

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.

    L'esempio seguente converte 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.

    L'esempio seguente imposta la password del wallet Oracle suP12PASSWORD, 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.

    L'esempio seguente aggiunge il keystore client_keystore.jks al wallet 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.

    L'esempio seguente aggiunge un certificato denominatoRoot_CA.cer.

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

    L'esempio seguente aggiunge un certificato denominatoIntermediate.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.

    L'esempio seguente crea una directory Oracle denominataWALLET_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.

    L'esempio seguente rimuove il wallet esistente, denominatocwallet.sso.

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

    L'esempio seguente scarica il wallet denominato cwallet.sso dal bucket Amazon S3 denominato nella directory dell'istanza DB denominatamy_s3_bucket. 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. L'esempio seguente scarica un 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 dell'attività restituito dai passaggi precedenti con quello riportato nell'esempio dbtask-1234567890123-4567.log 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.

    L'esempio seguente crea 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 concede l'accesso in lettura all'utente my-user sulla directoryWALLET_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 PL/SQL programma concede 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 PL/SQL programma concede 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 l'accesso my-user alla porta sicura secret.encrypted-website.com 443.

    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ò restituire il seguente errore: PLS-00201: identifier 'XS_ACL' must be declared. Se viene restituito questo errore, sostituisci la riga che assegna un valore a principal_type con la riga seguente, quindi esegui nuovamente l’unità di programma:

    principal_type => 2));

    Per ulteriori informazioni sulle costanti del PL/SQL pacchettoXS_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 PL/SQL programma concede 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.

    L'esempio seguente ottiene l'indirizzo dell'host dasecret.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;