web-dev-qa-db-ja.com

特定のAnsibleタスクの冗長性を減らして、パスワードをsyslogに漏らさないようにするにはどうすればよいですか?

ときどき、Ansibleのlineinfileまたはblockinfileモジュールを使用して、構成ファイルにパスワードを書き込みたいと思います。そうすると、行全体またはブロック(パスワードを含む)がsyslogになります。

私はsyslogをパスワードを保存する安全な場所とは考えていません。パスワードをsyslogに漏らさないようにAnsibleに指示するにはどうすればよいですか?これを行う方法があるといいのですが、そうでない場合、これはAnsibleの大きなセキュリティ問題であると考えます。

たとえば、次のアドホックコマンドを使用してそれを再現できます。

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

これが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

この例では、Debian "Jessie" 8システムで official Ansible Ubuntu PPA のAnsible 2.0.0.2を使用しました。

11
aef

デフォルト出力のパスワードを非表示にするコールバックプラグインを開発しました。出力辞書でpasswordを含むキーを解析し、それぞれについて、値を********に置き換えます。

フォルダにprotect_data.pyという名前のファイルを作成./ plugins/callback addこのコードを追加:

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)

ファイル内ansible.cfg

  • stdout_callbackで行のコメントを外し、このプラグイン名に値を設定します(stdout_callback=protect_data
  • callback_pluginsと設定値./plugins/callbackで行のコメントを外します

出力はこのプラグインに対してのみ変更されます。別のプラグインを使用して出力(logentries、...)を表示する場合は、それを使用して同じことを行う必要があります

3
Nelson G.

no_logattribute は、syslog内のデータを非表示にします。単一のタスクに適用できます

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

またはプレイブック:

- hosts: all
  no_log: True

アクティブ化されている場合、デバッグは実際には不可能であるため、単一のタスクにのみ使用することをお勧めします。この機能は Ansible のバージョン1.5以降で使用できます。 1.5リリースのリリース発表で述べたように、

また、タスクで「no_log = True」オプションを使用して、機密タスクがsyslogに到達しないようにすることができます。 (パスワードのように見えるパラメーターは既にフィルターされています)

ほとんどの場合、パスワードはフィルタリングする必要があります。

3
Henrik Pingel