로그 파일에 암호를 쓰지 못하게하려면 어떻게해야합니까?


22

MySQL 서버를 설정 중이며 mysql-root설치 중에 Ansible이 비밀번호 를 설정하려고 합니다.

인터넷의 도움 으로이 솔루션을 찾았습니다.

- name: Set MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Confirm MySQL root password before installing
  debconf: name='mysql-server' question='mysql-server/root_password_again' value='{{mysql_root_pwd | quote}}' vtype='password'
- name: Install Mysql
  apt: pkg=mysql-server state=latest

mysql_root_pwdAnsible Vault에서로드 된 변수입니다. 이것은 잘 작동하지만 이제 서버에는 로그에 많은 줄이 있습니다.

Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password name=mysql-server unseen=None
Apr 10 14:39:59 servername ansible-debconf: Invoked with value=THEPASSWORD vtype=password question=mysql-server/root_password_again name=mysql-server unseen=None

Ansible이 일반 텍스트 비밀번호를 로그 파일에 쓰지 못하게하려면 어떻게해야합니까?

답변:


28

기밀 정보가 포함 된 작업이 syslog 또는 기타로 기록되지 않도록하려면 작업에서 no_log : true를 설정하십시오.

- name: secret stuff
  command: "echo {{secret_root_password}} | sudo su -"
  no_log: true

작업 실행은 계속 기록되지만 세부 정보는 거의 없습니다. 또한 사용 된 모듈은 no_log를 지원해야하므로 사용자 정의 모듈을 테스트하십시오.

자세한 내용은 Ansible FAQ 를 참조 하십시오. 전체 플레이 북에 적용 할 수 있지만 "검열"로 인해 출력이 약간 불쾌 해집니다. 메시지.



9

관찰 된 동작은 debconf 모듈의 버그 인 것 같습니다. 나는 버그 보고서를 제출했다 .

github의 사용자 bcoca는 no_log: true로깅을 방지하기 위해 암호를 설정하는 작업 에서 지시문을 사용할 수 있다고 지적했습니다 . 이것은 버그를 해결하기 전까지는 해결 방법입니다.


해당 지시문을 사용할 때 오류가 발생합니다. 내가 뭘 잘못하고 있는지 아십니까? ERROR: no_log is not a legal parameter in an Ansible task or handler
Versteegh

2
내가 구식 버전을 가지고 있음이 밝혀졌습니다! (우분투) 해결하려면 sudo apt-add-repository ppa:ansible/ansible, sudo apt-get update,sudo apt-get install ansible
Bouke Versteegh

나에게도 같은 문제이지만 n_log를 만들 수 없습니다 : 예상대로 작동합니다. 내 Ansible 버전은 1.7.2입니다. 당신은 무엇입니까?
jmcollin92

@ jmcollin92 현재 2.1을 사용하고 있습니다. 소스에서 최신 버전을 설치하는 방법에 대한 안내서가 있습니다 . 나는 그것이 어려워서 여전히 성숙하고 있음을 사용합니다.
클로스

2

Ansible 버전을 1.6.1로 업그레이드하여 해결했습니다.

sudo pip install ansible==1.6.1

2

Ansible 문서 :

log_path

에 존재하고 구성된 경우 ansible.cfgAnsible은 지정된 위치에서 실행에 대한 정보를 기록합니다. Ansible을 실행하는 사용자에게 로그 파일에 대한 권한이 있는지 확인하십시오.

log_path=/var/log/ansible.log 

이 동작은 기본적으로 설정되어 있지 않습니다. 이 설정이 없으면 관리 가능한 시스템의 syslog에 호출 된 모듈 인수를 기록 할 수 있습니다. 비밀번호 인수는 제외됩니다.

log_path제어 노드에서 설정 하는 것처럼 들리면 대상 노드에 로그 가 없습니다 .


실제로 로컬 디렉토리에 ansible.cfg가 있으며, 여기서는 log_path를 설정하여 ansible을 호출합니다. 로컬 로그는 새 실행 (로깅 작업) 후에 올바르게 작성되고 최신 상태입니다. 이것은 (당신이 지적한 문서가 그것을 약속하더라도) 원격 호스트가 로깅하는 것을 막지는 않습니다. 또한 "암호 인수는 제외됩니다"라는 문구가 100 % 사실이 아닌 것 같습니다. 이것이 버그입니까?
클로스

2
@claus "password arguments excuded"는 암호 인수가 명시적인 모듈에만 적용됩니다. 어떤 인수가 암호이고 어떤 것이 debconf, shell, raw 등과 같은 일반적인 명령으로 사용되지 않는지 알 수있는 방법은 없습니다.
Droopy4096

초기 플레이 북에서 오른쪽으로 스크롤하십시오. 라고 말합니다 vtype='password'. IMHO가 충분히 명시 적이어야합니까? 로그 메시지도 debconf 모듈에 의해 생성되었다고 가정합니다.
클로스

이것은 올바르지 않습니다. 설명서에는 " 이 설정에 관계없이 관리 대상 시스템의 syslog에 호출 된 모듈 인수를 기록 할 수 있습니다." 라고 더 정확하게 설명해야 합니다.
augurar

2

no_log보다 더 나은 방법이 있습니다 : True

- name: write in string variables login and password
  set_fact:
    temp_user: "{{ USER_VAR }}"
    temp_pass: "{{ PASSWORD_VAR }}"


- name: Your operation with password in output
  shell: '/opt/hello.sh'
  ignore_errors: True
  no_log: True
  register: myregister

- debug:
    msg: '{{ myregister.stderr | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stderr != ""

- debug:
    msg: '{{ myregister.stdout | regex_replace(temp_user) | regex_replace(temp_pass) }}'
  when: myregister.stdout != ""

- fail:
    msg: "error shell /opt/hello.sh"
  when: myregister.stderr != ""

보다시피 다음을 추가해야합니다.

ignore_errors: true
no_log: true

그런 다음 regex_replace를 사용하여 명령 결과를 출력하십시오.

USER_VAR-로그인 변수

PASSWORD_VAR-비밀번호 변수

이 접근 방식을 사용하면 비밀번호와 로그인을 숨길뿐만 아니라 작업 결과를 얻을 수 있습니다.


1

이것은이 스레드에서 TheDESTROS의 답변에 대한 추가 사항입니다.

  1. 명령을 비밀로 감싸는 템플릿을 작성하십시오.

래퍼 -script.sh.j2

echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
  1. 랩퍼 스크립트를 호출하고 한 번에 제거하십시오.
- name: create template
  template:
    src: wrapper-script.sh.j2
    dest: /tmp/wrapper-script.sh
    mode: 0700
  no_log: True
- name: invoke command with secret and remove it
  shell: /tmp/wrapper-script.sh; rm -f /tmp/wrapper-script.sh

약간 적은 코드가 필요하며 로그에 명령을 넣을 수 있습니다. 비밀이 명령 stdout에있는 경우 하나의주의 사항 만 있습니다. 외부 템플릿을 피하려면 copy매개 변수 content가 있는 모듈 이 작은 래퍼 스크립트를 즉석에서 작성하는 데 도움이 될 수 있습니다.


1

no_log: true방법은 다른 시도가 실패하면 작업을 완전히 불투명하게 만들고 실패했을 때 실마리가 없기 때문에 마지막 시도로 사용됩니다.

보안 관행은 자격 증명 파일 (또는 실행 파일)을 사용하여 가능하지 않은 경우 stdin에서 자격 증명을 제공하는 것이 좋습니다.

다음은 비밀번호 노출을 피하여 보안 포드 맨 로그인을 수행하는 방법에 대한 예입니다.

- name: secured login
  become: true
  command: >
    podman login --username={{ user }} --password-stdin ...
  args:
    stdin: "{{ secret }}"
  register: result

이를 통해 비밀은 공개되지 result않지만 명령의 출력을 여전히 볼 수 있습니다.

로그인이 필요한 대부분의 도구는 언급 된보다 안전한 접근 방법 중 하나를 구현합니다. 코드에서 CLI의 자격 증명을 사용 123456하는 것은 은행 암호 와 같습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.