반응형
ansible-vault 리서치
문제 상황
inventory 파일에 작성하는 host 정보 중
sudo 옵션 관련 root password,
ssh password 접속 관련 user password 등
민감 정보를 저장해야하는 경우가 있음.
이런 민감 정보가 invetory 파일에 평문으로 작성되는 경우
보안적으로 큰 문제가 됨.
해당 정보를 encryption 해서 저장할 수 있는 방법에 대해 리서치 하던 중
ansible-vault를 알게되어 사용법을 정리함.
ex) 문제가 되는 inventory file
ansible-vault란
ansible이 설치되면 default로 ansible-vault도 함께 설치가 됨.
Ansible Vault는 inventory, playbook의 변수나 파일을 암호화 할 수 있음.
ansible-vault를 통해 inventory 또는 playbook 파일 자체를 암호화해서 관리할 수 있고
inventory, playbook에서 사용되는 변수만 암호화해서 사용 할 수 있음.
[ansible-vault 설치 확인]
ansible-vault로 파일 암호화
playbook 또는 inventory 파일에 민감정보가 포함되어있는 경우
해당 파일 자체를 암호화 하는 방법으로 민감정보를 보호 할 수 있음.
파일 암호화 옵션 정리
암호화된 파일 생성
|
ansible-vault create [파일 경로]
|
암호화된 파일 내용 확인하기
|
ansible-vault view [encryption 파일 경로]
|
암호화된 파일 내용 편집하기
|
ansible-vault edit [encryption 파일 경로]
|
기존 파일 암호화
|
ansible-vault encrypt [origin 파일 경로]
|
암호화된 파일 복호화
|
ansible-vault decrypt [encryption 파일 경로]l
|
암호화된 파일의 password 변경
|
ansible-vault rekey [encryption 파일 경로]
|
예제에서 사용하는 Playbook 파일 확인
ansible-vault로 playbook.yml 파일 암호화
[명령어]
ansible-vault encrypt sudoTest.yml
[결과 확인]
파일이 AES256 알고리즘으로 암호화 되어있음
암호화된 playbook 내용 확인
[명령어]
ansible-vault view vaultTestPlaybook.yml
암호화된 playbook 실행
[명령어]
ansible-playbook --ask-vault-pass -i host.ini sudoTest.yml
--ask-vault-pass : playbook 실행 시 vault password를 입력해서 복호화하고 진행하는 옵션
암호화된 playbook 편집
[명령어]
ansible-vault edit sudoTest.yml
암호화된 playbook 복호화
[명령어]
ansible-vault decrypt sudoTest.yml
ansible-vault로 변수 암호화
yaml 파일 자체를 암호화 하기보다 민감정보만 암호화 하는 방법으로
string을 ansible-vault를 통해 암호화 할 수 있음.
문자열을 암호화한 ansible vault 변수 생성
[명령어]
ansible-vault encrypt_string 'qwer1234' --name 'linux-root-password'
[옵션 설명]
encrypt_string : 문자열 암호화 옵션
qwer1234 : 암호화 하고자 하는 문자열
--name : vault 변수명
[결과]
아래와 같이 암호화 된 문자열이 출력됨.
출력된 결과는 yaml파일에서 사용 가능한 inline vault문법으로 출력됨.
ansible-vault encrypt_string 'qwer1234' --name 'linux-root-password'
New Vault password:
Confirm New Vault password:
linux-root-password: !vault |
$ANSIBLE_VAULT;1.1;AES256
33393762383135663466313934366366643237653030623434373530636137396663373331356538
3030393332643637363735633963353662653937336636650a663461626562646633373234316332
61346161323032316463323039666637343565646138386337376637656631313939666330306435
3835333164623362340a623238663432316562363134666666363265386132386531323566623830
6137
Encryption successful
|
vault encryption string 사용 가능한 inventory, playbook 예제
위에 나온 ansible-vault로 생성한 encryption string 내용은 yaml파일에서 사용할 수 있음.
기존 inventory 파일의 경우 ini 파일인데
ini 파일에서는 inline vault형식을 사용하지 못하기 때문에
yaml 형식으로 변경해서 사용해야함.
기존 ini 형식의 inventory [host.ini]
[k8sclusters]
kube.worker.node
[k8sclusters:vars]
ansible_ssh_user=centos
ansible_become=yes
ansible_become_method=sudo
ansible_become_pass='qwer1234'
|
yaml 형식으로 변경한 inventory [host.yaml]
k8sclusters:
hosts:
kube.worker.node
vars:
ansible_ssh_user=centos
ansible_become=yes
ansible_become_method=sudo
ansible_become_pass='qwer1234'
|
민감정보를 ansible-vault encryption string으로 변경 inventory [host.yaml]
k8sclusters:
hosts:
kube.worker.node
vars:
ansible_ssh_user=centos
ansible_become=yes
ansible_become_method=sudo
ansible_become_pass=!vault |
$ANSIBLE_VAULT;1.1;AES256
33393762383135663466313934366366643237653030623434373530636137396663373331356538
3030393332643637363735633963353662653937336636650a663461626562646633373234316332
61346161323032316463323039666637343565646138386337376637656631313939666330306435
3835333164623362340a623238663432316562363134666666363265386132386531323566623830
6137
|
[playbook.yaml]
---
- hosts: all
tasks:
- name: execute the script
vars:
ansible_become: yes
ansible_become_method: sudo
ansible_become_pass: !vault |
$ANSIBLE_VAULT;1.1;AES256
33393762383135663466313934366366643237653030623434373530636137396663373331356538
3030393332643637363735633963353662653937336636650a663461626562646633373234316332
61346161323032316463323039666637343565646138386337376637656631313939666330306435
3835333164623362340a623238663432316562363134666666363265386132386531323566623830
6137
command: cat /root/rootTempFile.txt
register: temp
- name: print temp value
debug: msg="{{temp.stdout_lines}}"
|
[결과 확인]
ansible-playbook --ask-vault-pass -i host.yaml sudoTest.yml
--ask-vault-pass : 암호화된 vault의 password를 입력하기 위해 사용되는 옵션
결과를 확인해보면 암호화된 password를 정상적으로 인식해서 동작하는 것을 확인할 수 있음.
ansible vault 암호화 결과 파일 생성
사전에 password 정보를 가지고 있는 파일을 생성
[vault_password.txt]
linux-root-password:qwer1234
[명령어]
ansible-vault create --vault-id linux-root-password@./vault_password.txt vault.txt
[결과]
암호화 data가 vault.txt파일에 존재함.
파일로 생성하면 inline vault 형식이 아닌 일반 txt 형식으로 출력함.
ansible-vault "--vault-id" 사용
--ask-vault-pass 옵션을 사용하게 되면 한가지 password로 모든 ansible-vault encryption data를 복호화 함.
하지만 한개의 playbook or inventory 파일에 동일하지 않은 password로 암호화 된 encryption data가 있을 수 있음.
이런 경우 각 항목마다 알맞은 password를 입력하기 위한 방법으로 --vault-id를 사용할 수 있음.
ansible도 --vault-id를 사용하는걸 추천한다고 함.
문자열을 암호화한 ansible vault 변수 생성
--vault-id를 사용해서 문자열을 암호화 하면
$ANSIBLE_VAULT 문자열 마지막에 id 가 추가되어서 생성됨.
해당 id로 encryption에 사용된 password를 구별할 수 있음
[명령어]
ansible-vault encrypt_string --vault-id root_passwd@prompt 'qwer1234' --na me 'linux-root-password'
--vault-id root_passwd@prompt : [id 설정] @ 옵션
옵션의 경우 prompt는 사용자가 암호화에 사용되는 password를 입력하는 설정임.
inventory yaml파일의 민감정보 부분에 암호문을 추가
[host.yml]
vault encryption string 사용 가능한 inventory, playbook 실행
[명령어]
ansible-playbook --vault-id root_passwd@prompt -i host.yaml sudoTest.yml
--vault-id root_passwd@prompt : [--vault-id로 지정했던 id] @ 옵션
옵션의 경우 prompt는 사용자가 password를 입력하는 설정임.
해당 자리에 prompt가 아닌 password data가 있는 file path가 올 수 있음.
[결과]
playbook이 정상적으로 실행되는 것을 확인할 수 있음.
--vault-id 에 해당하는 password를 입력하는 항목이 나옴.
--vault-id 항목은 여러개 추가할 수 있으며
추가된 vault-id 항목마다 Vault password 입력하는 부분이 출력됨.
참고
반응형
'클라우드 > Ansible' 카테고리의 다른 글
Ansible dynamic inventory란? (0) | 2022.05.05 |
---|---|
Ansible playbook에서 sudo 사용하기 (0) | 2022.04.07 |
Ansible, Hashicorp vault container 연동 (0) | 2022.04.07 |
Ansible "to use the 'ssh' connection type with passwords, you must install the sshpass program" (0) | 2022.02.23 |
Ansible directory, file 생성 후 file 내용 추가 (0) | 2022.02.10 |