syslog에 암호를 유출하지 않는 특정 Ansible 작업의 상세 정보를 어떻게 줄일 수 있습니까?


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 릴리스의 릴리스 발표에 명시된 바와 같이 :

민감한 작업이 syslog에 닿지 않도록 작업에 "no_log = True"옵션을 사용할 수도 있습니다. (비밀번호처럼 보이는 매개 변수는 이미 필터링되었습니다)

대부분의 경우 비밀번호를 필터링해야합니다.


이것은 암호를 효과적으로 숨기지 syslog만 콘솔 출력에서 ​​로깅 출력을 동시에 비활성화합니다. 그것을 바꿀 방법이 있습니까?
aef

죄송 해요. 나는이 주제에 관한 정보를 거의 찾지 못했다. 나는 당신이 놀이를 디버깅 한 후에 만 ​​속성을 설정하는 것이 좋습니다. 인용 한 바와 같이 Ansible은 이미 비밀번호처럼 보이는 매개 변수를 필터링해야합니다. 아마도 버그 일 것입니다. 다시 말하지만 Ansible이 매개 변수가 암호인지 확인하는 방법을 모르겠습니다. 어쩌면 숨길 버그 / 누락 기능 일 수 password = XXX있습니다.
Henrik Pingel

Ansible에서 비밀번호가 기본적으로 숨겨져 있다는 인상을 어디서 얻었습니까? 이것이 문서 어딘가에 언급되어 있습니까?
aef

내 대답의 마지막 인용문 (암호처럼 보이는 매개 변수는 이미 필터링되었습니다). 그러나 그 기능에 대한 다른 소스를 찾지 못했습니다
Henrik Pingel

3

나는 경제력 콜백 플러그인 기본 출력에 대한 숨기기 암호, 그것은 구문 분석 OUPUT 사전이 포함되어 키의 비밀번호를 그들 각각에 대해, 그것은 ********으로 값을 대체합니다.

./plugins/callbackprotect_data.py 폴더에 이름이 지정된 파일을 작성하고 다음 코드를 추가하십시오.

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'인 dict를 설정해야합니다. 변수에 비밀이 대신 있음을 나타내는 메타 플래그를 좋아했지만 감사합니다! 다른 Q : ansible-playbook --diff( 출력 차이 변경)을 사용 하여 출력의 비밀을 마스크 합니까?
gertvdijk

몰라요, 시도한 적이 없습니다
Nelson G.

-3

Vault를 대신 사용하면 문제가 발생하지 않을 수 있습니다.


이것은 질문에 대한 답변을 제공하지 않습니다. 평판 이 충분 하면 모든 게시물댓글 수 있습니다 . 대신 asker의 설명이 필요없는 답변을 제공하십시오 . - 검토에서
병아리

1
Vault는 유휴 데이터를 암호화하는 데 도움이되지만 암호를 사용하면 쉽게 로그 파일에 나타날 수 있습니다.
콘스탄틴 수보 로프

@chicks 이것은 대답아닌 잘못된 답변 처럼 보입니다 .
Michael Hampton

검토 도구에서 해당 옵션을 보지 못했습니다. 이것은 답변보다 의견과 비슷하기 때문에 이것을 합리적으로 처리 한 것처럼 느낍니다.
병아리

내 깃발도 거절되었지만 위의 문장이 Ansible verbosity 를 줄이는 방법에 대한 답변인지 여전히 알 수 없습니다 . 그것은 또 다른 아이디어를 제안하는 의견이며, 그 질문에 대한 대답은 아닙니다.
패트릭 Mevzek 1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.