Configuración del acceso UTL_HTTP mediante certificados y un wallet de Oracle.
Amazon RDS admite el acceso a la red saliente en las instancias de base de datos de RDS para Oracle. Para conectar la instancia de base de datos a la red, puede utilizar los siguientes paquetes PL/SQL:
UTL_HTTP
-
Este paquete realiza llamadas HTTP desde SQL y PL/SQL. Puede usarlo para acceder a los datos de Internet a través de HTTP. Para obtener más información, consulte UTL_HTTP
en la documentación de Oracle. UTL_TCP
-
Este paquete proporciona funcionalidad de acceso del lado del cliente TCP/IP en PL/SQL. Este paquete es útil para aplicaciones PL/SQL que utilizan protocolos de Internet y correo electrónico. Para obtener más información, consulte UTL_TCP
en la documentación de Oracle. UTL_SMTP
-
Este paquete proporciona interfaces a los comandos SMTP que permiten a un cliente enviar correos electrónicos a un servidor SMTP. Para obtener más información, consulte UTL_SMTP
en la documentación de Oracle.
Al completar las siguientes tareas, puede configurar UTL_HTTP.REQUEST
para trabajar con sitios web que requieren certificados de autenticación de cliente durante el protocolo de enlace SSL. También puede configurar la autenticación por contraseña para el acceso de UTL_HTTP
a sitios web modificando los comandos de generación de wallets de Oracle y el procedimiento DBMS_NETWORK_ACL_ADMIN.APPEND_WALLET_ACE
. Para más información, consulte DBMS_NETWORK_ACL_ADMIN
nota
Puede adaptar las siguientes tareas para UTL_SMTP
, que le permite enviar correos electrónicos a través de SSL/TLS (por ejemplo, Amazon Simple Email Service
Temas
- Consideraciones al configurar el acceso UTL_HTTP
- Paso 1: obtener el certificado raíz de un sitio web
- Paso 2: crear un wallet de Oracle
- Paso 3: descargar el wallet de Oracle en su instancia de RDS for Oracle
- Paso 4: conceder permisos de usuario para el wallet de Oracle
- Paso 5: configurar el acceso a un sitio web desde la instancia de base de datos
- Paso 6: probar las conexiones desde la instancia de base de datos a un sitio web
Consideraciones al configurar el acceso UTL_HTTP
Tenga en cuenta lo siguiente antes de configurar el acceso:
-
Puede utilizar SMTP con la opción UTL_MAIL. Para obtener más información, consulte Oracle UTL_MAIL.
-
El nombre en el servidor de nombres de dominio (DNS) del host remoto puede ser cualquiera de los siguientes:
-
Uno que se pueda resolver públicamente.
-
El punto de enlace de una instancia de base de datos de Amazon RDS.
-
Uno que se pueda resolver a través de un servidor DNS personalizado. Para obtener más información, consulte Configuración de un servidor DNS personalizado.
-
El nombre de DNS privado de una instancia de Amazon EC2 de la misma VPC o de una VPC interconectada. En este caso, asegúrese de que el nombre se pueda resolver a través de un servidor DNS personalizado. Para utilizar el DNS proporcionado por Amazon, también puede activar el atributo
enableDnsSupport
en la configuración de la VPC y activar la compatibilidad con la resolución de DNS para la interconexión de VPC. Para obtener más información, consulte Compatibilidad de DNS en su VPC y Modificación de las opciones de conexión de interconexión de VPC. -
Para conectarse de forma segura a recursos remotos SSL/TLS, le recomendamos que cree y cargue Oracle Wallets personalizados. Utilice la integración de Simple Storage Service (Amazon S3) con la característica de Amazon RDS for Oracle para descargar un wallet de su Amazon S3 en instancias de base de datos de Oracle. Para obtener información sobre la integración de Amazon S3 para Oracle, consulte Integración de Amazon S3.
-
-
Puede establecer enlaces de base de datos entre las instancias de base de datos de Oracle a través de un punto de enlace SSL/TLS si la opción de Oracle SSL está configurada para cada instancia. No se necesitan más configuraciones. Para obtener más información, consulte Capa de conexión segura de Oracle.
Paso 1: obtener el certificado raíz de un sitio web
Para que la instancia de base de datos de RDS para Oracle establezca conexiones seguras con un sitio web, agregue el certificado de entidad de certificación raíz. Amazon RDS utiliza el certificado raíz para firmar el certificado del sitio web en el wallet de Oracle.
Puede obtener el certificado raíz de varias formas. Por ejemplo, puede hacer lo siguiente:
-
Utilice un servidor web para visitar el sitio web protegido por el certificado.
-
Descargue el certificado raíz que se utilizó para la firma.
Para los servicios de AWS, los certificados raíz suelen residir en el repositorio de Amazon trust services
Paso 2: crear un wallet de Oracle
Cree un wallet de Oracle que contenga tanto los certificados del servidor web como los certificados de autenticación del cliente. La instancia de RDS Oracle utiliza el certificado del servidor web para establecer una conexión segura con el sitio web. El sitio web necesita el certificado del cliente para autenticar al usuario de la base de datos Oracle.
Es posible que desee configurar conexiones seguras sin utilizar certificados de cliente para la autenticación. En este caso, puede omitir los pasos del almacén de claves de Java en el siguiente procedimiento.
Para crear un wallet de Oracle
-
Coloque los certificados raíz y de cliente en un único directorio y, a continuación, cambie a este directorio.
-
Convierta el certificado de cliente .p12 en el almacén de claves de Java.
nota
Si no utiliza los certificados de cliente para la autenticación, puede omitir este paso.
El siguiente ejemplo convierte el certificado de cliente denominado
client_certificate.p12
en el almacén de claves de Java denominadoclient_keystore.jks
. El almacén de claves se incluye en el wallet de Oracle. La contraseña del almacén de claves esP12PASSWORD
.orapki wallet pkcs12_to_jks -wallet ./
client_certificate.p12
-jksKeyStoreLoc ./client_keystore.jks
-jksKeyStorepwdP12PASSWORD
-
Cree un directorio para el wallet de Oracle que sea diferente del directorio del certificado.
El siguiente ejemplo crea el directorio
/tmp/wallet
.mkdir -p
/tmp/wallet
-
Cree un wallet de Oracle en su directorio de wallets.
El siguiente ejemplo establece la contraseña del wallet de Oracle como
P12PASSWORD
, que es la misma contraseña utilizada por el almacén de claves de Java en un paso anterior. Es conveniente utilizar la misma contraseña, pero no es necesario. El parámetro-auto_login
activa la característica de inicio de sesión automático, para que no sea necesario especificar una contraseña cada vez que se quiera acceder.nota
Especifique una contraseña distinta de la que se muestra aquí como práctica recomendada de seguridad.
orapki wallet create -wallet
/tmp/wallet
-pwdP12PASSWORD
-auto_login -
Agregue el almacén de claves de Java al wallet de Oracle.
nota
Si no utiliza los certificados de cliente para la autenticación, puede omitir este paso.
En el siguiente ejemplo se agrega el almacén de claves
cliente_keystore.jks
al wallet de Oracle denominado/tmp/wallet
. En este ejemplo, se especifica la misma contraseña para el almacén de claves de Java y el wallet de Oracle.orapki wallet jks_to_pkcs12 -wallet
/tmp/wallet
-pwdP12PASSWORD
-keystore ./client_keystore.jks
-jkspwdP12PASSWORD
-
Agregue el certificado raíz de su sitio web de destino al Oracle Wallet.
En el siguiente ejemplo se agrega un certificado denominado
Root_CA.cer
.orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Root_CA.cer
-pwdP12PASSWORD
-
Agregue los certificados intermedios.
El siguiente ejemplo agrega un certificado denominado
Intermediate.cer
. Repita este paso tantas veces como sea necesario para cargar todos los certificados intermedios.orapki wallet add -wallet
/tmp/wallet
-trusted_cert -cert ./Intermediate.cer
-pwdP12PASSWORD
-
Confirme que el wallet de Oracle recién creado tenga los certificados necesarios.
orapki wallet display -wallet
/tmp/wallet
-pwdP12PASSWORD
Paso 3: descargar el wallet de Oracle en su instancia de RDS for Oracle
En este paso, cargue el wallet de Oracle en Simple Storage Service (Amazon S3) y, a continuación, descargue el wallet de Amazon S3 en su instancia de RDS para Oracle.
Para descargar el wallet de Oracle en su instancia de base de datos de RDS for Oracle.
-
Complete los requisitos previos para la integración de Amazon S3 con Oracle y añada la opción
S3_INTEGRATION
a su instancia de base de datos de Oracle. Asegúrese de que el rol de IAM para la opción disponga de acceso al bucket de Amazon S3 que está utilizando.Para obtener más información, consulte Integración de Amazon S3.
-
Inicie sesión en su instancia de base de datos como usuario principal y, a continuación, cree un directorio de Oracle para albergar el wallet de Oracle.
El siguiente ejemplo crea un directorio de Oracle llamado
WALLET_DIR
.EXEC rdsadmin.rdsadmin_util.create_directory('
WALLET_DIR
');Para obtener más información, consulte Creación y eliminación de directorios en el espacio de almacenamiento de datos principal.
-
Cargue el Oracle Wallet en el bucket de Simple Storage Service (Amazon S3).
Puede usar cualquier técnica de carga compatible.
-
Si va a volver a cargar un wallet de Oracle, elimine el wallet existente. De no ser así, vaya al siguiente paso.
El siguiente ejemplo elimina el wallet existente, cuyo nombre es
cwallet.sso
.EXEC UTL_FILE.FREMOVE ('
WALLET_DIR
','cwallet.sso
'); -
Descargue el Oracle Wallet desde su bucket de Simple Storage Service (Amazon S3) a la instancia de base de datos de Oracle.
El siguiente ejemplo descarga el wallet llamado
cwallet.sso
desde el bucket de Simple Storage Service (Amazon S3) llamadomy_s3_bucket
al directorio de la instancia de base de datos llamadoWALLET_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; -
(Opcional) Descargue un wallet de Oracle protegido por contraseña.
Descargue este wallet solo si quiere requerir una contraseña para cada uso del wallet. El siguiente ejemplo descarga el wallet protegido por contraseña
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; -
Verifique el estado de la tarea de la base de datos.
Sustituya el ID de la tarea devuelto en los pasos anteriores por
dbtask-1234567890123-4567.log
en el siguiente ejemplo.SELECT TEXT FROM TABLE(rdsadmin.rds_file_util.read_text_file('BDUMP','
dbtask-1234567890123-4567.log
')); -
Verifique el contenido del directorio que se utiliza para almacenar el wallet de Oracle.
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => '
WALLET_DIR
'));Para obtener más información, consulte Descripción de los archivos de un directorio de instancia de base de datos.
Paso 4: conceder permisos de usuario para el wallet de Oracle
Puede crear un nuevo usuario de base de datos o configurar un usuario existente. En cualquiera de los dos casos, debe configurar el usuario para que acceda wallet de Oracle para las conexiones seguras y la autenticación del cliente mediante certificados.
Para conceder permisos de usuario para el wallet de Oracle
-
Inicie sesión en la instancia de base de datos de RDS for Oracle como usuario principal.
-
Si no desea configurar un usuario de base de datos existente, cree un nuevo usuario. De no ser así, vaya al siguiente paso.
En el siguiente ejemplo, se crea un usuario de base de datos denominado
my-user
.CREATE USER
my-user
IDENTIFIED BYmy-user-pwd
; GRANT CONNECT TOmy-user
; -
Conceda permiso a los usuarios de la base de datos en el directorio que contiene el wallet de Oracle.
El siguiente ejemplo concede acceso de lectura al usuario
my-user
en el directorioWALLET_DIR
.GRANT READ ON DIRECTORY
WALLET_DIR
TOmy-user
; -
Conceda permiso al usuario de la base de datos para utilizar el paquete
UTL_HTTP
.El siguiente programa PL/SQL otorga acceso a
UTL_HTTP
al usuariomy-user
.BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
Conceda permiso al usuario de la base de datos para utilizar el paquete
UTL_FILE
.El siguiente programa PL/SQL otorga acceso a
UTL_FILE
al usuariomy-user
.BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_FILE', UPPER('
my-user
')); END; /
Paso 5: configurar el acceso a un sitio web desde la instancia de base de datos
En este paso se configura el usuario de la base de datos Oracle para que pueda conectarse al sitio web de destino mediante UTL_HTTP
, el wallet de Oracle cargado y el certificado del cliente. Para más información, consulte Configuring Access Control to an Oracle Wallet
Para configurar el acceso a un sitio web desde la instancia de base de datos de RDS for Oracle
-
Inicie sesión en la instancia de base de datos de RDS for Oracle como usuario principal.
-
Cree una entrada de control de acceso al host (ACE) para el usuario y el sitio web de destino en un puerto seguro.
El siguiente ejemplo configura
my-user
para acceder asecret.encrypted-website.com
en el puerto seguro 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
La unidad de programa anterior puede provocar el siguiente error:
PLS-00201: identifier 'XS_ACL' must be declared
. Si se devuelve este error, sustituya la línea que asigna un valor aprincipal_type
por la línea siguiente y, a continuación, vuelva a ejecutar la unidad de programa:principal_type => 2));
Para obtener más información acerca de las constantes del paquete PL/SQL
XS_ACL
, consulte la Real Application Security Administrator's and Developer's Guideen la documentación de Oracle Database. Para más información, consulte Configuring Access Control for External Network Services
(Configuración del control de acceso para servicios de red externos) en la documentación de Oracle Database. -
(Opcional) Cree una ACE para el usuario y el sitio web de destino en el puerto estándar.
Es posible que tenga que utilizar el puerto estándar si algunas páginas web reciben servicio desde el puerto estándar del servidor web (80) en lugar del puerto seguro (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; / -
Confirme que las entradas de control de acceso existen.
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;
-
Conceda permiso al usuario de la base de datos para utilizar el paquete
UTL_HTTP
.El siguiente programa PL/SQL otorga acceso a
UTL_HTTP
al usuariomy-user
.BEGIN rdsadmin.rdsadmin_util.grant_sys_object('UTL_HTTP', UPPER('
my-user
')); END; / -
Confirme que existen listas de control de acceso relacionadas.
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;
-
Conceda permiso al usuario de su base de datos de utilizar certificados para la autenticación del cliente y el wallet de Oracle para las conexiones.
nota
Si no utiliza los certificados de cliente para la autenticación, puede omitir este paso.
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; /
Paso 6: probar las conexiones desde la instancia de base de datos a un sitio web
En este paso, configurará al usuario de la base de datos para que pueda conectarse al sitio web mediante UTL_HTTP
, el wallet de Oracle cargado y el certificado del cliente.
Para configurar el acceso a un sitio web desde la instancia de base de datos de RDS for Oracle
-
Inicie sesión en la instancia de base de datos de RDS for Oracle como usuario de base de datos con permisos
UTL_HTTP
. -
Confirme que una conexión al sitio web de destino puede resolver la dirección del host.
En el siguiente ejemplo, se obtiene la dirección de host de
secret.encrypted-website.com
.SELECT UTL_INADDR.GET_HOST_ADDRESS(host => '
secret.encrypted-website.com
') FROM DUAL; -
Pruebe una conexión fallida.
La siguiente consulta falla porque
UTL_HTTP
requiere la ubicación del wallet de Oracle con los certificados.SELECT UTL_HTTP.REQUEST('
secret.encrypted-website.com
') FROM DUAL; -
Pruebe el acceso al sitio web mediante
UTL_HTTP.SET_WALLET
y seleccione desdeDUAL
.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; -
(Opcional) Pruebe el acceso al sitio web mediante el almacenamiento de la consulta en una variable y el uso de
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; / -
(Opcional) Busque la ubicación en el sistema de archivos de su directorio de wallets de Oracle.
SELECT * FROM TABLE(rdsadmin.rds_file_util.listdir(p_directory => '
WALLET_DIR
'));Utilice el resultado del comando anterior para realizar una solicitud HTTP. Por ejemplo, si el directorio es
rdsdbdata/userdirs/01
, ejecute la siguiente consulta.SELECT UTL_HTTP.REQUEST('
https://secret.encrypted-website.com/
', '', 'file://rdsdbdata/userdirs/01
') FROM DUAL;