# [OCI] Revelación del secreto de una Vault

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](https://dbaenlasombra.com/oci-oci-cli-y-su-configuracion) ).

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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1737310402255/8bc63bbd-d1f6-44a3-ba92-983480377999.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739787892829/6f76e4ff-19cb-467a-a5e1-3a3667bd5b39.png align="left")

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**.

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739788712806/e002cd28-2444-4d36-bbb7-9c101a20c371.png align="left")

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..

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739793550005/4169951c-1000-42a1-b57d-1b4907a69b99.png align="center")

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

```plaintext
#!/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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1737310171647/92c8c301-b12d-4cc1-9e05-0f649a95e8d6.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1737311138522/be3ee2b4-b604-4fa3-9c40-8b60d85e38c0.png align="center")

Creamos la siguiente Policy:

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739795238076/8f51e993-7408-4912-894c-6ba68d97e42d.png align="left")

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

Accedemos a nuestra instancia y subimos nuestro archivo python

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739795890736/4920ec5b-5f72-495f-b2f4-bb9fb64b09ab.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1739798459344/f82c720b-eba7-431b-95ef-90dcf220e2bf.png align="center")

```plaintext
[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:

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

Ejecutamos de nuevo para revelar el secreto:

```plaintext
[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](https://github.com/dbaenlasombra/secret)

Espero que os sirva.
