[OCI] Revelación del secreto de una Vault

David SanzDavid Sanz
4 min read

En este artículo vamos a explorar el uso de Vault por vía de un Instancia. Para ello, definiremos una Vault, asumiendo que ya disponemos de una VCN e Instancia.

En este ejemplo de uso, utilizaremos la Vault para guardar la configuración de OCI-CLI que hicimos en el artículo anterior ( OCI-CLI y su configuración ).

Lo primero que tenemos que definir es la Vault, ¿Qué es una Vault en OCI? Una Vault es una entidad que permite almacenar y administrar información confidencial como claves o certificados, permitiendo así un localización centralizada para administrar y auditar información sensible.

Algunos servicios de OCI que puede utilizar una Vault son los siguientes:

  • Object Storage

  • File Storage

  • Block Storage

  • Streaming

  • Container Engine for kubernetes

  • Autonomous Container Database

Para poder definir un Vault debemos ir a "Identity & Security" y "Key Management & Secret Management", como se muestra en la siguiente imagen:

Una vez que hemos entrado en la sección de Vault, procedemos a definirlo:

OCI Vault ofrece las siguientes opciones:

  • Virtual Vault: servicio de encriptación multiusuario donde las claves de partición son almacenadas en particiones HSM.

  • Private Vault: servicio de encriptación monousuario que almacena las claves en una partición aislada en HSM con núcleos aislados en la tenancy.

En nuestro caso, utilizaremos Virtual Vault. Una vez creada la Vault, configuraremos la clave maestra de cifrado (MEK - Master Encryption Key) junto con el Secret.

Vamos a describir las distintas opciones que podemos ver aquí:

  • Modo de Protección: HSM (Guardada en un HSM y, además, no puede ser transferida fuera de él) o Software Keys (guardada en un servidor donde puede ser transferida desde dicho servidor para ejecutar operaciones criptográficas dentro del servidor del cliente).

  • Key Shape, Algorithm: Los algoritmos de encriptación que soporta la Master Encription Keys son AES, RSA y ECDSA.

  • Import External Key: Si quieres importar la clave o que sea el propio servicio de la Vault el que te lo genere.

Es momento de definir el Secret, que puede ser una password, un certificado, claves SSH o tokens de autenticación. Indicamos que la clave de encriptación será la que hemos generado en el paso anterior. Importante indicar que será “Manual secret generation” ya que queremos utilizar la Vault para guardar la configuración de OCI-CLI..

¿Cómo podemos revelar el secreto de la Vault? Para poder revelarlo nos apoyaremos en un archivo Python para revelarnos el secreto.

#!/usr/bin/env python3
# coding: utf-8
import oci
import base64
import sys
# Replace secret_id value below with the ocid of your secret
secret_id = "<OCID_Our_Secret>"
# By default this will hit the auth service in the region the instance is running.
signer = oci.auth.signers.InstancePrincipalsSecurityTokenSigner()
# In the base case, configuration does not need to be provided as the region and tenancy are obtained from the InstancePrincipalsSecurityTokenSigner
identity_client = oci.identity.IdentityClient(config={}, signer=signer)
# Get instance principal context
secret_client = oci.secrets.SecretsClient(config={}, signer=signer)
# Retrieve secret
def read_secret_value(secret_client, secret_id):
    response = secret_client.get_secret_bundle(secret_id)
    base64_Secret_content = response.data.secret_bundle_content.content
    base64_secret_bytes = base64_Secret_content.encode('ascii')
    base64_message_bytes = base64.b64decode(base64_secret_bytes)
    secret_content = base64_message_bytes.decode('ascii')
    return secret_content
# Print secret
secret_contents = read_secret_value(secret_client, secret_id)
print(format(secret_contents))

Lo único que tendríamos que modificar es la variable secret_id para poner el OCID de SCRT-01.

El siguiente paso, es definir las policitas de seguridad para dar acceso a las instancia a nuestra Vault (Dynamic Group/Policy)

Primero, definimos nuestro Dynamic Group en: Identity & Security - Identity - Domains

Una vez que estemos ahí, iremos a la sección “Dynamic Groups”, tal como podemos en la siguiente imagen:

Creamos la siguiente Policy:

Allow dynamic-group <Name_Diynamic_Group> to 
read secret-family in compartment <Name_Compartment> 
where target.secret.name='<Name-Secret>'

Nos faltaría el último paso, acceder a nuestra instancia para leer el secret.

Accedemos a nuestra instancia y subimos nuestro archivo python

Una cosa que hay que tener en cuenta es que hemos definido el secret en base64 por temas de seguridad:

[opc@vm-01 ~]$ python getsecret.py 
W0RFRkFVTFRdCnVzZXI9WFhYWFhYCmZpbmdlcnByaW50PVhYWFhYWAp0ZW5hbmN5PVh.................

Modificamos el archivo python para decodificar la base64. Para ello, incluiremos las siguientes líneas al final de nuestra clase python:

# Print secret
secret_contents = read_secret_value(secret_client, secret_id)
print( base64.b64decode(secret_contents).decode() )

Ejecutamos de nuevo para revelar el secreto:

[opc@vm-01 ~]$ python getsecret.py 
[DEFAULT]
user=XXXXXX
fingerprint=XXXXXX
tenancy=XXXXXX
region=XXXXXX
key_file=/home/opc/.oci/oci_api_key.pem

cat oci_api_key.pem
XXXXXXXXXXXXXXX

Listo. Ya podemos configurar OCI-Cli en nuestro nuevo entorno gracias a la Vault de una forma segura.

Dejo por aquí ambas clases python

https://github.com/dbaenlasombra/secret

Espero que os sirva.

0
Subscribe to my newsletter

Read articles from David Sanz directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

David Sanz
David Sanz

Soy desarrollador, Analista, DBA Oracle y Arquitecto OCI, certificado en OCI Migration and Integration Certified Professional y Certified Architect Associate con más de 15 años de experiencia en plataformas Oracle además de especialista en temas de rendimiento.