로그 파일에 암호를 쓰지 못하게하려면 어떻게해야합니까? 를 설정하려고 합니다. 인터넷의

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이 일반 텍스트 비밀번호를 로그 파일에 쓰지 못하게하려면 어떻게해야합니까?



답변

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

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

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

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


답변

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

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


답변

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

sudo pip install ansible==1.6.1

답변

Ansible 문서 :

log_path

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

log_path=/var/log/ansible.log

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

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


답변

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-비밀번호 변수

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


답변

이것은이 스레드에서 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가 있는 모듈 이 작은 래퍼 스크립트를 즉석에서 작성하는 데 도움이 될 수 있습니다.


답변

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

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

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

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

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

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