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 variables vault_key y vault_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 variable vault_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 variables vault_key_shares y vault_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 archivo vault_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 oneshot vault-unseal. Este servicio también utiliza el archivo vault_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)

Acerca del proyecto

Vault hashicorp installation and configuration role

Instalar
ansible-galaxy install ricsanfre.vault
Licencia
mit
Descargas
6.2k
Propietario
Telecom engineer.