ricsanfre.vault
Rol de Ansible: Instalación y Configuración del Servidor Hashicorp Vault
Este rol instala y configura Hashicorp Vault en un servidor Linux.
Requisitos
Ninguno.
Variables del Rol
Las variables disponibles se enumeran a continuación junto con sus valores predeterminados (ver defaults\main.yaml
).
Detalles de instalación del servidor Vault
Usuario/grupo de UNIX para Vault
vault_group: vault vault_user: vault
Paquete y versión de Vault a instalar
vault_version: 1.12.2
Rutas de instalación de Vault
vault_bin_path: /usr/local/bin vault_config_path: /etc/vault vault_tls_path: /etc/vault/tls vault_plugin_path: /usr/local/lib/vault/plugins vault_data_path: /var/lib/vault vault_log_path: /var/log/vault
Configuración TLS de Vault
vault_enable_tls: false vault_key: "" vault_cert: "" custom_ca: false vault_ca: "" # dns del servicio vault vault_dns: ""
Para habilitar la configuración de TLS, establece
vault_enable_tls
en true y proporciona la clave privada y el certificado público como contenido cargado en las variablesvault_key
yvault_cert
.Si se ha utilizado una CA personalizada para firmar los certificados TLS,
custom_ca
debe establecerse en true, y el certificado CA debe cargarse en la variablevault_ca
.Establece
vault_dns
en el nombre de dominio completo del servicio vault que se utiliza para emitir el certificado.Se pueden cargar desde archivos usando una tarea de ansible como:
- name: Cargar clave y certificado tls desde archivos set_fact: vault_key: "{{ lookup('file','certificates/{{ inventory_hostname }}_private.key') }}" vault_cert: "{{ lookup('file','certificates/{{ inventory_hostname }}_public.crt') }}" vault_ca: "{{ lookup('file','certificates/ca.crt') }}"
Inicialización de Vault
vault_init: false vault_key_shares: 1 vault_key_threshold: 1 vault_keys_output: "{{ vault_config_path }}/unseal.json"
Para inicializar automáticamente Vault, establece
vault_init
en true y proporciona las variablesvault_key_shares
yvault_key_threshold
para especificar el número de claves de unsealing que se generarán.La inicialización generará un archivo json,
vault_keys_output
, que contendrá las claves y el token raíz.Desbloqueo y servicio de desbloqueo de Vault
vault_unseal: false vault_unseal_service: false
Para desbloquear automáticamente Vault, establece
vault_unseal
en true. El proceso de desbloqueo usará las claves del archivovault_keys_output
.Se puede crear un servicio de systemd para desbloquear automáticamente Vault cada vez que se inicie o reinicie el servicio Vault. Para habilitarlo, establece
vault_unseal_service
en true. Un servicio de tipo oneshotvault-unseal
. Este servicio también utiliza el archivovault_keys_output
.Motor de secretos KV
El motor de secretos versión 2 de KV puede habilitarse automáticamente proporcionando las siguientes variables.
vault_kv_secrets: path: secret
La versión 2 de KV se habilitará en la ruta
secret
.Políticas
Las políticas ACL se pueden configurar automáticamente, proporcionando un nombre y el contenido HCL.
policies: - name: write hcl: | path "secret/*" { capabilities = [ "create", "read", "update", "delete", "list", "patch" ] } - name: read hcl: | path "secret/*" { capabilities = [ "read" ] }
Dependencias
Ninguna.
Ejemplo de Playbook
El siguiente playbook instala y configura Vault, habilitando TLS y generando certificados SSL firmados por una CA personalizada. Inicializa y desbloquea Vault. También habilita la versión 2 de KV en la ruta secret
y crea un par de políticas (read
y write
).
---
- name: Instalar y configurar el servidor Vault
hosts: vault-server
become: true
gather_facts: true
vars:
server_hostname: vault.ricsanfre.com
ssl_key_size: 4096
key_type: RSA
country_name: ES
email_address: [email protected]
organization_name: Ricsanfre
ansible_user: root
pre_tasks:
- name: Generar CA personalizada
include_tasks: tasks/generate_custom_ca.yml
args:
apply:
delegate_to: localhost
become: false
- name: Generar certificados SSL firmados por la CA personalizada para minio
include_tasks: tasks/generate_ca_signed_cert.yml
args:
apply:
delegate_to: localhost
become: false
- name: Cargar clave y certificado tls
set_fact:
vault_key: "{{ lookup('file', 'certificates/' + server_hostname + '.key') }}"
vault_cert: "{{ lookup('file', 'certificates/' + server_hostname + '.pem') }}"
vault_ca: "{{ lookup('file', 'certificates/CA.pem') }}"
roles:
- role: ricsanfre.vault
vault_enable_tls: true
custom_ca: true
vault_init: true
vault_unseal: true
vault_unseal_service: true
tls_skip_verify: true
display_init_response: true
# Configurar KV
vault_kv_secrets:
path: secret
# Políticas
policies:
- name: write
hcl: |
path "secret/*" {
capabilities = [ "create", "read", "update", "delete", "list", "patch" ]
}
- name: read
hcl: |
path "secret/*" {
capabilities = [ "read" ]
}
La sección pre-tasks
incluye tareas para generar una CA personalizada y la clave privada y el certificado del vault, y cargarlas en las variables vault_key
, vault_cert
y vault_ca
.
Donde generate_custom_ca.yml
contiene las tareas para generar una CA personalizada:
---
- name: Crear clave CA
openssl_privatekey:
path: certificates/CA.key
size: "{{ ssl_key_size | int }}"
mode: 0644
register: ca_key
- name: crear el CSR de la CA
openssl_csr:
privatekey_path: certificates/CA.key
common_name: Ricsanfre CA
use_common_name_for_san: false # dado que no especificamos SANs, no usar CN como un SAN
basic_constraints:
- 'CA:TRUE'
basic_constraints_critical: true
key_usage:
- keyCertSign
key_usage_critical: true
path: certificates/CA.csr
register: ca_csr
- name: firmar el CSR de la CA
openssl_certificate:
path: certificates/CA.pem
csr_path: certificates/CA.csr
privatekey_path: certificates/CA.key
provider: selfsigned
register: ca_crt
Y generate_ca_signed_certificate.yml
contiene las tareas para generar la clave y el certificado del Vault firmados por la CA personalizada:
---
- name: Crear clave privada
openssl_privatekey:
path: "certificates/{{ server_hostname }}.key"
size: "{{ ssl_key_size | int }}"
type: "{{ key_type }}"
mode: 0644
- name: Crear CSR
openssl_csr:
path: "certificates/{{ server_hostname }}.csr"
privatekey_path: "certificates/{{ server_hostname }}.key"
country_name: "{{ country_name }}"
organization_name: "{{ organization_name }}"
email_address: "{{ email_address }}"
common_name: "{{ server_hostname }}"
subject_alt_name: "DNS:{{ server_hostname }},IP:{{ ansible_default_ipv4.address }},IP:127.0.0.1"
- name: CSR firmado por la CA
openssl_certificate:
csr_path: "certificates/{{ server_hostname }}.csr"
path: "certificates/{{ server_hostname }}.pem"
provider: ownca
ownca_path: certificates/CA.pem
ownca_privatekey_path: certificates/CA.key
Licencia
MIT
Información del Autor
Creado por Ricardo Sánchez (ricsanfre)
ansible-galaxy install ricsanfre.vault