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


11

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

syslogパスワードを安全に保管する場所とは考えていないので、Ansibleにパスワードを漏らさないようにするにはどうすればよいsyslogですか?これを行う方法があることを願っています。そうでない場合、これは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システムで公式のAnsible Ubuntu PPAの Ansible 2.0.0.2を使用しました。

回答:


3

このno_log 属性は、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に到達しないようにすることができます。(パスワードのように見えるパラメーターは既にフィルターされています)

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


これは事実上パスワードを隠しますsyslogが、同時にコンソール出力のログ出力を無効にします。それを変える方法はありますか?
aef

申し訳ありません。このトピックに関する情報はほとんど見つかりませんでした。この属性を設定するのは、タスクの場合とプレイをデバッグした後でのみにすることをお勧めします。引用したように、Ansibleはすでにパスワードのように見えるパラメータをフィルタリングする必要があります。おそらくそれはバグです。繰り返しますが、パラメーターがパスワードであるかどうかをAnsibleがどのように判断するかはわかりません。たぶんそれはバグ/非表示機能ですpassword = XXX
Henrik Pingel 2016

パスワードはデフォルトでAnsibleに隠されているはずだという印象はどこで得ましたか?これはドキュメントのどこかに記載されていますか?
AEF

私の回答の最後の引用(パスワードのように見えたパラメーターは既にフィルターされています)。しかし、その機能に関する他のソースは見つかりませんでした
Henrik Pingel

3

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

protect_data.pyfolder ./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、...)を表示する場合、それを使用して同じことを行う必要があります


ああ、すごいですね。ただし、これには、シークレットを含むすべてのものに対して、キー名「password」のディクショナリを設定する必要があります。代わりに変数にシークレットが含まれていることを示すメタフラグが大好きでしたが、ありがとう!その他Q:これは、ansible-playbook --diff(ファイルの差分の変更)で出力の秘密も隠しますか?
gertvdijk

わからない、試したことがない
ネルソンG.

-3

代わりにVaultを使用することで問題を未然に防ぐことができます。


これは質問に対する答えを提供しません。十分な評判を得ると、どの投稿にもコメントできるようになります。代わりに、質問者からの説明を必要としない回答を提供してください。- レビューから

1
Vaultは保存データの暗号化に役立ちますが、パスワードが使用されている場合、それらはログファイルに簡単に表示されます。
Konstantin Suvorov

@chicksこれは正解ではなく、正解のように見えます
マイケルハンプトン

レビューツールにそのオプションが表示されませんでした。これは回答というよりコメントに近いので、無理なく扱った気がします。
ヒヨコ

私のフラグも拒否されましたが、上記の文がどのようにしてAnsibleの冗長性を減らす方法についての答えであるかはまだわかりません。それはせいぜい別のアイデアを示唆するコメントであり、確かに質問への答えではありません。
Patrick Mevzek
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.