Configuration de l'accès UTL_HTTP à l'aide de certificats et d'un portefeuille Oracle - Amazon Relational Database Service

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Configuration de l'accès UTL_HTTP à l'aide de certificats et d'un portefeuille Oracle

Amazon RDS prend en charge l'accès réseau sortant sur votre RDS pour les instances de base de données Oracle. Pour connecter votre instance de base de données au réseau, vous pouvez utiliser les packages PL/SQL suivants :

UTL_HTTP

Ce package effectue des appels HTTP depuis SQL et PL/SQL. Vous pouvez l'utiliser pour accéder à des données sur Internet via HTTP. Pour plus d'informations, consultez UTL_HTTP dans la documentation Oracle.

UTL_TCP

Ce package fournit la fonction d'accès côté client TCP/IP dans PL/SQL. Ce package est utile pour les applications PL/SQL qui utilisent les protocoles Internet et les e-mails. Pour plus d'informations, consultez UTL_TCP dans la documentation Oracle.

UTL_SMTP

Ce package fournit des interfaces aux commandes SMTP qui permettent à un client d'envoyer des e-mails à un serveur SMTP. Pour plus d'informations, consultez UTL_SMTP dans la documentation Oracle.

En effectuant les tâches suivantes, vous pouvez configurer UTL_HTTP.REQUEST pour qu'il fonctionne avec des sites web nécessitant des certificats d'authentification client pendant la liaison SSL. Vous pouvez également configurer l'authentification par mot de passe pour permettre à UTL_HTTP d'accéder aux sites web en modifiant les commandes de génération de portefeuilles Oracle et la procédure DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE. Pour plus d'informations, veuillez consulter DBMS_NETWORK_ACL_ADMIN dans la documentation de la base de données Oracle.

Note

Vous pouvez adapter les tâches suivantes pour UTL_SMTP afin d'envoyer des e-mails via SSL/TLS (y compris Amazon Simple Email Service).

Considérations relatives à la configuration de l'accès UTL_HTTP

Avant de configurer l'accès, tenez compte des points suivants :

  • Vous pouvez utiliser le protocole SMTP avec l'option UTL_MAIL. Pour plus d'informations, consultez Oracle UTL_MAIL.

  • Le nom DNS (Domain Name Server) de l'hôte distant doit avoir l'une des caractéristiques suivantes :

    • être publiquement résolu ;

    • être le point de terminaison d'une instance de base de données Amazon RDS ;

    • pouvant être résolu via un serveur DNS personnalisé. Pour plus d'informations, consultez Configuration d'un serveur DNS personnalisé.

    • être le nom DNS privé d'une instance Amazon EC2 dans le même VPC ou un VPC appairé. Dans ce cas, assurez-vous que le nom peut être résolu via un serveur DNS personnalisé. De même, pour utiliser le DNS fourni par Amazon, vous pouvez activer l'attribut enableDnsSupport dans les paramètres VPC et activer la prise en charge de la résolution DNS pour la connexion d'appairage de VPC. Pour plus d'informations, consultez Prise en charge du DNS dans votre VPC et Modification de votre connexion d'appairage de VPC.

    • Pour vous connecter en toute sécurité à des ressources SSL/TLS distantes, nous vous recommandons de créer et de charger des portefeuilles Oracle personnalisés. En utilisant l'intégration de Amazon S3 à la fonction Amazon RDS for Oracle, vous pouvez télécharger un portefeuille depuis Amazon S3 vers des instances de base de données Oracle. Pour plus d'informations sur l'intégration de Amazon S3 pour Oracle, consultez Intégration Amazon S3.

  • Vous pouvez établir des liens de base de données entre des instances de base de données Oracle via un point de terminaison SSL/TLS si l'option Oracle SSL est configurée pour chaque instance. Aucune autre configuration n'est requise. Pour plus d'informations, consultez Oracle Secure Sockets Layer (SSL).

Étape 1 : Obtenir le certificat racine d'un site web

Pour que l'instance de base de données RDS pour Oracle établisse des connexions sécurisées à un site Web, ajoutez le certificat CA racine. Amazon RDS utilise le certificat racine pour signer le certificat de site web au portefeuille Oracle.

Vous pouvez obtenir le certificat racine de différentes manières. Par exemple, vous pouvez effectuer les opérations suivantes :

  1. Utilisez un serveur web pour visiter le site web sécurisé par le certificat.

  2. Téléchargez le certificat racine utilisé pour la signature.

Pour les services AWS, les certificats racines résident généralement dans le Référentiel des services d'approbation Amazon.

Étape 2 : Créer un portefeuille Oracle

Créez un portefeuille Oracle contenant à la fois les certificats du serveur web et les certificats d'authentification client. L'instance Oracle RDS utilise le certificat du serveur web pour établir une connexion sécurisée au site web. Le site web a besoin du certificat client pour authentifier l'utilisateur de la base de données Oracle.

Vous pouvez configurer des connexions sécurisées sans utiliser de certificats clients pour l'authentification. Dans ce cas, vous pouvez ignorer les étapes du keystore Java dans la procédure suivante.

Pour créer un portefeuille Oracle
  1. Placez les certificats racine et client dans un seul répertoire, puis passez dans ce répertoire.

  2. Convertissez le certificat client .p12 en keystore Java.

    Note

    Si vous n'utilisez pas de certificats client pour l'authentification, vous pouvez ignorer cette étape.

    L'exemple suivant convertit le certificat client nommé client_certificate.p12 vers le keystore Java nommé client_keystore.jks. Le keystore est alors inclus dans le portefeuille Oracle. Le mot de passe du keystore est P12PASSWORD.

    orapki wallet pkcs12_to_jks -wallet ./client_certificate.p12 -jksKeyStoreLoc ./client_keystore.jks -jksKeyStorepwd P12PASSWORD
  3. Créez un répertoire pour votre portefeuille Oracle qui est différent du répertoire de certificat.

    L'exemple suivant crée le répertoire /tmp/wallet.

    mkdir -p /tmp/wallet
  4. Créez un portefeuille Oracle dans votre répertoire de portefeuille.

    L'exemple suivant définit le mot de passe du portefeuille Oracle sur P12PASSWORD, qui est le même mot de passe utilisé par le keystore Java lors d'une étape précédente. L'utilisation du même mot de passe est pratique, mais pas nécessaire. Le paramètre -auto_login active la fonction de connexion automatique, de sorte que vous n'avez pas besoin de spécifier un mot de passe chaque fois que vous souhaitez y accéder.

    Note

    Spécifiez un mot de passe autre que celui indiqué ici, en tant que bonne pratique de sécurité.

    orapki wallet create -wallet /tmp/wallet -pwd P12PASSWORD -auto_login
  5. Ajoutez le keystore Java à votre portefeuille Oracle.

    Note

    Si vous n'utilisez pas de certificats client pour l'authentification, vous pouvez ignorer cette étape.

    L'exemple suivant ajoute le keystore client_keystore.jks au portefeuille Oracle nommé /tmp/wallet. Dans cet exemple, vous spécifiez le même mot de passe pour le keystore Java et pour le portefeuille Oracle.

    orapki wallet jks_to_pkcs12 -wallet /tmp/wallet -pwd P12PASSWORD -keystore ./client_keystore.jks -jkspwd P12PASSWORD
  6. Ajoutez le certificat racine de votre site web cible au portefeuille Oracle.

    L'exemple suivant ajoute un certificat nommé Root_CA.cer.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Root_CA.cer -pwd P12PASSWORD
  7. Ajoutez les certificats intermédiaires.

    L'exemple suivant ajoute un certificat nommé Intermediate.cer. Répétez cette étape autant de fois que nécessaire pour charger tous les certificats intermédiaires.

    orapki wallet add -wallet /tmp/wallet -trusted_cert -cert ./Intermediate.cer -pwd P12PASSWORD
  8. Vérifiez que votre nouveau portefeuille Oracle possède les certificats requis.

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

Étape 3 : Télécharger votre portefeuille Oracle sur votre instance RDS for Oracle

Au cours de cette étape, vous chargez votre portefeuille Oracle sur Amazon S3, puis vous téléchargez le portefeuille depuis Amazon S3 vers votre instance RDS for Oracle.

Pour télécharger votre portefeuille Oracle sur votre instance de base de données RDS for Oracle
  1. Respectez les conditions préalables de l'intégration de Amazon S3 à Oracle et ajoutez l'option S3_INTEGRATION à votre instance de base de données Oracle. Assurez-vous que le rôle IAM pour l'option a accès au compartiment Amazon S3 que vous utilisez.

    Pour plus d'informations, consultez Intégration Amazon S3.

  2. Connectez-vous à votre instance de base de données en tant qu'utilisateur principal, puis créez un répertoire Oracle qui contiendra le portefeuille Oracle.

    L'exemple suivant crée un répertoire Oracle nommé WALLET_DIR.

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

    Pour plus d'informations, consultez Création et suppression de répertoires dans l'espace de stockage de données principal.

  3. Chargez le portefeuille Oracle dans votre compartiment Amazon S3.

    Vous pouvez utiliser n'importe quelle technique de téléchargement prise en charge.

  4. Si vous téléchargez à nouveau un portefeuille Oracle, supprimez le portefeuille existant. Sinon, passez à l'étape suivante.

    L'exemple suivant supprime le portefeuille existant, nommé cwallet.sso.

    EXEC UTL_FILE.FREMOVE ('WALLET_DIR','cwallet.sso');
  5. Téléchargez le portefeuille depuis votre compartiment Amazon S3 vers l'instance de base de données Oracle.

    L'exemple suivant télécharge le portefeuille nommé cwallet.sso à partir du compartiment Amazon S3 nommé my_s3_bucket vers le répertoire d'instance de base de données nommé 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. (Facultatif) Téléchargez un portefeuille Oracle protégé par un mot de passe.

    Téléchargez ce portefeuille uniquement si vous souhaitez demander un mot de passe pour chaque utilisation du portefeuille. L'exemple suivant télécharge le portefeuille protégé par un mot de passe nommé 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. Vérifiez l'état de votre tâche de base de données.

    Remplacez l'ID de tâche renvoyé par les étapes précédentes pour dbtask-1234567890123-4567.log dans l'exemple suivant.

    SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','dbtask-1234567890123-4567.log'));
  8. Vérifiez le contenu du répertoire que vous utilisez pour stocker le portefeuille Oracle.

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

    Pour plus d'informations, consultez Établissement de la liste des fichiers situés dans un répertoire d'instance de base de données.

Étape 4 : Accorder des autorisations utilisateur pour le portefeuille Oracle

Vous pouvez créer un nouvel utilisateur de base de données ou configurer un utilisateur existant. Dans les deux cas, vous devez configurer l'utilisateur pour qu'il accède au portefeuille Oracle pour des connexions sécurisées et une authentification client à l'aide de certificats.

Pour accorder des autorisations utilisateur pour le portefeuille Oracle
  1. Connectez-vous à votre instance de base de données RDS for Oracle en tant qu'utilisateur principal.

  2. Si vous ne souhaitez pas configurer un utilisateur de base de données existant, créez un nouvel utilisateur. Sinon, passez à l'étape suivante.

    L'exemple suivant crée un utilisateur de base de données nommé my-user.

    CREATE USER my-user IDENTIFIED BY my-user-pwd; GRANT CONNECT TO my-user;
  3. Accordez l'autorisation à l'utilisateur de votre base de données pour le répertoire contenant votre portefeuille Oracle.

    L'exemple suivant accorde l'accès en lecture à l'utilisateur my-user au répertoire WALLET-DIR.

    GRANT READ ON DIRECTORY WALLET_DIR TO my-user;
  4. Accordez l'autorisation à votre utilisateur de base de données d'utiliser le package UTL_HTTP.

    Le programme PL/SQL suivant accorde l'accès UTL_HTTP à l'utilisateurmy-user.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  5. Accordez l'autorisation à votre utilisateur de base de données d'utiliser le package UTL_FILE.

    Le programme PL/SQL suivant accorde l'accès UTL_FILE à l'utilisateurmy-user.

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

Étape 5 : Configurer l'accès à un site web à partir de votre instance de base de données

Dans cette étape, vous configurez votre utilisateur de base de données Oracle afin qu'il puisse se connecter à votre site web cible à l'aide de UTL_HTTP, de votre portefeuille Oracle chargé et du certificat client. Pour de plus amples informations, veuillez consulter Configuring Access Control to an Oracle Wallet dans la documentation de la base de données Oracle.

Pour configurer l'accès à un site web depuis votre instance de base de données RDS for Oracle
  1. Connectez-vous à votre instance de base de données RDS for Oracle en tant qu'utilisateur principal.

  2. Créez une entrée Host Access Control Entry (ACE) pour votre utilisateur et le site web cible sur un port sécurisé.

    L'exemple suivant configure my-user pour qu'il accède à secret.encrypted-website.com sur le port sécurisé 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; /
    Important

    L'unité de programme précédente peut entraîner l'erreur suivante : PLS-00201: identifier 'XS_ACL' must be declared Si cette erreur est renvoyée, remplacez la ligne qui affecte une valeur à principal_type par la ligne suivante, puis réexécutez l'unité de programme :

    principal_type => 2));

    Pour plus d'informations sur les constantes du package PL/SQLXS_ACL, consultez le guide de l'administrateur et du développeur de Real Application Security dans la documentation de la base de données Oracle.

    Pour de plus amples informations, veuillez consulter Configuring Access Control for External Network Services dans la documentation de la base de données Oracle.

  3. (Facultatif) Créez une ACE pour votre utilisateur et votre site web cible sur le port standard.

    Vous devrez peut-être utiliser le port standard si certaines pages web sont diffusées à partir du port du serveur web standard (80) au lieu du port sécurisé (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. Vérifiez que les entrées de contrôle d'accès existent.

    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. Accordez l'autorisation à votre utilisateur de base de données d'utiliser le package UTL_HTTP.

    Le programme PL/SQL suivant accorde l'accès UTL_HTTP à l'utilisateurmy-user.

    BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('my-user')); END; /
  6. Vérifiez que les listes de contrôle d'accès associées existent.

    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. Accordez l'autorisation à votre utilisateur de base de données d'utiliser des certificats pour l'authentification client et votre portefeuille Oracle pour les connexions.

    Note

    Si vous n'utilisez pas de certificats client pour l'authentification, vous pouvez ignorer cette étape.

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

Étape 6 : Tester les connexions de votre instance de base de données à un site web

Dans cette étape, vous configurez votre utilisateur de base de données afin qu'il puisse se connecter au site web cible à l'aide de UTL_HTTP, de votre portefeuille Oracle chargé et du certificat client.

Pour configurer l'accès à un site web depuis votre instance de base de données RDS for Oracle
  1. Connectez-vous à votre instance de base de données RDS for Oracle en tant qu'utilisateur de base de données avec les autorisation UTL_HTTP.

  2. Vérifiez qu'une connexion à votre site web cible peut résoudre l'adresse de l'hôte.

    L'exemple suivant montre l'adresse de l'hôte depuis secret.encrypted-website.com.

    SELECT UTL_INADDR.GET_HOST_ADDRESS(host => 'secret.encrypted-website.com') FROM DUAL;
  3. Testez une connexion échouée.

    La requête suivante échoue car UTL_HTTP nécessite l'emplacement du portefeuille Oracle avec les certificats.

    SELECT UTL_HTTP.REQUEST('secret.encrypted-website.com') FROM DUAL;
  4. Testez l'accès au site web en utilisant UTL_HTTP.SET_WALLET et en sélectionnant depuis 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. (Facultatif) Testez l'accès au site web en stockant votre requête dans une variable et en utilisant 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. (Facultatif) Recherchez l'emplacement du système de fichiers de votre répertoire de portefeuille Oracle.

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

    Utilisez la sortie de la commande précédente pour effectuer une requête HTTP. Par exemple, si le répertoire est rdsdbdata/userdirs/01, exécutez la requête suivante.

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