J'aimerais utiliser ansible pour gérer un groupe de serveurs existants. J'ai créé un ansible_hosts
fichier et testé (avec l' -K
option) avec succès avec des commandes qui ne ciblent qu'un seul hôte
ansible -i ansible_hosts host1 --sudo -K # + commands ...
Mon problème actuel 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.
En utilisant -K
, je ne suis invité à entrer qu'un seul mot de passe sudo au départ, qui semble alors être essayé pour tous les hôtes suivants sans demander:
host1 | ...
host2 | FAILED => Incorrect sudo password
host3 | FAILED => Incorrect sudo password
host4 | FAILED => Incorrect sudo password
host5 | FAILED => Incorrect sudo password
Recherche jusqu'ici:
une question StackOverflow avec une réponse incorrecte ("use
-K
") et une réponse de l'auteur disant "J'ai découvert qu'il me fallait sudo sans mot de passe"La documentation Ansible , qui dit: "L'utilisation de sudo sans mot de passe facilite l'automatisation, mais ce n'est pas obligatoire ." (c'est moi qui souligne)
cette question de sécurité StackExchange qui prend comme lu ce qui
NOPASSWD
est requisarticle "Approvisionnement évolutif et compréhensible ..." qui dit:
"Pour exécuter sudo, il peut être nécessaire de saisir un mot de passe, ce qui est un moyen sûr de bloquer Ansible. Une solution simple consiste à exécuter visudo sur l'hôte cible et à s'assurer que l'utilisateur qu'Ansible utilisera pour se connecter ne doit pas entrer de mot de passe"
article "Playbooks Ansible de base" , qui dit
"Ansible peut se connecter au serveur cible en tant que root et éviter la nécessité de sudo, ou laisser l'utilisateur de ansible le faire sans mot de passe, mais la pensée de le faire me fait craquer de me soulever l'oesophage et de bloquer ma trachée. ne pas "
Mes pensées exactement, mais alors comment s'étendre au-delà d'un seul serveur?
numéro 1227 d'ansible , "Ansible devrait demander un mot de passe sudo pour tous les utilisateurs d'un livre de jeu", qui a été fermé il y a un an par mpdehaan avec le commentaire "Je n'ai pas vu beaucoup de demande pour cela, je pense que la plupart des gens craignent un seul compte d'utilisateur ou en utilisant la plupart du temps des clés. "
Alors… comment les gens utilisent-ils Ansible dans de telles situations? La mise NOPASSWD
en place /etc/sudoers
, la réutilisation du mot de passe sur plusieurs hôtes ou l'activation de la connexion SSH racine semblent constituer des réductions drastiques de la sécurité.
sudo
(ce qui nécessite toujours un mot de passe).ansible_ssh_password
paramètre ne s'applique qu'au mot de passe SSH (l'indice est dans le nom ...). & J'utilise déjà la connexion SSH basée sur des clés.Réponses:
Vous avez certainement fait vos recherches ...
D'après toutes mes expériences avec ansible, ce que vous cherchez à accomplir n'est pas pris en charge. Comme vous l'avez mentionné, ansible déclare qu'il n'est pas nécessaire d'utiliser sudo sans mot de passe, et vous avez raison, ce n'est pas le cas. Mais je n'ai pas encore vu de méthode pour utiliser plusieurs mots de passe sudo dans ansible, sans exécuter plusieurs configurations.
Donc, je ne peux pas offrir la solution exacte que vous recherchez, mais vous avez demandé ...
Je peux vous donner un avis à ce sujet. Mon cas d'utilisation est constitué de 1 000 nœuds dans plusieurs centres de données prenant en charge une entreprise SaaS globale dans laquelle je dois concevoir / mettre en œuvre des contrôles de sécurité extrêmement stricts en raison de la nature de nos activités. La sécurité est toujours un équilibre, plus de convivialité, moins de sécurité, ce processus n’est pas différent si vous utilisez 10 serveurs ou 1 000 ou 100 000 personnes.
Vous avez absolument raison de ne pas utiliser les connexions root, que ce soit par mot de passe ou par clé ssh. En fait, la connexion root doit être entièrement désactivée si un câble réseau est connecté aux serveurs.
Parlons de la réutilisation des mots de passe. Dans une grande entreprise, est-il raisonnable de demander aux administrateurs système d’avoir des mots de passe différents sur chaque nœud? pour quelques nœuds, peut-être, mais mes administrateurs / ingénieurs se mutineraient s'ils devaient avoir des mots de passe différents sur 1000 nœuds. En outre, il serait presque impossible de mettre en œuvre cette solution, chaque utilisateur devant stocker ses propres mots de passe quelque part, espérons-le, un clavier numérique, pas un tableur. Et chaque fois que vous placez un mot de passe dans un emplacement où il peut être extrait en texte brut, votre sécurité est considérablement réduite. Je préférerais qu'ils sachent, par cœur, un ou deux mots de passe très forts, plutôt que de devoir consulter un fichier de clés chaque fois qu'ils ont besoin de se connecter ou d'appeler sudo sur une machine.
Ainsi, la réutilisation des mots de passe et la normalisation sont totalement acceptables et standard même dans un environnement sécurisé. Sinon, les services de répertoire LDAP, Keystone et autres n'auraient pas besoin d'exister.
Lorsque nous passons aux utilisateurs automatisés, les clés ssh fonctionnent très bien pour vous permettre d'entrer, mais vous devez tout de même passer à travers sudo. Vous avez le choix entre un mot de passe normalisé pour l'utilisateur automatisé (ce qui est acceptable dans de nombreux cas) ou pour activer NOPASSWD, comme vous l'avez indiqué. La plupart des utilisateurs automatisés n'exécutent que quelques commandes. Il est donc tout à fait possible et souhaitable d'activer NOPASSWD, mais uniquement pour les commandes pré-approuvées. Je suggérerais d'utiliser votre gestion de la configuration (ansible dans ce cas) pour gérer votre fichier sudoers afin que vous puissiez facilement mettre à jour la liste des commandes sans mot de passe.
À présent, vous pouvez prendre certaines mesures une fois que vous avez commencé à mettre à l'échelle pour isoler davantage les risques. Bien que nous ayons environ 1 000 nœuds, tous ne sont pas des serveurs de «production», certains sont des environnements de test, etc. Tous les administrateurs ne peuvent pas accéder aux serveurs de production, mais ceux-ci peuvent utiliser leur même clé d'utilisateur / mot de passe SSO comme ailleurs. . Mais les utilisateurs automatisés sont un peu plus sécurisés, par exemple un outil automatisé auquel les administrateurs non producteurs peuvent accéder a un utilisateur et des informations d'identification qui ne peuvent pas être utilisées en production. Si vous souhaitez lancer ansible sur tous les nœuds, vous devez le faire en deux lots, une pour la production et une autre pour la production.
Nous utilisons également puppet, car il s’agit d’un outil de gestion de la configuration contraignant, de sorte que la plupart des modifications apportées à tous les environnements sont forcées.
De toute évidence, si la demande de fonctionnalité que vous avez citée est rouverte / complétée, ce que vous cherchez à faire serait entièrement pris en charge. Même dans ce cas, la sécurité est un processus d’évaluation des risques et de compromis. Si vous ne pouvez mémoriser les mots de passe que pour quelques nœuds sans avoir recours à un post-it, des mots de passe distincts seraient légèrement plus sécurisés. Mais pour la plupart d'entre nous, ce n'est pas une option réalisable.
la source
NOPASSWD
de toute façon des raisons de sécurité (probablement soutenus par des règles de pare-feu plus strictes, etc. ), mais il est bon de lire votre cas d'utilisation et de réfléchir à la menace. modèle.sudo
(ce qui m’est venu à l’esprit lorsque j’ai découvert queNOPASSWD
c’était plutôt nécessaire). Malheureusement, cela ne semble pas du tout supporté - ansible ne fait aucune promesse concernant l’appel direct, par exemple,chown
ou lesmkdir
fichiers binaires, et doit pouvoir fonctionnersudo /bin/sh
pour la plupart des modules.À partir d'Ansible 1.5, il est possible d'utiliser un coffre-fort chiffré pour host_vars et d'autres variables. Cela vous permet au moins de stocker une
ansible_sudo_pass
variable par hôte (ou par groupe) en toute sécurité. Malheureusement, vous--ask-vault-pass
ne demanderez qu'un seul mot de passe de coffre-fort pour chaque appel, de sorte que vous êtes toujours contraint à un seul mot de passe de coffre-fort pour tous les hôtes que vous utiliserez ensemble.Néanmoins, pour certaines utilisations, cela peut représenter une amélioration par rapport à la présence d'un mot de passe sudo unique sur plusieurs hôtes, car un attaquant sans accès à vos hôtes chiffrés aurait toujours besoin d'un mot de passe sudo distinct pour chaque machine (ou groupe de machines) qu'il attaque.
la source
ansible_sudo_pass
option semble aussi nouvelle - et semble faire ce que je demandais. Un mot de passe unique pour le coffre-fort est également idéal pour mes besoins. Merci!host_vars
en utilisant cette méthode? (une limitation potentielle notée par Alex Dupuy)Avec Ansible 1.5, il est possible de définir la variable ansible_sudo_pass à l'aide de
lookup('password', …)
:Je trouve cela plus pratique que d’utiliser des fichiers
host_vars/
pour plusieurs raisons:J'utilise en fait
with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt"
les mots de passe pour l' utilisateur distant déployé (qui est alors nécessaire pour sudo ), afin qu'ils soient déjà présents dans les fichiers (bien que ces recherches en texte brut perdent la valeur salt stockée dans le fichier lorsque la valeur hachée est générée) .Cela ne conserve que les mots de passe dans le fichier (aucun
ansible_sudo_pass:
texte en clair connu) pour augmenter la sécurité cryptographique d’epsilon. Plus important encore, cela signifie que vous ne chiffrez pas toutes les autres variables spécifiques à l'hôte, elles peuvent donc être lues sans le mot de passe du coffre-fort.En plaçant les mots de passe dans un répertoire distinct, il est plus facile de garder les fichiers en dehors du contrôle de la source ou d'utiliser un outil tel que git-crypt pour les stocker sous forme chiffrée (vous pouvez utiliser cela avec Ansible antérieur, dépourvu de la fonctionnalité de coffre-fort). J'utilise git-crypt et comme je n'extrais que le référentiel sous forme déchiffrée sur des systèmes de fichiers chiffrés, je ne me soucie pas du coffre-fort et je n'ai donc pas besoin de taper un mot de passe du coffre-fort. (L'utilisation des deux serait bien sûr plus sécurisée.)
Vous pouvez également utiliser la fonction de recherche avec ansible_ssh_pass ; cela peut même être possible avec les versions précédentes d'Ansible qui n'ont pas ansible_sudo_pass .
la source
git-crypt
. d'aussi loin que je puisse voir. Il semble que Ansible ne supporte pas encore l' utilisationlookup
sur un emplacement de stockage chiffré. Lapassword
documentation du module indique qu'il existe une prise en charge non encore documentée du stockage crypté, mais je n'ai pas encore trouvé de détails. Des indices?Utiliser pass est une méthode simple pour fournir des mots de passe sudo compatibles avec ansible. pass stocke un mot de passe par fichier, ce qui facilite le partage des mots de passe via git ou d'autres méthodes. Il est également sécurisé (avec GnuPG) et si vous utilisez gpg-agent, il vous permet d’utiliser ansible sans saisir de mot de passe pour chaque utilisation.
Pour fournir le mot de passe stocké
servers/foo
de serveurfoo
à ansible, utilisez-le dans un fichier d'inventaire comme celui-ci:Etant donné que vous avez déverrouillé la clé pour gpg-agent plus tôt, cela fonctionnera sans devoir entrer de mot de passe.
la source
C'est un fil assez ancien, néanmoins:
vars_plugin
pour Ansible (une implémentation assez complète est disponible à l' adresse https://gist.github.com/mfriedenhagen/e488235d732b7becda81 ) qui différencie plusieurs systèmes d'authentification:la source
python-keepass
fonctionner?gnome-keyring
ce système signifierait conserver des enregistrements en double. Encore mieux que d'utiliserNOPASSWD
, cependant…Une méthode possible consiste à utiliser des variables environnementales.
par exemple
Ensuite, dans les jeux, vous pouvez rechercher le mot de passe sudo en utilisant:
la source