Cloud Control. Migración de contraseñas y targets

GPS Open Source News

Hola a todos!! Llegan tiempos de recogimiento y qué mejor manera de pasar el tiempo que planear nuestra próxima migración a Oracle Cloud Control 13cr4. Sabemos que puede llegar a ser tediosa y que no siempre funciona bien, por eso, hoy os mostraremos cómo exportar todos las contraseñas y poder recrear los targets en otro Cloud Control.

¿Dónde se ubican los datos en Cloud Control?

La información referente a nombres de usuario, contraseñas y roles se almacenan en la tabla em_nc_cred_columns. Cuando vemos esta tabla nos damos cuenta que la información está encriptada y recibimos el siguiente error:

 ORA-28239: no se ha proporcionado ninguna clave
 ORA-06512: en "SYS.DBMS_CRYPTO_FFI", línea 67
 ORA-06512: en "SYS.DBMS_CRYPTO", línea 44
 ORA-06512: en "SYSMAN.EM_CRYPTO", línea 250
 ORA-06512: en línea 1
 28239. 00000 -  "no key provided"
 *Cause:    A NULL value was passed in as an encryption or decryption key.
 *Action:   Provide a non-NULL value for the key. 

Recibimos el error porque el Cloud Control no tiene la clave maestra en local.

Esa columna se cifra con el paquete em_crypto. El algoritmo de cifrado utiliza una clave secreta que se almacena en la «Cartera de credenciales de administrador» y una sal (datos aleatorios para mayor seguridad). El archivo de wallet se encuentra en  $MIDDLEWARE_HOME/gc_inst/em/EMGC_OMS1/sysman/config/adminCredsWallet/cwallet.sso

Tenemos que exportar la credencial con el siguiente comando. Nos pedirá la  contraseña de sysman.

 [oracle@host01 ~]$ emctl config emkey -copy_to_repos
 Oracle Enterprise Manager Cloud Control 13c Release 4
 Copyright (c) 1996, 2020 Oracle Corporation.  All rights reserved.
 Enter Enterprise Manager Root (SYSMAN) Password :
 The EMKey has been copied to the Management Repository. This operation will cause the EMKey to become unsecure.
 After the required operation has been completed, secure the EMKey by running "emctl config emkey -remove_from_repos".
 [oracle@host01 ~]$ 

Ya tenemos nuestra EMKey lista para poder leer la información de las tablas.

Podemos leer la información con la siguiente query:

SELECT c.cred_owner, c.cred_name, c.target_type, (SELECT em_crypto.decrypt(p.cred_attr_value, p.cred_salt) FROM em_nc_cred_columns p WHERE c.cred_guid  = p.cred_guid AND lower(P.CRED_ATTR_NAME) LIKE ‘%user%’) username, (SELECT em_crypto.decrypt(p.cred_attr_value, p.cred_salt) FROM em_nc_cred_columns p WHERE c.cred_guid  = p.cred_guid AND lower(P.CRED_ATTR_NAME) LIKE ‘%role%’) rolename, (SELECT em_crypto.decrypt(p.cred_attr_value, p.cred_salt) FROM em_nc_cred_columns p WHERE c.cred_guid  = p.cred_guid AND lower(P.CRED_ATTR_NAME) LIKE ‘%password%’) password FROM em_nc_creds c WHERE c.cred_owner <> ‘<SYSTEM>’ ORDER BY cred_owner;

Ahora sí podemos leer la información.

Credentials Oracle Cloud Control

La contraseñas están en texto plano. Ahora que tenemos las passwords, podemos sacar mediante scripts dinámicos las sentencias de creación.

Creación de script de migración

select 'emcli add_target -name="'|| TARGETNAME || '" -type="oracle_database" -host="' || HOSTNAME || '" -credentials="UserName:DBSNMP;password:' || password || ';Role:normal" -properties="SID:' || INSTANCIA || ';Port:' || PUERTO ||  ';OracleHome:' || ORACLEHOME || ';MachineName:' || upper(SUBSTR(MACHINENAME, 1, LENGTH(MACHINENAME) - 23)) || '"'
 from (
 select   
 (SELECT property_value   FROM  mgmt$target_properties where property_name='OracleHome' and target_type='oracle_database' and target_guid=t.target_guid ) ORACLEHOME,
 (select target_name from MGMT$AGENTS_MONITORING_TARGETS where target_type='oracle_database' and target_guid=t.target_guid) TARGETNAME, 
 (select agent_host_name from MGMT$AGENTS_MONITORING_TARGETS where target_type='oracle_database'  and target_guid=t.target_guid) HOSTNAME,
 (SELECT property_value   FROM  mgmt$target_properties where property_name='Port'  and target_guid=t.target_guid) PUERTO, 
 (SELECT property_value   FROM  mgmt$target_properties where property_name='InstanceName'  and target_guid=t.target_guid) INSTANCIA,
 (select agent_host_name from MGMT$AGENTS_MONITORING_TARGETS where target_type='oracle_database'  and target_guid=t.target_guid) MACHINENAME,
 (SELECT em_crypto.decrypt(p.cred_attr_value, p.cred_salt) FROM em_nc_cred_columns p WHERE c.cred_guid  = p.cred_guid AND lower(P.CRED_ATTR_NAME) LIKE '%password%') password,
 (SELECT em_crypto.decrypt(p.cred_attr_value, p.cred_salt) FROM em_nc_cred_columns p WHERE c.cred_guid  = p.cred_guid AND lower(P.CRED_ATTR_NAME) LIKE '%user%') username
 from MGMT$AGENTS_MONITORING_TARGETS m join  mgmt$target_properties t on m.target_guid=t.target_guid
 JOIN em_nc_creds c   ON m.target_guid=c.target_guid
 where m.target_type='oracle_database'
 )
  where username='dbsnmp' 
 group by ORACLEHOME, TARGETNAME, HOSTNAME, PUERTO, INSTANCIA, MACHINENAME,password,username 
export_all_targets_script.sql

Esperamos que esto os ayude con la migración !! Si seguís con problemas o dudas no os lo penséis más y contactar con nosotros que estaremos encantados de ayudaros!!

Nos vemos la semana que viene donde seguiremos con temas de Cloud control 13cr4, hasta entonces, mucho ánimo con las migraciones !!!!

Si no quieres perder estos trucos y noticias relacionadas con las bases de datos y el Open Source, no dudes en sucribirte a nuestra newsletter. Podrás darte de baja cuando quieras y sólo enviamos un email al mes.

Más info: https://docs.oracle.com/cd/E24628_01/index.htm