diff --git a/content/slides/cri/md/ansible.md b/content/slides/cri/md/ansible.md index 23bc7ec8959259986f3c379ff32b37a178f54b18..e04114c08ab7a219878d0d38b79033941d2292da 100644 --- a/content/slides/cri/md/ansible.md +++ b/content/slides/cri/md/ansible.md @@ -211,6 +211,9 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml * pip * pexpect (require pexcpect) + +* https://docs.ansible.com/ansible/latest/modules/template_module.html + ## roles @@ -226,6 +229,11 @@ ansible-playbook ansible/playbooks/ovh/duncan.yml ``` ansible-galaxy install -f -r requirements.yml -p ansible/roles/public ``` +ou +``` +ansible-galaxy install -f -r requirements.yml +``` +en affectant le path dans le fichier requirements.yml au niveau du role distant ## plugins diff --git a/content/slides/cri/md/gitlab.md b/content/slides/cri/md/gitlab.md index 8a7cfbf6b42b1ac04bba71af9fb9adb8f42a5292..a9e2ff4613e482badb5f57c22ea3138517604c36 100644 --- a/content/slides/cri/md/gitlab.md +++ b/content/slides/cri/md/gitlab.md @@ -1,7 +1,10 @@ + ## CI/CD variables https://gitlab.isima.fr/cri/my/settings/ci_cd +* https://docs.gitlab.com/ee/ci/yaml/ (When:manual) pour le déploiement + ## personal tokens @@ -56,3 +59,7 @@ Deploy keys allow read-only or read-write (if enabled) access to your repository ## specific runners https://gitlab.isima.fr/cri/my/settings/ci_cd + +## best practice + +* bin/setup (APP_TOKEN - gitlab secret variable / fallback ldap) bin/activate diff --git a/content/slides/cri/md/vault.md b/content/slides/cri/md/vault.md index 04bb22af5911afc8858084880e479e5f5bb414c4..94a46498ae7ba4c29b7984b9b957228fe23d1f0d 100644 --- a/content/slides/cri/md/vault.md +++ b/content/slides/cri/md/vault.md @@ -1,4 +1,5 @@ # vault + **By HashiCorp** <!-- .element width="30%" --> @@ -6,60 +7,175 @@ [https://vault.isima.fr](https://vault.isima.fr) -# Secrets +## Installation -Il existe deux étages deux secrets dans la stack +Téléchargement d'un binaire -* les **secrets locaux**: sont gérés par la commande `ansible-vault` et peuvent être lus simplement avec la commande `avq` de la stack (accessible une fois l'environnement activé). Les **secrets locaux** sont chiffrés en local, mais le fait qu'ils ne soient pas versionnés rend ce chiffrement non indispensable. + * https://releases.hashicorp.com/vault/ + * décompresser dans /usr/local/bin + * configurer les permissions + * créer un service systemd -* les **secrets globaux**: sont gérés par la commande `vault` de HashiCorp et peuvent être lus simplement avec la commande `hvq` de la stack (accessible une fois l'environnement activé). les secrets sont disponibles selon les permissions du jeton utilisés. les **secrets globaux** sont utilisés pour construire les **secrets locaux** -## Générer un secret +## Configuration -Un secret robuste en ligne de commande se génère avec la commande `openssl` comme suit +* /etc/vault/vault.hcl ``` -$ openssl rand -base64 256 +backend "file" { + path = "/var/lib/vault" +} +ui = true +disable_mlock = true +listener "tcp" { + address = "10.0.0.1:8200" + tls_disable = 1 +} ``` -écrire le secret dans un fichier + +## Secret engine + + + +## KV2 ``` -$ openssl rand -base64 256 > ~/.ansible_secrets/stack +vault login token=<root-token> +vault secrets enable -path=cri kv +vault kv enable-versioning cri/ # kv2 ``` -Stocker le secret directement dans hashicorp vault +* les secrets sont versionnés +* il est possible d'utiliser PATCH et pas seulement PUT + + +## Authentification + +* par token + * root + * d'application + +* par ldap + * en réalité génère un token dans ~/.vault-token contenant + + +## LDAP ``` -$ openssl rand -base64 256 @TODO +$ vault write auth/ldap/config \ + url="ldaps://samantha.local.isima.fr" \ + userattr="sAMAccountName" \ + userdn="dc=local,dc=isima,dc=fr" \ + groupattr="cn" \ + groupfilter="(&(objectClass=group)(member:1.2.840.113556.1.4.1941:={{.UserDN}}))" \ + groupdn="ou=GROUPES_LOCAUX,dc=local,dc=isima,dc=fr" \ + binddn="cn=vault,ou=Comptes de Services,dc=local,dc=isima,dc=fr" \ + bindpass="secret" \ + insecure_tls="false" \ + starttls="true" ``` -## Vault + +## Policy + +/etc/vault/cri.hcl + +``` +# Write and manage secrets in key-value secret engine +path "secret/*" { + capabilities = ["create", "read", "update", "delete", "list"] +} + +# To enable secret engines +path "sys/mounts/*" { + capabilities = [ "create", "read", "update", "delete" ] +} + +path "secret/data/cri/*" { + capabilities = ["create", "read", "update", "delete", "list", "sudo"] +} + +path "cubbyhole/*" { + capabilities = ["create", "read", "update", "delete", "list"] +} + +``` ``` -vault login -method=ldap username=vimazeno # vault login token=<token> -vault kv put cri/clusters/ovh/duncan/proxmoxapi password=itsasecret -vault read cri/clusters/ovh/duncan/proxmoxapi -vault read cri/clusters/ovh/duncan/proxmoxapi -format=json -vault read cri/clusters/ovh/duncan/proxmoxapi -format=json | jq .data -vault read cri/clusters/ovh/duncan/proxmoxapi -format=json | jq .data.password -vault delete cri/clusters/ovh/duncan/proxmoxapi +$ vault policy write cri /etc/vault/cri.hcl ``` -l'authentification ldap créée un fichier dans ~/.vault-token contenant votre token utilisateur avec vos permissions associées + +## Map policy and ldap group ``` -vault kv patch cri/clusters/ovh/duncan/proxmoxapi password="$(openssl rand -base64 25)" +$ vault write auth/ldap/groups/cri policies=cri ``` -**N.B.** patch met à jour l'entrée avec KV2 et écrase les autres avec KV1 (on a activé KV2) -## Stocker un secret +## Utilisation + +* le même binaire à télécharger + * cross plateforme +* deux variables d'environnement + * $VAULT_ADDR + * $VAULT_TOKEN +ou +* l'[api](https://www.vaultproject.io/api/overview) + + +## Workflow + +``` +vault login -method=ldap username=vimazeno +vault secrets list +vault list cri/ +vault read cri/tokens +vault read cri/tokens # à chaque put on écrase les entrées qu'on ne réécrit pas +vault read cri/tokens -format=json +vault read cri/tokens -format=json | jq .data +vault read cri/tokens -format=json | jq .data.password +vault kv put cri/tokens root=pipo2 +vault kv patch cri/tokens root1=pipo1 +vault delete cri/tokens +``` + + +## création de token + +``` +$ vault policy write vault/apps/my.hcl +$ vault token create -policy=my +``` + + +## token et ci/cd + +* on teste en local avec ses droits via ldaps +* on génère un token en variable de CI/CD pour autoriser l'appli à lire des secrets + + + +## Générer un secret + +Un secret robuste en ligne de commande se génère avec la commande `openssl` comme suit + +``` +$ openssl rand -base64 256 +``` + +Stocker le secret directement dans hashicorp vault + +``` +$ vault kv put cri/tokens root=$(openssl rand -base64 25) +``` + -Ce secret devrait être stocké dans https://vault.isima.fr +## SEE ALSO -Avec la commande `vault` [@TODO vault install] dans le path adéquat. +* [cri/ansible-playbook-vault](https://gitlab.isima.fr/cri/ansible-playbook-vault) -Interroger la structure du vault avec la command `vault-tree` avant de choisir le path du secret semble une bonne idée [vault-tree](). +* [Vault - Getting started](https://learn.hashicorp.com/vault/?track=getting-started#getting-started) -Ces consignes sont valables pour tous le secrets de ce tutoriel +* [consul](https://www.consul.io/)