Software de propósito general Capítulo destinado a la instalación y/o configuración segura de software de propósito general orientado a la seguridad. Vault hashicorp Vault es una herramienta que sirve para almacenar y controlar el acceso a tokens, contraseñas, certificados, claves de cifrado y otros datos confidenciales. Características Vault es accesible por otros servicios y aplicaciones mediante APIs. Vault tiene mecanismos integrados que lo hacen resistente a fallas. Debido a la tecnología de replicación, Vault es muy escalable y puede proporcionar altas tasas de rendimiento para satisfacer la mayoría de las necesidades. Vault es capaz de cifrar/descifrar datos sin almacenarlos. La principal implicación de esto es que si ocurre una intrusión, el atacante no tendrá acceso a las claves reales. Vault puede almacenar claves por un período definido. Cuando este período expira, las claves se revocan automáticamente. Además, Vault admite una revocación manual flexible. Vault mantiene un historial de interacción con el y sus secretos. Vault admite la autenticación mediante tokens, lo cual es conveniente y seguro. Es posible conectar varios complementos a Vault para ampliar su funcionalidad. Vault tiene una interfaz gráfica de usuario basada (web), que se puede usar para interactuar con el sistema. Instalación Deshabilitar el historial de la consola (bash): history -c echo "set +o history" >> ~/.bashrc Descargar  https://www.vaultproject.io/downloads/ Descomprimir y copiar al directorio de ejecutables unzip vault-XYZ.zip chown root:root vault mv vault /usr/local/bin/ rm -f vault-XYZ.zip Instalar autocompletado vault -autocomplete-install Crear directorios de datos de Vault sudo mkdir /etc/vault sudo mkdir -p /var/lib/vault/data Crear usuario llamado Vault sudo useradd --system --home /etc/vault --shell /bin/false vault sudo chown -R vault:vault /etc/vault /var/lib/vault/ Crear el archivo de servicio para Vault cat <> ~/.bashrc Inicializar vault con 4 llaves compartidas de las cuales 3 serán requeridas para “abrir” el contenedor de llaves. Este comando también generara el token del root que se usa para la configuración inicial. sudo rm -rf /var/lib/vault/data/* vault operator init -key-shares=4 -key-threshold=3 El comando generara las 4 llaves compartidas que deberán ser entregadas a diferentes personas para poder “abrir” vault y tener acceso a los datos privados que se almacenen en ella. Las personas a cargo de la custodia de estas llaves compartidas deberán almacenarlas de manera segura usando PGP (Pretty Good Privacy), pueden usar un servicio como https://keybase.io Para abrir Vault ejecute este comando 3 veces y copie una a una 3 de las 4 las llaves compartidas vault operator unseal Autenticarnos con el token del root generado con el comando anterior vault login <> Habilitar pistas de auditoria vault audit enable syslog tag="vault" facility="AUTH" Instalar syslog apt-get install syslog-ng Agregar al archivo   /etc/syslog-ng/syslog-ng.conf source s_net { udp(ip(0.0.0.0) port(514)); }; filter f_vault { host( "0.0.0.0" ); }; destination df_vault { file("/var/log/vault.log"); }; log { source ( s_net ); filter( f_vault ); destination ( df_vault ); }; Almacenamiento de datos privados Habilitar el motor de secretos llave-valor (KV) vault secrets enable -version=1 kv Listar los motores de secretos vault secrets list Almacenar una API vault kv put kv/apikey/Google llave=AAaaBBccDDeeOTXzSMT1234BB_Z8JzG7JkSVxI Leer la llave almacenada vault kv get kv/apikey/Google Código de ejemplo de una aplicación en python que se comunica con Vault usando un token para obtener el API key: response = requests.get( 'https://127.0.0.1:8200/v1/kv/apikey/Google', params={'q': 'requests+language:python'}, headers={'X-Vault-Token': 's.VjOyZANgP89UEQSVcXNKdZOi'}, ) json_response = response.json() APIKey = json_response['data']['llave'] Almacenar el certificado cert.pem vault kv put kv/cert/mysql certificado=@cert.pem Leer el certificado almacenado vault kv get -field=certificado kv/cert/mysql Instalar módulo de generación de contraseñas robustas Descargar y descomprimir el último plu-in binario mkdir /etc/vault/plugins/ cd /etc/vault/plugins/ wget https://github.com/sethvargo/vault-secrets-gen/releases/download/v0.0.6/vault-secrets-gen_0.0.6_linux_amd64.tgz tar -zxvf vault-secrets-gen_0.0.6_linux_amd64.tgz Habilite mlock para que el complemento se pueda habilitar y deshabilitar de forma segura setcap cap_ipc_lock=+ep /etc/vault/plugins/vault-secrets-gen Calcule el SHA256 del complemento y regístrelo en el catálogo de complementos de Vault export SHA256=$(shasum -a 256 "/etc/vault/plugins/vault-secrets-gen" | cut -d' ' -f1) vault plugin register \ -sha256="${SHA256}" \ -command="vault-secrets-gen" \ secret secrets-gen Monta el motor de secretos vault secrets enable \ -path="gen" \ -plugin-name="secrets-gen" \ plugin Generar un password vault write gen/password length=36 Secretos dinámicos Para incrementar la seguridad de una aplicación se puede usar la funcion de “secretos dinámicos” de Vault que permite crear dinámicamente usuarios y contraseñas temporales de la base de datos para que sean usados por una aplicación y así no exponer el usuario y contraseña. Este ejemplo asume que mongdb tiene habilitado la autenticación para las credenciales: usuario="sam" password="test123 Habilitar el módulo de base de datos vault secrets enable database Configure Vault para que se conecte a mongoDB vault write database/config/my-mongodb-database \ plugin_name=mongodb-database-plugin \ allowed_roles="my-role" \ connection_url="mongodb://{{username}}:{{password}}@127.0.0.1:27017/admin" \ username="sam" \ password="test123" Configure Vault para que cree una credencial en la base de datos y expire cada hora (default_ttl) vault write database/roles/my-role \ db_name=my-mongodb-database \ creation_statements='{ "db": "admin", "roles": [{ "role": "readWrite" }] }' \ default_ttl="1h" \ max_ttl="24h" Probar manualmente la generación de credenciales vault read database/creds/my-role Código de ejemplo de una aplicación en python que se comunica con Vault usando un token para obtener un usuario y contraseña de la base de datos: response = requests.get( 'http://127.0.0.1:8200/v1/database/creds/my-role', params={'q': 'requests+language:python'}, headers={'X-Vault-Token': 's.VjOyZANgP89UEQSVcXNKdZOi'}, ) json_response = response.json() Database.USER = json_response['data']['username'] Database.PASSWORD = json_response['data']['password'] En el siguiente punto se muestra como generar tokens que puede tener restricciones como: Tiempo de vida Permiso granular de acceso a Vault Uso máximo Habilitar AppRole para la autenticación de aplicaciones con vault El método AppRole permite que aplicaciones se autentiquen con roles definidos por Vault. Habilitar la autenticación para aplicaciones vault auth enable approle Crear el archivo "database.hcl” que describe la política para la aplicación cat <