이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Ansible

ansible-vault 리서치

이쿠우우 2022. 5. 5. 16:55
반응형
 
 
 

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 입력하는 부분이 출력됨.

 

반응형