El Baúl

Instalando el baúl

Versión en este post es: Vault v1.18.3

761456?s=200&v=4

Los pasos son desde la freebsd fundation son buenos y funcionan, solo se debe estar pendiente de que el servicio inicie correctamente

El vault.hcl

root@Hashicorp-Vault:/ # cat /usr/local/etc/vault.hcl
listener "tcp" {
  address = "ip:8200" (1)
  tls_disable = 1
}

storage "file" {
  path = "/var/db/vault"
  node_id = "v"
}

cluster_addr = "ip:8201" (2)
api_addr = "ip:8200"     (3)
ui = true
1Es la direccion ip del jail
2igual pero con puerto distinto.
3igual.

connection refused

Por alguna razón falla la conexion con el vault, en mi caso es por el fichero vault.hcl no se esta leyendo correctamente, y nos puede lanzar este error.

Get "http://192.168.1.21:8200/v1/sys/seal-status": dial tcp 192.168.1.21:8200: connect: connection refused
root@vault-test:~ # vault server -config /usr/local/etc/vault.hcl
Error initializing core: Failed to lock memory: cannot allocate memory

This usually means that the mlock syscall is not available.
Vault uses mlock to prevent memory from being swapped to
disk. This requires root privileges as well as a machine
that supports mlock. Please enable mlock on your system or
disable Vault from using it. To disable Vault from using it,
set the `disable_mlock` configuration option in your configuration
file.
2025-01-27T11:02:28.636Z [INFO]  proxy environment: http_proxy="" https_proxy="" no_proxy=""
2025-01-27T11:02:28.717Z [INFO]  incrementing seal generation: generation=1

env o export

En nuestro caso ninguno funcionará, es por nuestra shell al iniciar en el jail.

env VAULT_ADDR=http://10.10.0.33:8200 vault operator init

Si no se setea el VAULT_ADD correctamente tenemos

WARNING! VAULT_ADDR and -address unset. Defaulting to https://127.0.0.1:8200.

Seteando environment correctamente

En el jail si hacemos un echo $SHELL tenemos es /bin/csh nos funcionara es usar el setenv

root@vault-test:/etc # setenv VAULT_ADDR ip:8200
root@vault-test:/etc # echo $VAULT_ADDR
ip:8200
root@vault-test:/etc # service vault start
Starting vault.

vault server -config

Este es el comando necesario para ejecucíon bajo fondo, muy importante para que la conexión se de.

vault server -config /usr/local/etc/vault/vault.hcl
root@vault-test:/etc # service vault start
Starting vault.
root@vault-test:/etc # vault operator init
Unseal Key 1: token
Unseal Key 2: token
Unseal Key 3: token
Unseal Key 4: token
Unseal Key 5: token

Initial Root Token: token

Vault initialized with 5 key shares and a key threshold of 3. Please securely
distribute the key shares printed above. When the Vault is re-sealed,
restarted, or stopped, you must supply at least 3 of these keys to unseal it
before it can start servicing requests.

Vault does not store the generated root key. Without at least 3 keys to
reconstruct the root key, Vault will remain permanently sealed!

It is possible to generate new unseal keys, provided you have a quorum of
existing unseal keys shares. See "vault operator rekey" for more information.
root@vault-test:/etc # echo $SHELL

Guardando en el environment

Guardamos la variable en el fichero /etc/csh.cshrc para que cada vez que entremos en el jail se encuentre la variable, y no tengamos error de connection refused.

root@Hashicorp-Vault:~ # nano /etc/csh.cshrc
# System-wide .cshrc file for csh(1).
setenv VAULT_ADDR http://192.168.1.21:8200

Creando alias

Tan fácil como

alias vault-server-config="vault server -config /usr/local/etc/vault.hcl"
De momento, con cada inicio del jail debemos ejecutar esto vault-server-config.

Con Bastille usando zsh

Este template fácil se puede aplicar a un jail activo

PKG zsh

CMD chsh -s /usr/local/bin/zsh root

PKG ohmyzsh (1)

CMD cp /usr/local/share/ohmyzsh/templates/zshrc.zsh-template ~/.zshrc

PKG powerline-fonts
1Para autocompletado.

Deberia salir esto en la consola luego del proceso

➜  ~ echo $SHELL
/usr/local/bin/zsh

Luego se pueden aplicar las variables de entorno

export VAULT_ADDR=ip
export VAULT_TOKEN=token

Igual para el alias, editar el fichero .zshrc

La UI

Proceso de unseal

En la ui introducir 3 claves de esas 5 password que se generaron con el comando vault operator init

unseal

El seal desde la UI

Desde la UI, podemos sellar nuevamente el vault, jkaaja esto me recordo al baúl rojo de los recuerdos. 😂

seal ui

Importante
  1. Con el sello del baúl, ya no tendríamos acceso ni por consola, ni menos por el api. tendriamos un error 503.

root@Hashicorp-Vault:~ # vault read cubbyhole/mi.secreto

Error reading cubbyhole/mi.secreto: Error making API request.

URL: GET http://192.168.1.21:8200/v1/cubbyhole/mi.secreto
Code: 503. Errors:

* Vault is sealed (1)
1Baúl esta sellado/presintado

Manejo de Secretos

Normalmente al buscar un secreto, tendremos error, porque necesitamos al menos Initial Root Token en el environment.

Podemos setearlo con:
setenv VAULT_TOKEN your-token (1)
nano /etc/csh.cshrc           (2)
source /etc/csh.cshrc         (3)
1seteando en el environmnet.
2guardandolo permanente.
3actualizamos el .cshrc

Leyendo secreto por consola

Antes sin setear el token en el enviroment, no podriamos autenticarnos tal cual.
root@Hashicorp-Vault:/ # vault read cubbyhole/mi.secreto
Error making API request.

URL: GET http://addreess/v1/sys/internal/ui/mounts/secret/my-secret
Code: 403. Errors:

* permission denied
Despues de setearlo
root@Hashicorp-Vault:~ # vault read cubbyhole/mi.secreto
Key     Value
---     -----
test    mi.secreto

Guardando un secreto por consola

vault kv put secret/myapp my.property=mySecretValue
vault kv put path \ (1)
/myapp \ (2)
my.property (3)
=mySecretValue (4)
1path
2nombre de la aplicacion
3nombre de la password
4valor

Via http

El Initial Root Token

Nos servira para autenticarnos en la web vía token, también para consultar el api y obtener secretos, pro ejemplo con este curl podemos obtener un secreto

  • El header X-Vault-Token se envia al hacer la request, con el Initial Root Token

curl --location 'http://ip:8200/v1/cubbyhole/mi.secreto' \
--header 'Accept: */*' \
--header 'Accept-Language: es,en;q=0.9,fr;q=0.8,zh-TW;q=0.7,zh-CN;q=0.6,zh;q=0.5' \
--header 'Connection: keep-alive' \
--header 'DNT: 1' \
--header 'Referer: http://ip:8200/ui/vault/secrets/cubbyhole/list' \
--header 'User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36' \
--header 'X-Vault-Token: YourToken' (1)
1Esto en realidad es el Initial Root Token

Dando una respuesta asi

{
    "request_id": "8ac9f6c5-9f08-12f3-ed87-70de1ab96842",
    "lease_id": "",
    "renewable": false,
    "lease_duration": 0,
    "data": {
        "test": "mi.secreto" (1)
    },
    "wrap_info": null,
    "warnings": null,
    "auth": null,
    "mount_type": "cubbyhole" (2)
}
1El secreto
2punto de montaje del secreto

Plugin para PostgreSQL

Postgresql elephant

Instalando el plugin para PostgreSQL

Nos permitira gestionar dinámicamente credenciales de bases de datos (usuarios y contraseñas). Vault puede generar credenciales temporales en PostgreSQL, lo que aumenta la seguridad y elimina la necesidad de gestionar manualmente las credenciales estáticas.

Podemos configurarlo medianta la UI o por consola

Desde la UI

Debenos crear un nuevo PostgreSQL database secrets engine y usamos databases es bastante intuitivo

La cadena de conexión debe cumplir los requistios por ejemplo

postgresql://user:password@ip_address:port/database?

cadena conexion postgresql vault