Skip to content

khmarochos/vault-cluster

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Vault Playbook Documentation

You:

Hello again.

I'd like you to write a piece of documentation for my Ansible playbook. The playbook deploys Vault clusters and creates secrets, policies and tokens based on the hierarchy that is provided by the operator who runs this playbook. All configuration parameters are being provided by the operator in a single inventory YAML structure which could look like as follows:

all:
  vars:
    spool_directory: "{{ lookup('env', 'HOME') }}/var/khmarochos"
    ssh_private_key_file: "{{ spool_directory }}/ssh/id_rsa"
    ssh_public_key_file: "{{ ssh_private_key_file }}.pub"
    ssh_known_hosts_file: "{{ spool_directory }}/ssh/known_hosts"
    domain_name: "kloudster.net"
    pki_directory: "{{ spool_directory }}/pki"
    pki_subject_country: "PL"
    pki_subject_state_or_province: "Malopolska"
    pki_subject_locality: "Krakow"
    pki_subject_organization: "TUCHA SPOLKA Z OGRANICZONA ODPOWIEDZIALNOSCIA"
    pki_subject_organizational_unit: "sluzba bezpieczenstwa"
    pki_subject_email_address: "security@tucha.pl"
    pki_ca_list:
      - ca_name_brief: root
        ca_name_full: Root
        ca_key_is_encrypted: true
        ca_key_size: 4096
        ca_strict: false
        ca_stubby: false
      - ca_name_brief: vault_production
        ca_name_full: Vault
        ca_key_is_encrypted: true
        ca_key_size: 2048
        ca_parent: root
        ca_strict: false
        ca_stubby: true
      - ca_name_brief: vault_development
        ca_name_full: Vault (DEVELOPMENT)
        ca_key_is_encrypted: true
        ca_key_size: 1024
        ca_parent: root
        ca_strict: false
        ca_stubby: true
    pki_default_ca: root
    pki_term: 300
  hosts:
    localhost:
    vault1.production:
    vault2.production:
    vault3.production:
    vault1.development:
    vault2.development:
    vault3.development:
  children:
    controller:
      hosts:
        localhost:
      vars:
        ansible_connection: local
    vault_clusters:
      vars:
        ansible_connection: ssh
        ansible_user: root
        ansible_ssh_private_key_file: "{{ ssh_private_key_file }}"
        ansible_ssh_common_args: "-o UserKnownHostsFile={{ ssh_known_hosts_file }}"
        kickstart_template: vault.ks.j2
        ipv4_netmask: 255.255.255.0
        ipv4_gateway: 10.13.127.254
        ipv4_nameservers:
          - 10.13.127.254
          - 1.1.1.1
          - 8.8.8.8
          - 9.9.9.9
        reveal_secrets_to_console: false
        reveal_secrets_to_file: /dev/null
        vault_secrets:
          kloudster:
            __engine:
              type: kv
              version: 2
              description: the primary collection of the Kloudster secrets
            alpha:
              __policies:
                some_policy:
                  rules:
                    - path: .
                      capabilities: [read, list]
                  weight: 1
              a_foo: $RANDOM$
              a_bar: T0p$3cĐŻ3T
              a_baz: ...
              bravo:
                b_foo:
                  __leaf:
                    value: $RANDOM$
                    overwrite: true
                b_bar: T0p$3cĐŻ3T
                b_baz: ...
                charlie:
                  c_foo: $RANDOM$
                  c_bar: T0p$3cĐŻ3T
                  c_baz: ...
        vault_policies:
          some_policy:
            rules:
              - path: /kloudster/alpha/bravo/charlie/delta/echo
                capabilities: [read, list]
          another_policy:
            rules:
              - path: /kloudster/alpha/bravo
                capabilities: [read, list]
            tokens:
              some_token:
                orphan: true
                weight: 666
          yet_another_policy:
            rules:
              - path: /kloudster/alpha/bravo/charlie/*
                capabilities: [read, update]
        vault_tokens:
          some_token:
            policies:
              - some_policy
            orphan: false
            type: service
            regenerate: true
          another_token:
            policies:
              - another_policy
            orphan: true
            type: batch
      children:
        vault_production:
          vars:
            domain_name: tower.kloudster.net
            ca_name_brief: "vault_production"
            shamir_key_shares: 5
            shamir_key_threshold: 3
            token_accessors_directory: "{{ spool_directory }}/vault_production/"
            reveal_secrets_to_console: true
            reveal_secrets_to_file: "?"
          hosts:
            vault1.production:
              ansible_host: 10.13.127.17
            vault2.production:
              ansible_host: 10.13.127.18
            vault3.production:
              ansible_host: 10.13.127.19
        vault_development:
          vars:
            domain_name: tower.d.kloudster.net
            ca_name_brief: "vault_development"
            shamir_key_shares: 1
            shamir_key_threshold: 1
            vault_api_port: 2800
            token_accessors_directory: "{{ spool_directory }}/vault_development/"
            reveal_secrets_to_console: true
            reveal_secrets_to_file: "{{ spool_directory }}/vault_development_keys.yaml"
          hosts:
            vault1.development:
              ansible_host: 10.13.127.1
            vault2.development:
              ansible_host: 10.13.127.2
            vault3.development:
              ansible_host: 10.13.127.3

Would you be so kind as to analyse this configuration sample (I hope, it's pretty straightforward) and write a document explaining what parameters are available and what each of them does?

Thank you.

ChatGPT:

Ansible Playbook for Vault Cluster Deployment

This document provides a detailed explanation of the configuration parameters used in the provided Ansible playbook for deploying HashiCorp Vault clusters and managing their secrets, policies, and tokens.

Inventory YAML Structure

The inventory YAML file contains a hierarchical structure that allows the operator to define and configure various aspects of the Vault cluster deployment. The structure is divided into the following sections:

  • all
    • vars
    • hosts
    • children

all.vars

These global variables are used throughout the playbook for general configuration purposes.

Variable Name Description
spool_directory The base directory where all generated files will be stored.
ssh_private_key_file The private SSH key file used for remote server connections.
ssh_public_key_file The public SSH key file corresponding to the private key.
ssh_known_hosts_file The file containing known hosts for SSH connections.
domain_name The primary domain name for the deployed infrastructure.
pki_directory The directory where all PKI (Public Key Infrastructure) related files are stored.
pki_subject_* Various PKI subject fields used in certificates.
pki_ca_list A list of Certificate Authorities (CAs) used in the deployment.
pki_default_ca The default CA to be used if not specified otherwise.
pki_term The validity term (in days) of the issued certificates.

all.hosts

This section contains a list of hosts where the Vault clusters will be deployed. Each host is assigned to a specific Vault cluster and environment (production or development).

all.children

The children section is divided into multiple sub-sections, each representing a different aspect of the deployment process.

controller

Variable Name Description
ansible_connection The connection type for the controller host, set to local as the playbook is run locally.

vault_clusters

This section contains variables and configuration for both production and development Vault clusters.

Variable Name Description
ansible_connection The connection type for the remote Vault hosts, set to ssh.
ansible_user The remote user for SSH connections.
ansible_ssh_private_key_file The private SSH key file used for remote server connections.
ansible_ssh_common_args Additional SSH arguments for remote connections.
kickstart_template The Kickstart template file for the Vault installation.
ipv4_* Various IPv4 network configuration parameters.
reveal_secrets_to_console Determines whether secrets should be printed to the console.
reveal_secrets_to_file Specifies a file where secrets will be stored, or /dev/null if not needed.
vault_secrets A dictionary defining secrets, policies, and tokens.
vault_policies A dictionary of policy configurations.
vault_tokens A dictionary of token configurations.

vault_production and vault_development

These sections define specific configuration parameters for the production and development environments.

Variable Name Description
domain_name The domain name for the specific environment.
ca_name_brief The abbreviated CA name for the environment.
shamir_key_shares The number of Shamir key shares generated for unsealing the Vault.
shamir_key_threshold The minimum

You:

Please, continue.

ChatGPT:

Variable Name Description
shamir_key_threshold The minimum number of Shamir key shares required to unseal the Vault.
token_accessors_directory The directory where token accessors will be stored.
reveal_secrets_to_console Determines whether secrets should be printed to the console for the specific environment.
reveal_secrets_to_file Specifies a file where secrets will be stored for the specific environment, or "?" if not needed.
vault_api_port The port on which the Vault API will be available (only applicable to the development environment).
ansible_host The IPv4 address of the remote Vault server.

Configuration Parameter Analysis

This section explains the purpose and usage of the configuration parameters in the provided inventory YAML file.

PKI Configuration

The inventory file includes configuration for Public Key Infrastructure (PKI) management with multiple Certificate Authorities (CAs), which can be used for issuing certificates for the Vault clusters.

Vault Cluster Configuration

The inventory file defines two Vault clusters: production and development. Each cluster has its specific domain name, CA, and Shamir key configuration.

Secrets, Policies, and Tokens

The vault_secrets, vault_policies, and vault_tokens dictionaries allow the operator to define and manage secrets, policies, and tokens for the deployed Vault clusters. The secrets are organized in a hierarchical structure, and policies and tokens can be associated with specific paths in the hierarchy.

Network Configuration

The inventory file specifies network configuration parameters like IPv4 addresses, netmasks, gateways, and name servers for the Vault clusters.

Security and Logging

The reveal_secrets_to_console and reveal_secrets_to_file parameters control the exposure of secrets during the deployment process. By default, secrets are not printed to the console and are stored in a specified file or /dev/null if not needed.

Conclusion

This document has provided a detailed explanation of the configuration parameters used in the provided Ansible playbook for deploying HashiCorp Vault clusters and managing their secrets, policies, and tokens. The inventory YAML file contains a hierarchical structure that allows the operator to define and configure various aspects of the Vault cluster deployment, including network configuration, PKI management, and secrets, policies, and tokens management.

You:

Please, analyse the vault_secrets, vault_policies and vault_tokens dictionaries. Pay attention that the policies could be mentioned in a secret's definition (so that a policy could be defined or modified in the vault_secrets section), and the tokens could be mentioned in policies' definitions (so they could be defined or modified in the vault_policies and/or vault_secrets sections). Please, explain this to the reader.

ChatGPT:

The vault_secrets, vault_policies, and vault_tokens dictionaries in the inventory YAML file allow the operator to define and manage secrets, policies, and tokens for the deployed Vault clusters in a hierarchical structure. Let's analyze each of these dictionaries in detail, focusing on how policies and tokens can be defined or modified within the vault_secrets and vault_policies sections.

vault_secrets

This dictionary allows the operator to define secrets in a hierarchical structure. In addition to the actual secret data, it can also include policy definitions or modifications for specific secrets or secret paths. To associate a policy with a secret or a path within the vault_secrets section, the __policies key can be used, followed by the policy name and its configuration.

For example, in the provided YAML sample:

alpha:
  __policies:
    some_policy:
      rules:
        - path: .
          capabilities: [read, list]
      weight: 1

The some_policy is defined and associated with the secret alpha. This policy grants read and list capabilities to the specified path (in this case, the path of the alpha secret).

vault_policies

This dictionary allows the operator to define and manage Vault policies. Each policy contains a set of rules that grant or deny specific capabilities on certain paths within the secrets hierarchy. Additionally, tokens can be mentioned in the policy definitions, allowing them to be created or modified within the vault_policies section.

For example, in the provided YAML sample:

another_policy:
  rules:
    - path: /kloudster/alpha/bravo
      capabilities: [read, list]
  tokens:
    some_token:
      orphan: true
      weight: 666

The another_policy is defined with a rule that grants read and list capabilities on the /kloudster/alpha/bravo path. Within the same policy definition, a token called some_token is defined and associated with this policy.

vault_tokens

This dictionary allows the operator to define and manage Vault tokens. Each token can be associated with one or more policies, which determine the permissions and capabilities of the token.

For example, in the provided YAML sample:

some_token:
  policies:
    - some_policy
  orphan: false
  type: service
  regenerate: true

The some_token is defined and associated with the some_policy. The token is not an orphan, has a service type, and will be regenerated if it already exists.

Conclusion

The vault_secrets, vault_policies, and vault_tokens dictionaries provide a flexible way to define and manage secrets, policies, and tokens in the Vault clusters. The ability to define and modify policies and tokens within the vault_secrets and vault_policies sections allows the operator to establish relationships between these entities and manage their configurations in a hierarchical and context-aware manner.

You:

Nice. Also, please, explain merging of policies' and token's configuration. So, if there is the some_policy policy defined in the vault_policies dictionary, the operator can mention the same policy somewhere in the vault_secrets dictionary and this secret's path (it's . by default, but it could be changed by the operator) will be added to the some_policy definition.

ChatGPT:

When configuring policies and tokens in the vault_secrets and vault_policies dictionaries, it is possible to merge or extend the configuration of existing policies or tokens by mentioning them in different sections of the inventory YAML file. This allows the operator to add new rules or modify existing ones in a context-aware and hierarchical manner.

Merging Policy Configurations

If a policy is defined in the vault_policies dictionary and then mentioned again within the vault_secrets dictionary, the policy configuration will be merged. The secret's path (default is .) will be added to the policy definition, extending the policy with the new rules and capabilities associated with the secret.

For example, if the some_policy is defined in the vault_policies dictionary as follows:

some_policy:
  rules:
    - path: /kloudster/alpha/bravo/charlie/delta/echo
      capabilities: [read, list]

And then mentioned again in the vault_secrets dictionary:

alpha:
  __policies:
    some_policy:
      rules:
        - path: .
          capabilities: [read, list]
      weight: 1

The resulting some_policy will have both the original rule from the vault_policies section and the new rule from the vault_secrets section, extending the policy's capabilities to the secret's path:

some_policy:
  rules:
    - path: /kloudster/alpha/bravo/charlie/delta/echo
      capabilities: [read, list]
    - path: /kloudster/alpha
      capabilities: [read, list]

Merging Token Configurations

Similarly, if a token is defined in the vault_tokens dictionary and then mentioned again within the vault_policies or vault_secrets dictionaries, the token configuration will be merged. This allows the operator to add or modify the policies associated with the token in a context-aware manner.

For example, if the some_token is defined in the vault_tokens dictionary as follows:

some_token:
  policies:
    - some_policy
  orphan: false
  type: service
  regenerate: true

And then mentioned again in the vault_policies dictionary:

another_policy:
  rules:
    - path: /kloudster/alpha/bravo
      capabilities: [read, list]
  tokens:
    some_token:
      orphan: true
      weight: 666

The resulting some_token will have both the original policy some_policy and the new policy another_policy associated with it, and its orphan status will be updated:

some_token:
  policies:
    - some_policy
    - another_policy
  orphan: true
  type: service
  regenerate: true

Conclusion

The ability to merge policy and token configurations within the vault_secrets and vault_policies dictionaries enables the operator to manage policies and tokens in a flexible, context-aware, and hierarchical manner. The operator can extend or modify existing policies and tokens by mentioning them in different sections of the inventory YAML file, ensuring that the resulting configuration accurately represents the desired access control and permissions.

You:

Ah, you're so brilliant kid! Thank you. :-)

ChatGPT:

Thank you for your kind words! I'm glad I could help. If you have any more questions or need further assistance, please don't hesitate to ask. Have a great day!

You:

Oh, can you also explain another few of aspects to the reader.

  1. Please, explain the building of the PKI tree, as this feature deserves some attention. The playbook generates all the certificates as a certification tree, so the operator could make it issuing the root certificates, a chain of intermediate certificates and a separate certificate for each Vault cluster.
  2. The operator isn't limited to the prodiction and development environments only. The playbook could deploy as many environments as its being asked to.

ChatGPT:

  1. Building the PKI tree:

The inventory YAML file provides a way to define and manage a hierarchical Public Key Infrastructure (PKI) tree for the Vault clusters. The PKI tree is built using a certification chain that starts with a root certificate and could include a chain of intermediate certificates, ultimately leading to separate certificates for each Vault cluster.

In the provided YAML sample, the PKI tree is defined using the pki_ca_list key under the vars section:

pki_ca_list:
  - ca_name_brief: root
    ...
  - ca_name_brief: vault_production
    ...
    ca_parent: root
  - ca_name_brief: vault_development
    ...
    ca_parent: root

Here, the root certificate is defined as the top-level root certificate authority (CA). Two intermediate CAs, vault_production and vault_development, are defined with root as their parent, which means they will be signed by the root CA.

This hierarchical structure allows the operator to create a robust PKI tree, ensuring the trustworthiness and security of the certificates issued for each Vault cluster. The root certificate acts as the ultimate trust anchor, while the intermediate certificates provide additional layers of trust and allow for the separation of responsibilities across different environments or organizational units.

  1. Deploying multiple environments:

The Ansible playbook is flexible enough to deploy multiple environments as required by the operator. The provided YAML sample demonstrates the deployment of two environments, production and development, but the playbook can be easily extended to handle any number of environments by modifying the inventory file.

To deploy additional environments, the operator can add new child groups under the vault_clusters group, with appropriate configuration parameters. Each environment should have its own unique identifier and a set of hosts.

For example, to create a new staging environment, the operator can add the following configuration to the inventory YAML file:

children:
  ...
  vault_clusters:
    ...
    children:
      ...
      vault_staging:
        vars:
          domain_name: tower.staging.kloudster.net
          ca_name_brief: "vault_staging"
          ...
        hosts:
          vault1.staging:
            ansible_host: 10.13.127.21
          vault2.staging:
            ansible_host: 10.13.127.22
          vault3.staging:
            ansible_host: 10.13.127.23

Here, the vault_staging group is added as a child of the vault_clusters group, with its own configuration variables and hosts. The operator can customize the settings for each environment as needed, providing greater flexibility in deploying and managing Vault clusters across multiple environments.

In summary, the Ansible playbook provides a powerful and flexible way to build a hierarchical PKI tree and deploy Vault clusters across multiple environments. The operator can easily extend the playbook to handle various use cases and environments, ensuring a secure and scalable infrastructure for managing secrets, policies, and tokens.

You:

Ah, you are so good assistant! Thanks a lot.

ChatGPT:

You're very welcome! I'm glad I could help. If you have any more questions or need further assistance, please don't hesitate to ask. I'm always here to help. Have a great day!

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published