web-dev-qa-db-fra.com

Comment puis-je réduire la verbosité de certaines tâches ansibles pour ne pas fuir de mots de passe dans Syslog?

Parfois, je voudrais utiliser des modules lineinfile ou blockinfile [$ var] pour écrire un mot de passe dans un fichier de configuration. Si je le fais, l'ensemble de la ligne ou du bloc, le mot de passe inclus, finit dans mon syslog.

Comme je ne considère pas syslog _ Pour être un endroit sûr pour que mes mots de passe soient stockés, comment puis-je dire à la case de ne pas fuir mon mot de passe dans syslog? J'espère qu'il y a un moyen de faire cela, sinon je considérerais que cela constituerait un gros problème de sécurité dans une insible.

Vous pouvez le reproduire par exemple avec cette commande ad-hoc:

ansible localhost -m blockinfile -a 'dest=/tmp/ansible_password_leak create=yes block="Password = {{password}}"' -e 'password=secret'

Voici ce qui finit dans syslog:

ansible-blockinfile: Invoked with directory_mode=None force=None remote_src=None insertafter=None owner=None follow=False marker=# {mark} ANSIBLE MANAGED BLOCK group=None insertbefore=None create=True setype=None content=None serole=None state=present dest=/tmp/ansible_password_leak selevel=None regexp=None validate=None src=None seuser=None delimiter=None mode=None backup=False block=Password = secret

Pour l'exemple, j'ai utilisé ansile 2.0.0.2 à partir de buntu PPA officiel sur un système de "Jessie" de Debian.

11
aef

J'ai développé un plugin de rappel pour masquer les mots de passe pour les sorties par défaut, le dictionnaire d'aller à l'autre pour la clé contenant mot de passe, pour chacun d'entre eux, il remplace la valeur ********.

Créer un fichier nommé protect_data.py Dans le dossier ./ plugins/rappel Ajouter Ajouter ce code:

from ansible.plugins.callback.default import CallbackModule as CallbackModule_default
import os, collections

class CallbackModule(CallbackModule_default):
    CALLBACK_VERSION = 2.0
    CALLBACK_TYPE = 'stdout'
    CALLBACK_NAME = 'protect_data'

    def __init__(self, display=None):
        super(CallbackModule, self).__init__(display)

    def hide_password(self, result):
        ret = {}
        for key, value in result.iteritems():
            if isinstance(value, collections.Mapping):
                ret[key] = self.hide_password(value)
            else:
                if "password" in key:
                    ret[key] = "********"
                else:
                    ret[key] = value
        return ret

    def _dump_results(self, result, indent=None, sort_keys=True, keep_invocation=False):
        return super(CallbackModule, self)._dump_results(self.hide_password(result), indent, sort_keys, keep_invocation)

Dans le fichier ansible.cfg:

  • ligne de décors avec stdout_callback et définir ce nom du plugin une valeur (stdout_callback=protect_data)
  • ligne de décors avec callback_plugins et définir la valeur ./plugins/callback

La sortie n'est modifiée que pour ce plugin, si vous utilisez un autre plugin pour afficher la sortie (logentries, ...), vous devez faire la même chose avec elle

3
Nelson G.

Les no_logattribut cache les données dans Syslog. Il peut être appliqué à une tâche unique

- name: secret task
  Shell: /usr/bin/do_something --value={{ secret_value }}
  no_log: True

ou le jeu de jeu:

- hosts: all
  no_log: True

Le débogage n'est pas vraiment possible lorsqu'il est activé, il est donc recommandé de l'utiliser uniquement pour des tâches simples. Cette fonctionnalité est disponible depuis la version 1.5 de ansile . Comme indiqué dans l'annonce de la version pour la version 1.5:

Les tâches peuvent également maintenant prendre une option "no_log = true" pour empêcher les tâches sensibles de frapper syslog. (Paramètres qui ressemblaient à des mots de passe étaient déjà filtrés)

les mots de passe doivent être filtrés dans la plupart des cas.

3
Henrik Pingel