123 votes

Comment puis-je mettre en œuvre ansible avec des mots de passe par hôte, en toute sécurité ?

Je voudrais utiliser ansible pour gérer un groupe de serveurs existants. J'ai créé un ansible_hosts et testé avec succès (avec le fichier -K ) avec des commandes qui ne ciblent qu'un seul hôte

ansible -i ansible_hosts host1 --sudo -K # + commands ...

Mon problème maintenant est que les mots de passe des utilisateurs sur chaque hôte sont différents, mais je ne trouve pas de moyen de gérer cela dans Ansible.

Utilisation de -K Je ne suis invité à entrer qu'un seul mot de passe sudo au départ, qui semble ensuite être utilisé pour tous les hôtes suivants sans demande :

host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password

Recherche jusqu'à présent :

  • a Question StackOverflow avec une réponse incorrecte ("utiliser -K ") et une réponse de l'auteur disant "Found out I needed passwordless sudo" (J'ai découvert que j'avais besoin de sudo sans mot de passe).

  • les documents Ansible qui disent "L'utilisation de sudo sans mot de passe rend les choses plus faciles à automatiser, mais ce n'est pas nécessaire ." (c'est moi qui souligne)

  • cette question de sécurité sur StackExchange qui considère que NOPASSWD est nécessaire

  • article "Provisionnement évolutif et compréhensible..." qui dit :

    "L'exécution de sudo peut nécessiter la saisie d'un mot de passe, ce qui est un moyen sûr de bloquer Ansible pour toujours. Une solution simple est d'exécuter visudo sur l'hôte cible, et de s'assurer que l'utilisateur qu'Ansible utilisera pour se connecter n'a pas à taper de mot de passe".

  • article "Basic Ansible Playbooks" qui dit

    "Ansible pourrait se connecter au serveur cible en tant que root et éviter la nécessité de sudo, ou laisser l'utilisateur ansible avoir sudo sans mot de passe, mais la pensée de faire l'un ou l'autre fait que ma rate menace de sauter dans mon gosier et de bloquer ma trachée, alors je ne le fais pas"

    C'est exactement ce que je pense, mais alors comment faire pour aller au-delà d'un seul serveur ?

  • problème ansible #1227 , "Ansible should ask for sudo password for all users in a playbook", qui a été clôturée il y a un an par mpdehaan avec le commentaire "Haven't seen much demand for this, I think most people are sudoing from only one user account or using keys most of the time".

Alors... comment les gens utilisent-ils Ansible dans des situations comme celles-ci ? Configuration de NOPASSWD en /etc/sudoers la réutilisation du mot de passe sur plusieurs hôtes ou l'activation de la connexion SSH de l'utilisateur root semblent être des réductions plutôt drastiques de la sécurité.

2 votes

Y a-t-il une raison pour laquelle vous n'utilisez pas de clés SSH ?

28 votes

J'utilise déjà des clés SSH ; elles n'affectent pas la sécurité de l'utilisateur. sudo (qui devrait toujours nécessiter un mot de passe).

1 votes

Ce n'est peut-être pas exactement ce que vous recherchez, mais sur les boîtes Ubuntu, j'utilise encore des clés, c'est-à-dire que je place ma clé publique dans /root/authorized_keys pour me connecter directement en tant que root. L'inconvénient évident est d'autoriser les connexions de root par ssh... Je refuse également les connexions par mot de passe via ssh et j'exécute fail2ban pour plus de sécurité.

1voto

gen.st4ck Points 11

Ceux qui arrivent tard ici : c.f. https://stackoverflow.com/a/37002802

Per host, in your inventory hosts file (inventory/<inventoryname>/hosts)
[server]
10.0.0.0 ansible_sudo_pass=foobar

Per group, in your inventory groups file (inventory/<inventoryname>/groups)
[server:vars]
ansible_sudo_pass=foobar

Per group, in group vars (group_vars/<groupname>/ansible.yml) and encrypted (ansible-vault create group_vars/<groupname>/ansible.yml)
ansible_sudo_pass: "foobar"

0voto

Paul Calabro Points 520

Une façon possible de le faire est d'utiliser des variables environnementales.

par exemple

pass1=foo pass2=bar ansible-playbook -i production servers.xml

Ensuite, dans les jeux, vous pouvez rechercher le mot de passe sudo en utilisant :

lookup('env', 'pass1') 
lookup('env', 'pass2')

0voto

Florin Points 1

C'est parfaitement possible. Vous pouvez définir votre inventaire pour utiliser des variables pour des choses comme les mots de passe :

INVENTAIRE :

[023_mqtt]
023-softbank-mqtt01 ansible_host=IP.IP.IP.IP ansible_ssh_private_key_file=/path/to/my_key ansible_ssh_user=my_user ansible_become=yes ansible_become_method=sudo ansible_become_pass='{{ my_user_pass }}'

Vous avez besoin d'un fichier group_vars/023_mqtt.yaml où se trouve votre inventaire, si vous utilisez un serveur de saut (si vous en avez besoin) :

ansible_ssh_common_args: '-o ProxyCommand="ssh -i /path/to/your/jump_key -W %h:%p -q you_jump_user@IP.IP.IP.IP"'

Enfin, vous définissez un coffre-fort pour stocker vos mots de passe. Il est préférable de le créer dans le même dossier que votre fichier d'inventaire :

ansible-vault create passwds.yaml
[enter a vault pass]

Ajoutez les mots de passe :

my_user : 'my_user's sudo password'

Pour l'exécuter, passez la chambre forte comme variable supplémentaire :

 ansible -a "docker ps" -i /path/to/hosts hosts_group --ask-vault-pass --extra-vars '@passwd.yaml'

Je l'ai défini pour plusieurs hôtes, chacun ayant sa propre clé SSH, sa phrase de passe SSH et son mot de passe SSH SUDO, et cela fonctionne bien. Pour l'article complet, regardez mon git :

https://github.com/flow0787/ansible/blob/master/README.md

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X