Uso de una base de datos de Oracle con la extensión oracle_fdw - Amazon Relational Database Service

Uso de una base de datos de Oracle con la extensión oracle_fdw

Para acceder a una base de datos de Oracle desde su instancia de base de datos de RDS for PostgreSQL puede instalar y utilizar la extensión oracle_fdw. Esta extensión es un contenedor de datos externos para bases de datos Oracle. Para obtener más información sobre la extensión, consulte la documentación de oracle_fdw.

La extensión oracle_fdw es compatible con las versiones 12.7, 13.3 y las versiones posteriores de RDS for PostgreSQL.

Activación de la extensión oracle_fdw

Para utilizar la extensión oracle_fdw, lleve a cabo el siguiente procedimiento.

Para habilitar la extensión oracle_fdw
  • Ejecute el siguiente comando con una cuenta que tenga los permisos rds_superuser.

    CREATE EXTENSION oracle_fdw;

Ejemplo: Usar un servidor externo vinculado a una Amazon RDS for Oracle Database

El siguiente ejemplo muestra el uso de un servidor externo vinculado a una base de datos de Amazon RDS for Oracle.

Crear un servidor externo vinculado a una base de datos de RDS for Oracle
  1. Tenga en cuenta lo siguiente en la instancia de base de datos de RDS for Oracle:

    • punto de enlace

    • Puerto

    • Nombre de base de datos

  2. Cree un servidor externo.

    test=> CREATE SERVER oradb FOREIGN DATA WRAPPER oracle_fdw OPTIONS (dbserver '//endpoint:port/DB_name'); CREATE SERVER
  3. Otorgue uso a un usuario que no tenga permisos rds_superuser, por ejemplo user1.

    test=> GRANT USAGE ON FOREIGN SERVER oradb TO user1; GRANT
  4. Conéctese como user1 y cree una asignación a un usuario de Oracle.

    test=> CREATE USER MAPPING FOR user1 SERVER oradb OPTIONS (user 'oracleuser', password 'mypassword'); CREATE USER MAPPING
  5. Cree una tabla externa vinculada a una tabla de Oracle.

    test=> CREATE FOREIGN TABLE mytab (a int) SERVER oradb OPTIONS (table 'MYTABLE'); CREATE FOREIGN TABLE
  6. Consulte la tabla externa.

    test=> SELECT * FROM mytab; a --- 1 (1 row)

Si la consulta informa el siguiente error, verifique el grupo de seguridad y la lista de control de acceso (ACL) para asegurarse de que ambas instancias puedan comunicarse.

ERROR: connection for foreign table "mytab" cannot be established DETAIL: ORA-12170: TNS:Connect timeout occurred

Trabajo con cifrado en tránsito

El cifrado de PostgreSQL a Oracle en tránsito se basa en una combinación de parámetros de configuración de cliente y servidor. Para obtener un ejemplo que utiliza Oracle 21c, consulte About the Values for Negotiating Encryption and Integrity en la documentación de Oracle. El cliente utilizado para oracle_fdw en Amazon RDS está configurado con ACCEPTED, lo que significa que el cifrado depende de la configuración del servidor de base de datos de Oracle.

Si su base de datos está en RDS for Oracle, consulte Oracle Native Network Encryption para configurar el cifrado.

Comprensión y permisos de la vista pg_user_mappings

El catálogo de PostgreSQL pg_user_mapping almacena la asignación desde un usuario RDS for PostgreSQL en el usuario de un servidor de datos externo (remoto). El acceso al catálogo está restringido, pero usted utiliza la vista pg_user_mappings para ver las asignaciones. A continuación, se muestra un ejemplo sobre cómo se aplican los permisos en una base de datos de Oracle de ejemplo, aunque esta información es válida también en general para cualquier contenedor de datos externo.

En el siguiente resultado, puede encontrar roles y permisos asignados a tres usuarios de ejemplo diferentes. Usuarios de rdssu1 y rdssu2 son miembros del rol rds_superuser, y el usuario user1 no lo es. En el ejemplo se usa el metacomando \du de psql para enumerar los roles existentes.

test=> \du List of roles Role name | Attributes | Member of -----------------+------------------------------------------------------------+------------------------------------------------------------- rdssu1 | | {rds_superuser} rdssu2 | | {rds_superuser} user1 | | {}

Todos los usuarios, incluidos los usuarios con privilegios rds_superuser, pueden ver sus propias asignaciones de usuarios (umoptions) en la tabla pg_user_mappings. Como se muestra en el siguiente ejemplo, cuando rdssu1 intenta obtener todas las asignaciones de usuario, se genera un a pesar de los privilegios rds_superuser de rdssu1:

test=> SELECT * FROM pg_user_mapping; ERROR: permission denied for table pg_user_mapping

A continuación, se muestran algunos ejemplos:

test=> SET SESSION AUTHORIZATION rdssu1; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | {user=oracleuser,password=mypwd} 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows) test=> SET SESSION AUTHORIZATION rdssu2; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+---------------------------------- 16414 | 16411 | oradb | 16412 | user1 | 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | {user=oracleuser,password=mypwd} (3 rows) test=> SET SESSION AUTHORIZATION user1; SET test=> SELECT * FROM pg_user_mappings; umid | srvid | srvname | umuser | usename | umoptions -------+-------+---------+--------+------------+-------------------------------- 16414 | 16411 | oradb | 16412 | user1 | {user=oracleuser,password=mypwd} 16423 | 16411 | oradb | 16421 | rdssu1 | 16424 | 16411 | oradb | 16422 | rdssu2 | (3 rows)

Debido a las diferencias en la implementación de information_schema._pg_user_mappings y pg_catalog.pg_user_mappings, un rds_superuser que se crea manualmente requiere permisos adicionales para ver las contraseñas en pg_catalog.pg_user_mappings.

No requieren otros permisos para un rds_superuser para ver las contraseñas en information_schema._pg_user_mappings.

Los usuarios que no tienen el rol rds_superuser pueden ver contraseñas en pg_user_mappings solo en las condiciones que se describen a continuación:

  • El usuario actual es el usuario que se está asignando y es el propietario del servidor o tiene el privilegio de USAGE en él.

  • El usuario actual es el propietario del servidor, y la asignación es para PUBLIC.