ansible vault란?

ansible host에서 사용하는 특정 파일이나 ansible-playbook 내용에는 비밀번호나 api 키 값 같은 중요한 데이터가 포함될 수 있다. 이런 것들을 텍스트로 저장하면 보안에 문제가 생길 수 있으므로, 암호화가 필요하다. 이런 암호화를 수행하는 것이 ansible vault 이다. 이것은 모든 구조화된 데이터파일을 암호화/해독 할 수 있다.

 

이러한 기능은 ansible 자체의 암호화 기능은 아니며, 외부 python 도구를 사용한다. 암호화할 대상 파일은 AES256을 사용하여 대칭형 암호화로 보호된다. AES256은 최신버전에서 사용되며, 이전 버전에서는 128BIT AES를 쓸 수도 있다.

 

 

ansible vault의 기능

- 민감한 변수를 암호화

- 암호화한 파일을 해독

- 암호화된 파일을 참조하는 playbook을 사용할 수 있음

- 인벤토리 변수, playbook, 변수파일, ansible role에서 정의된 변수 등 여러가지를 암호화할 수 있다.

 

ansible vault 사용하기

암호화된 파일 만들기 ansible-vault create secret_test.yml
안호화된 파일 확인하기 ansible-vault view secret_test.yml
암호화된 파일 편집하기 ansible-vault edit secret_test.yml
기존 파일 암호화하기 ansible-vault encrypt test_encrypt_yml
암호화된 파일 암호 해제하기 ansible-vault decrypt test_encrypt.yml
암호화된 파일의 접근 암호 변경하기 ansible-vault rekey test_encrypt.yml

 

1. ansible vault로 파일 생성하기

 

구문 : ansible-vault create 파일명

예시 : ansible-vault create secret_test.yml

 

- 이렇게 구문을 실행하면, 패스워드를 물어보며 준비해둔 패스워드를 두번 입력한다.

- 그 후 vim 에디터가 나오며, 여기서 내용을 작성하고 저장을 하면 cecret_test.yml이 암호화되어 저장된다.

 

* ansible-vault create시 압호 입력하지 않고 파일로 만들어서 지정하는 옵션

- 옵션 : --vault-password-file=파일명과경로

- 예시 : ansible-cault create --vault-password-file=secret.txt /home/jason/ansible/anspw secret_test.yml

- 이 파일은 파일 권한과 여러가지 방식으로 아주 조심히 다뤄야 한다.

 

* vi 에디터가 아닌 다른 에디터를 사용하기

- 구문 : export EDITOR=에디터명 

- 예시 : export EDITOR=nano (nano 에디터를 쓰는 경우)

- 이 방법은 임시 방법이며, 영구적인 방법은 리눅스 환경변수 관련 내용을 참조한다.

 

 

2. ansible vault로 암호화된 파일을 해독하여 내용 보기

 

구문 : ansible-vault view 파일명

예시 : ansible-vault view secret_test.yml

 

- 만약, 암호화된 파일을 그냥 에디터로 열어보면 아래와 같이 암호화된 모습을 확인할 수 있다.

 

3. 암호화된 파일 편집하기

 

구문 : ansible-vault edit 파일명

예시 : ansible-vault edit secret_test.yml

 

- edit 명령은 파일을 항상 다시 작성한다. 따라서 변경할때만 사용해야 한다.

- 이게 왜 문제냐면, 버전제어 프로그램 (git 등)을 쓸 때 파일이 새로 생성되므로 관련해서 특이사항이 있을 수도 있다. 따라서 내용을 볼 때는 view를 사용해야 한다.

 

 

4. 기존 파일 암호화하기

 

구문 : ansible-vault encrypt 파일명

예시 : ansible-vault encrypt test_encrypt_yml

 

- 파일명 부분에 여러개의 파일을 나열할 수도 있다.

 

* 암호화된 파일을 새로 생성하기

- 옵션 : --output=output파일명

- 예시 : ansible-vault encrypt --output=internet_encrypted.yml internet.yml

- 원본은 그대로 두고 동일한 내용의 새로운 암호화된 파일 만들 수 있다.

 

 

5. 암호 해독하기

구문 : ansible-vault decrypt 파일명

예시 : ansible-vault decrypt test_encrypt.yml

 

- 암호화된 파일을 영구적으로 해독해서 일반 파일로 만든다.

 

* 해독된 파일을 새로 생성하기

- 옵션 : --output=output파일명

- 예시 : ansible-vault decrypt secret1.yml --output=secret1-decrypted.yml

- 원본은 그대로 두고 동일한 내용의 암호해독된 새로운 파일 만들 수 있다.

 

 

6. 암호화된 파일의 암호를 변경하기

 

구문 : ansible-vault rekey 파일명

예시 : ansible-vault rekey test_encrypt.yml

 

* vault 암호파일로 암호 변경하기

- 옵션 : --new-vault-password-file=vault패스워드파일

- 예시 : ansible-vault rekey --new-vault-password-file=pwfile test_encrypt.yml

 

 

 

암호화된 yml 파일을 playbook으로 사용하기

* 직접 암호를 입력받아서 사용하기

ansible-playbook [--syntax-check] --vault-id @prompt internet_encrypted.yml
이후 패스워드를 입력함

- 이 구문은 2.5부터 사용하는 최신 구문이며, 2.4 이하 버전에서는 (ansible-playbook --ask-vault-pass 파일명) 구문을 사용한다.

 

* 패스워드 파일을 지정해서 사용하기

ansible-playbook --vault-password-file=패스워드파일 internet_encrypted.yml

- 암호가 들어있는 패스워드 파일은 일반 텍스트 파일이므로 파일권한과 여러 다른 보안수단으로 보호해야 한다.

- ANSIBLE_VAULT_PASSWORD_FILE 환경변수를 사용하여 암호 파일의 기본 위치를 지정할 수 있다.

 

 

 

 

변수 파일 관리 권장 사례

이전 9장에서, 변수를 넣는 여러가지 방법을 배웠는데, 그 중 변수들을 별도의 파일로 보관하는 방법이 여러모로 관리의 편의성이 좋다. 또한 ansible-vault를 사용하여 중요한 변수를 포함하는 파일을 보호할수도 있기 때문에 더 권장된다.

 

일반적으로 그룹변수, 호스트변수를 관리하는데 선호되는 방식은 playbook 레벨에서 디렉토리를 생성하는 것이며, 일반적으로 group_vars 디렉토리는 호스트 그룹의 변수, host_vars는 호스트 각각의 이름과 일치하는 호스트의 변수 파일들을 포함한다. 아래와 같은 형태가 될 수 있다.

 

 

여기서 vars는 각각의 일반 변수들을 저장하는 파일이고, vault는 암호화된 변수를 저장하는 파일이 된다. 즉 관리자가 ansible-vault를 사용하여 vault 파일을 암호화할 수 있다. 

 

위에 내용까지는 인벤토리 변수로써 변수 사용에 대해 이야기했는데, 또한 플레이북 변수도 ansible-vault로 보호할수 있다. 플레이북 안에서 vars_files 지시어로 플레이북에 포함된 별도의 암호화된 파일을 배치할 수 있다. 플레이북 변수는 인벤토리 변수보다 우선시되므로 이를 유의할 것.

 

 

vault 속도 올리기

기본적으로 ansible은 python-crypto 패키지의 기능을 사용하여 암호/복호화를 수행한다. 암호화된 파일이 많을 경우 지연 시간이 발생할 수 있으며 이를 가속화하려면 아래처럼 패키지를 설치한다. 이 패키지는 암호화 레시피 및 기본 항목을 가지는 python 라이브러리를 제공한다.

yum install python-cryptography

 

 

연습문제

1. ansible vault로 변수 및 패스워드 파일 암호화

# vi pwdfile
username: ansibleuser3
password: passw0rd

# ansible-vault encrypt pwdfile

- 파일 확장자는 상관없으며, 해당 파일을 암호화한다.

 

2. 암호화된 파일을 참조하여 ansible-playbook 생성

---
- name: create user accounts using vault
  hosts: web.example.com
  become: true
  remote_user: jason
  vars_files:
    - pwdfile

  tasks:
    - name: createing user from pwdfile
      user:
        name: "{{ username }}"
        password: "{{ password | password_hash('sha512') }}"

- 여기서 password 부분을 password라는 변수로 받았는데, passord_hash('sha512') 부분을 포함하지 않으면 아래와 같이 warning이 발생한다. 이렇게 되면 작업은 완료했으나 실제로는 제대로 적용되지 않아 로그인이 되지 않는다.

 

3. 실행 및 확인

ansible-playbook --vault-id @prompt create_user_vault.yml

- 이 플레이북에서 참조하는 pwdfile이 암호화되어있기 때문에 --vault-id @prompt 구문이 포함되어야 한다.

- web.example.com 에서 아래와 같이 명령 실행하여 잘 로그인되는지 확인

 

 

 

 

 

참조도움말

ansible-playbook(1)

ansible-vault(1)

 

참조링크

 

vault ansible 설명서

https://docs.ansible.com/ansible/2.7/user_guide/playbooks_vault.html 

 

Using Vault in playbooks — Ansible Documentation

You are reading an unmaintained version of the Ansible documentation. Unmaintained Ansible versions can contain unfixed security vulnerabilities (CVE). Please upgrade to a maintained version. See the latest Ansible documentation. The “Vault” is a featu

docs.ansible.com

변수 및 vaults ansible 설명서

https://docs.ansible.com/ansible/2.7/user_guide/playbooks_best_practices.html#best-practices-for-variables-and-vaults

 

Best Practices — Ansible Documentation

Here are some tips for making the most of Ansible and Ansible playbooks. You can find some example playbooks illustrating these best practices in our ansible-examples repository. (NOTE: These may not use all of the features in the latest release, but are s

docs.ansible.com

 

'Ansible' 카테고리의 다른 글

12장. 작업 제어 구현 - 핸들러  (0) 2021.02.24
11장. 작업 제어 구현 - 반복문과 조건문  (0) 2021.02.23
9장. fact 변수 관리  (0) 2021.02.20
8장. 변수 사용하기  (0) 2021.02.20
7장. ansible playbook 기본 구현  (0) 2021.02.20

+ Recent posts