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
변수 및 vaults ansible 설명서
'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 |