Cómo configurar Oracle Centrally Managed Users (CMU) autenticando a Microsoft Active Directory mediante Kerberos en RAC. Parte 1

Creacion usuarios CMU autenticando por Kerberos Parte 2

Ya el propio título del post podría ser un post per se, pero veo necesario organizar los pasos, configuración y resolución de problemas si es la primera vez que os enfrentais a dicho escenario.

Empezamos con un poco de teoría.

¿Qué es CMU?

CMU es una nueva característica introducida desde Oracle DB 18c que permite una administración simplificada de usuarios de bases de datos a través de la integración con Microsoft Active Directory (AD), permitiendo que la base de datos Oracle realice la autenticación y autorización del usuario directamente contra AD.

Suena bien verdad? Pues complementamos con autenticación con Shared Schemas y autorización por global roles y ya tenemos el matrimonio perfecto. Con esto me refiero a que los usuarios de LDAP pueden acceder a través de un único usuario de BBDD y podremos definir los roles en base al grupo de AD al que pertenezcan.

Resumen: Me encanta.

Por qué me encanta? Porque tenemos centralizado en el AD la creación de usuarios, la autorización de éstos, control de contraseñas y en base de datos no tenemos que crear un usuario nominal por cada usuario que accede a la BBDD dentro de la empresa.

El artículo va dirigido a la configuración del título del post.

Pongamos en orden los conceptos a donde queremos llegar

Partimos de la premisa de autenticar los usuarios en el AD, sin ser intrusivos en éste. Me explico.

Las formas de autenticación que ofrece oracle contra el AD son:

  • Password authentication

  • Kerberos authentication

  • Public key infrastructure (PKI) authentication (certificate-based authentication)

Para una autenticación por password

You can use the Oracle opwdintg.exe executable on the Active Directory server to install the password filter and extend the Active Directory schema.

You must install the Oracle password filter on every Windows domain controller in a domain, to ensure that Oracle password verifiers will be generated for Active Directory users in this domain if they need to use password authentication to log in Oracle database.

Por ésto decido ir por la vía de autenticación por Kerberos. Como detallaban en una Slide de Oracle: Keeps your Active Directory team happy. No seré yo la que les genere malestar.

Los pasos que seguiremos serán los siguientes:

  • Creación usuarios AD

  • Extraer la Key Table del servicio

  • Configuración del servidor de BBDD. En nuestro caso trabajamos con un RAC de 2 nodos 19c (19.19)

  • Configuración clientes

  • Trobleshooting

Comenzamos con los pasos a seguir.

Detalle configuración

Dominiodominio.local
Servidoresnodotest001nodotest002
Oracle service directoryoracle_ractest-001oracle_ractest-002
Usuario conexión ADusuario_bdGrupo: acceso_bd
Unidad organizativa (OU) ADUSUARIOS
BBDDcdbtest
PDBPDB_TEST
Active Directory (AD)CA-PRUEBA-001

Creación usuarios AD

Oracle requiere la creación de un usuario que será el que va a interactuar entre la BBDD y el LDAP directory service realizando el bind a los controladores de dominio, actualizando la autenticación por Kerberos y consultando y actualizando los logins a éste. Este usuario se conoce como Oracle service directory.

Los permisos mínimos que precisamos para nuestra configuración a nivel de AD son Read properties y Write lockoutTime.

En nuestro caso vamos a crear dos usuarios para ficho fin ya que nos encontramos en una BBDD en RAC.

A mayores precisamos, obviamente, un usuario en AD para logarnos a la BBDD, el cual he denominado usuario_bd, y he creado un grupo al que pertenece a mayores denominado acceso_bd. Así podremos realizar pruebas posteriores con CMU.

La idea es una gestión por usuarios globales y roles globales mapeados a grupos del AD. El usuario tendrá asigandos los roles de BBDD en relación a los grupos del AD al que pertenezcan.

Extraer la Key Table del servicio

Extraemos la tabla de claves de servicio para Kerberos utilizando la utilidad ktpass de Windows. Esta tarea se lleva a cabo en la máquina del controlador de dominio de Active Directory.

C:\WINDOWS\system32>ktpass.exe -princ oracle_ractest-001/nodotest-001.dominio.local@DOMINIO.LOCAL -mapuser USUARIOS\oracle_ractest-001 -crypto all -pass password -out c:\keytab.rac-test-acn-001
C:\WINDOWS\system32>ktpass.exe -princ oracle_ractest-001/nodotest-002.dominio.local@DOMINIO.LOCAL -mapuser USUARIOS\oracle_ractest-002 -crypto all -pass password -out c:\keytab.rac-test-acn-002

Una vez creados los ficheros los copiamos a cada uno de los nodos del RAC.

-- Creamos directorio en cada nodo
mkdir -p /u01/app/kerberos/log/

-- Copiamos los ficheros a dicho directorio
scp keytab.rac-test-001 oracle@nodotest-001.dominio.local:/u01/app/kerberos
scp keytab.rac-test-002 oracle@nodotest-002.dominio.local:/u01/app/kerberos

Configuración del servidor de BBDD

Primero, debemos asegurarnos de que no se establezcan los siguientes parámetros relevantes de la base de datos:

. oraenv <<< cdbtest
alter system set os_authent_prefix='' scope=spfile sid='*';

srvctl stop database -d cdbtest
srvctl start database -d cdbtest

Creamos el fichero de configuración de kerberos:


[oracle@nodotest-001 ]$ cat /u01/app/kerberos/krb5.conf
[libdefaults]
    default_realm = DOMINIO.LOCAL

[realms]
DOMINIO.LOCAL = {
      kdc = DC-SERVIDOR-001.DOMINIO.LOCAL
}

[domain_realm]
    .dominio.local = DOMINIO.LOCAL
    dominio.local = DOMINIO.LOCAL
[logging]
        default = FILE:/u01/app/kerberos/log/kdc.log
        kdc = FILE:/u01/app/kerberos/log/kdc.log
        kdc_rotate = {
                period = 1d
                versions = 10
        }


[oracle@nodotest-001 ]$ scp /u01/app/kerberos/krb5.conf nodotest-002:/u01/app/kerberos

Y finalmente configuramos el sqlnet.ora en ambos nodos.

[oracle@nodotest-001 ~]$ echo "
SQLNET.KERBEROS5_KEYTAB=/u01/app/kerberos/keytab.rac-test-001
SQLNET.KERBEROS5_CONF=/u01/app/kerberos/krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle_ractest-001
SQLNET.AUTHENTICATION_SERVICES=(NONE,BEQ,KERBEROS5)
SQLNET.FALLBACK_AUTHENTICATION=TRUE
SQLNET.KERBEROS_CLOCKSKEW=6000
" >> ${ORACLE_HOME}/network/admin/sqlnet.ora

[oracle@nodotest-002 ~]$ echo "
SQLNET.KERBEROS5_KEYTAB=/u01/app/kerberos/keytab.rac-test-002
SQLNET.KERBEROS5_CONF=/u01/app/kerberos/krb5.conf
SQLNET.KERBEROS5_CONF_MIT=TRUE
SQLNET.AUTHENTICATION_KERBEROS5_SERVICE=oracle_ractest-002
SQLNET.AUTHENTICATION_SERVICES=(NONE,BEQ,KERBEROS5)
SQLNET.FALLBACK_AUTHENTICATION=TRUE
SQLNET.KERBEROS_CLOCKSKEW=6000
" >> ${ORACLE_HOME}/network/admin/sqlnet.ora

Realizamos pruebas de acceso, donde accederemos por cada uno de los nodos y por la scan. Así confirmamos las opciones de acceso.

---- Prueba


create user "USUARIO_BD@DOMINIO.LOCAL" identified externally;
grant create session to "USUARIO_BD@DOMINIO.LOCAL";
grant select on v_$database to "USUARIO_BD@DOMINIO.LOCAL";
grant select on v_$instance to "USUARIO_BD@DOMINIO.LOCAL";



[oracle@nodotest-002 kerberos]$ okinit USUARIO_BD

Kerberos Utilities for Linux: Version 19.0.0.0.0 - Production on 04-JAN-2024 17:28:13

Copyright (c) 1996, 2019 Oracle.  All rights reserved.

Configuration file : /u01/app/kerberos/krb5.conf.
Password for USUARIO_BD@DOMINIO.LOCAL:
[oracle@nodotest-002 kerberos]$ oklist

Kerberos Utilities for Linux: Version 19.0.0.0.0 - Production on 04-JAN-2024 17:28:25

Copyright (c) 1996, 2019 Oracle.  All rights reserved.

Configuration file : /u01/app/kerberos/krb5.conf.
Ticket cache: FILE:/tmp/krb5cc_54321
Default principal: USUARIO_BD@DOMINIO.LOCAL

Valid starting     Expires            Service principal
01/04/24 17:28:17  01/05/24 03:28:17  krbtgt/DOMINIO.LOCAL@DOMINIO.LOCAL
    renew until 01/05/24 17:28:07




-- Prueba nodos

[oracle@nodotest-002 kerberos]$ sqlplus /@nodotest-001.dominio.local:1521/pdbtest.dominio.local

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 4 17:29:18 2024
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Thu Jan 04 2024 17:28:31 +01:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

[oracle@nodotest-001 admin]$  sqlplus /@rac-test-scan.dominio.local:1521/pdbtest.dominio.local

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Jan 8 13:03:04 2024
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Mon Jan 08 2024 13:02:33 +01:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0





[oracle@nodotest-002 kerberos]$ sqlplus /@nodotest-002.dominio.local:1521/pdbtest.dominio.local

SQL*Plus: Release 19.0.0.0.0 - Production on Thu Jan 4 17:30:01 2024
Version 19.19.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Thu Jan 04 2024 17:29:18 +01:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.19.0.0.0

USUARIO_BD@DOMINIO.LOCAL@nodotest-002.dominio.local:1521/pdbtest.dominio.local>

set lines 200
COLUMN sess_user FORMAT A20
COLUMN auth_identity FORMAT A20
COLUMN method FORMAT A20
COLUMN net_proto FORMAT A20
COLUMN ent_identity FORMAT A20

select  sys_context('USERENV','NETWORK_PROTOCOL') net_proto,
        sys_context('USERENV','SESSION_USER') sess_user,
        sys_context('USERENV','AUTHENTICATED_IDENTITY') auth_identity,
        sys_context('USERENV','AUTHENTICATION_METHOD') method,
        sys_context('USERENV','ENTERPRISE_IDENTITY') ent_identity 
from dual;

NET_PROTO         SESS_USER          AUTH_IDENTITY        METHOD            ENT_IDENTITY
-------------------- -------------------- -------------------- -------------------- --------------------
tcp             USER_BD@DOMINIO.LOCAL user_bd@DOMINIO.LOCAL KERBEROS         user_bd@PAYTEF.LOCAL

Hasta aquí ya hemos accedido como un usuario autenticado por Kerberos a nuestra BBDD.