# Salt

[Salt](https://saltstack.com/) est un [logiciel de gestion de configuration](https://en.wikipedia.org/wiki/Software_configuration_management) comme Puppet ou Ansible.

Je l’utilise chez [Framasoft](https://framasoft.org) et sur mon infra personnelle parce que je l’aime bien :

- rapide ;
- très bien documenté ;
- syntaxe claire, accessible mais néanmoins flexible et puissante.

## Changer ses mots de passe en masse

Je change mes mots de passe régulièrement (une fois par an environ).
C’est toujours galère à faire quand on gère une tripotée de serveurs (entre les serveurs physiques et les VMs, on en est à plus de 100 serveurs chez Framasoft).

Avant, je faisais ça à la main : je lançais [mssh](https://sourceforge.net/projects/mssh/) sur 4, 6 ou 8 serveurs à la fois, et je modifiais mon mot de passe à la main. Mais ça, c’était avant.

**Salt à la rescousse**

Pour changer le mot de passe de l’utilisateur `bar` sur le serveur `foo` avec salt, on fait :

```bash
salt foo shadow.set_password bar "$6$selselse$HASHEDPASSWORD"
```

`$6$selselse$HASHEDPASSWORD` correspond à votre mot de passe salé et hashé.
Vous retrouvez un brol du genre dans votre `/etc/shadow`
(Oh !
Vous avez remarqué ? C’est le nom du module salt qui permet de modifier votre mot de passe !
C’est bien fait quand même 😁)

Pour créer l’ensemble `$6$selselse$HASHEDPASSWORD`, vous pouvez
utiliser python (nécessite le module passlib, fourni par le paquet Debian `python3-passlib`) :

```bash
python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.hash('LE_PASSWORD', rounds=5000))"
```

Bon, on sait comment faire, mais on ne va pas s’amuser à taper 100 fois ces commandes !

Salt permet de vérifier que les minions (les agents Salt) répondent bien avec cette commande :

```bash
salt foo test.ping
```

Ce qui donne :

```yaml
foo:
  True
```

On va changer le format de sortie :


```bash
salt foo --out text test.ping
```

Ce qui nous donne :

```
foo: True
```

Bien ! On peut pinguer d’un coup tous les minions avec :

```bash
salt \* --out text test.ping
```

On a donc la liste des minions, la commande pour changer le mot de
passe... on va mixer tout ça :

```bash
salt \* --out text test.ping | \
  sed -e "s@\([^:]*\):.*@echo salt \1 shadow.set_password bar \\\\\"\$(python3 -c \"from passlib.hash import sha512_crypt; print(sha512_crypt.hash('LE_PASSWORD', rounds=5000))\")\\\\\"@"
```

1ère regex : on dégage les `: True`, et la deuxième, on enrobe le nom du minion pour que ça nous donne un truc comme :

```bash
echo salt foo shadow.set_password bar \"$(python3 -c "from passlib.hash import sha512_crypt; print(sha512_crypt.hash('LE_PASSWORD', rounds=5000))")\"
```

Quand on exécute ça, ça donne un truc genre :

```bash
salt foo shadow.set_password bar "$6$8qJhzAi6$.O8bOisJaM9fH05aXx7xnKXOVFoI9CRzjORFWDqoPR/TBOiYVZUEJKtUKirNMyaZJvJMYPVUMhnNry9QPJgHK/"
```

Bien évidemment, on va mettre ça dans un fichier qu’on va éditer pour
modifier le mot de passe (bah oui, on va quand même pas mettre le même
mot de passe sur tous les serveurs).

```bash
salt \* --out text test.ping | \
  sed -e "s@\([^:]*\):.*@echo salt \1 shadow.set_password bar \\\\\"\$(python3 -c \"from passlib.hash import sha512_crypt; print(sha512_crypt.hash('LE_PASSWORD', rounds=5000))\")\\\\\"@" > /tmp/chpasswd.txt
```

On édite `/tmp/chpasswd.txt` pour mettre ses mots de passe bien comme il
faut puis :

```bash
bash /tmp/chpasswd.txt | bash
```

Le `echo` va nous sortir la commande kivabien qui sera interprétée par bash.
Le bout de python transformera le mot de passe en hash dans le format kivabien pour le fichier `/etc/shadow` et la commande salt sera lancée sur chaque minion.