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_pwd
Ansible 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.cfg
Ansible은 지정된 위치에서 실행에 대한 정보를 기록합니다. 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의 답변에 대한 추가 사항입니다.
- 명령을 비밀로 감싸는 템플릿을 작성하십시오.
래퍼 -script.sh.j2
echo {{ secret_eg_from_ansible_vault }} | su - "ls -l"
- 랩퍼 스크립트를 호출하고 한 번에 제거하십시오.
- 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
하는 것은 은행 암호 와 같습니다 .