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.
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:
stdout_callback
et définir ce nom du plugin une valeur (stdout_callback=protect_data
)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
Les no_log
attribut 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.