Ansible Vault로 비밀을 안전하게 유지하기

잘못된 손에 비밀을 노출시키지 않는 것이 최우선입니다. 그러나 정확히 어떻게 비밀을 보호할 수 있을까요? 로컬 텍스트 파일에 저장하십니까? 암호화되지 않은 경우 위험합니다. 왜 Ansible Vault를 사용하여 변수와 파일을 암호화하지 않을까요?

이 튜토리얼에서는 Ansible Vault를 사용하여 암호나 키와 같은 민감한 내용을 보호하는 방법을 배울 수 있습니다.

계속 읽고 비밀을 엿보는 눈으로부터 보호하세요!

전제 조건

이 튜토리얼은 실습을 위한 것입니다. 따라하려면 다음이 필요합니다.

  • A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
  • 기계에 Ansible이 설치되어 있어야 합니다.

기본 Ansible Vault 편집기 설정하기

시스템 관리자로서 다양한 Ansible 플레이북을 다루게 될 수 있습니다. 이 플레이북에는 다른 서버의 사용자 이름과 비밀번호가 포함될 수 있습니다. 이러한 파일을 평문 형식으로 버전 관리 시스템에 커밋할 수 없습니다. 그리고 이러한 이유로 Ansible Vault가 유용합니다.

Ansible Vault는 데이터를 암호화된 파일에 저장하기 위해 기존의 워크플로우에 통합되도록 설계되었습니다. 그러나 첫 번째 Ansible Vault를 생성하기 전에 기본 Ansible Vault 편집기를 설정해야 합니다.

1. 터미널을 열고 기계에 SSH로 접속하세요.

2. 그 다음, 텍스트 편집기를 사용하여 ~/.bashrc 파일을 엽니다. ~/.bashrc 파일은 새로운 터미널 세션이 시작될 때마다 실행되는 셸 스크립트입니다. 이 셸 스크립트는 대화형 셸 세션을 초기화하고 환경 변수를 정의합니다.

3. 다음 줄을 ~/.bashrc 파일의 끝에 추가하고, 변경 사항을 저장하고 편집기를 종료합니다.

이 줄은 현재 로그인한 사용자를 위해 EDITOR 변수를 설정합니다. EDITOR 변수는 새로운 터미널 세션을 열 때마다 우선적으로 사용할 텍스트 편집기를 지정합니다.

원하는 다른 텍스트 편집기를 설정할 수도 있지만, 이 튜토리얼에서는 nano 텍스트 편집기를 사용합니다.

export EDITOR=nano
Setting the Default Text Editor

4. 마지막으로, 다음 명령을 실행하여 변경 사항을 적용하고 (source), 로그아웃하고 다시 로그인하지 않고 현재 시스템의 기본 텍스트 편집기를 출력합니다 (echo).

# 환경 변수를 현재 셸 세션에 로드합니다.
source ~/.bashrc
# 현재 시스템의 기본 텍스트 편집기를 출력합니다.
echo $EDITOR

아래와 같이 EDITOR 변수가 원하는 편집기로 설정되었는지 확인합니다.

Applying and Verifying Changes

첫 번째 Ansible Vault 생성 및 암호화하기

기본 보관함 편집기를 설정했으므로 이제 첫 번째 보관함을 생성할 차례입니다. 사용자 이름, 비밀번호, 비밀 엑세스 키 등과 같이 민감한 정보가 포함된 파일을 생성하고 암호화합니다.

Ansible Vaults와 상호 작용하는 주요 인터페이스인 ansible-vault 명령을 실행합니다.

1. 다음 명령을 실행하여 secret.yml 파일을 생성합니다. Ansible은 JSON과 같은 다른 데이터 형식보다 사람이 읽기 쉬운 형식인 YAML을 사용합니다.

ansible-vault create secret.yml

파일에 대한 비밀번호를 입력하고 확인하라는 메시지가 표시됩니다. 이 비밀번호는 나중에 파일을 암호화하고 복호화하는 데 사용되므로 기억하기 쉬운 강력한 비밀번호를 선택하십시오.

Creating the secret.yml File with a Password

2. 보관함의 비밀번호를 설정한 후 기본 텍스트 편집기에서 빈 파일이 열립니다. 파일에 저장할 민감한 정보를 입력한 후 파일을 저장하고 편집기를 닫으십시오.

이 튜토리얼에서는 secret.yml 파일에 aws_access_key 및 aws_secret_key 변수를 저장합니다. 이 시점에서 Ansible은 secret.yml 파일을 암호화하며, 보관함의 비밀번호를 알지 못하는 사람은 보관함의 내용을 읽을 수 없습니다.

Providing Sensitive Information (secrets)

3. 패스워드 없이 secret.yml 파일의 내용을 보려면 cat 명령을 실행하십시오.

cat secret.yml

다음과 같이 무작위 숫자가 표시되면 파일의 내용이 암호화되었음을 확인할 수 있습니다. 파일의 맨 위에있는 $ANSIBLE_VAULT;1.1;AES256 헤더는 파일이 AES256 암호화 알고리즘을 사용하여 Ansible Vault로 암호화되었음을 나타냅니다.

고급 암호화 표준(AES)은 데이터를 암호화하고 복호화하기 위해 동일한 키를 사용하는 대칭키 알고리즘입니다.

Viewing the secret.yml file Without the Vault’s Password

기존 파일 암호화

이미 암호화 된 파일을 만들었습니다. 그러나 기존 파일을 암호화하는 방법은 어떨까요? Ansible은 지정된 파일을 암호화하기 위한 encrypt 하위 명령도 제공합니다. 기존 파일을 암호화하는 방법을 알아보기 위해 Ansible 변수를 포함하는 특정 파일을 암호화합니다.

다음 명령을 실행하여 파일(vars.yml)을 암호화하십시오.

ansible-vault encrypt vars.yml

secret.yml 파일을 처음 만들 때와 마찬가지로, vars.yml 파일에 대한 비밀번호를 입력하라는 메시지가 표시됩니다.

기본 편집기는 이번에는 열리지 않습니다. 왜냐하면 vars.yml 파일이 이미 존재하기 때문입니다. 대신, 다음과 같이 Encryption successful 메시지가 표시되어 파일이 Ansible에 의해 암호화되었음을 나타냅니다.

Encrypting an Existing File (vars.yml)

이제 다음 명령을 실행하여 Ansible이 vars.yml 파일을 암호화했는지 확인하십시오.

cat vars.yml
Verifying Encrypted Existing File

Ansible Vault에서 데이터 복호화

파일을 암호화하여 보안을 유지하는 방법을 보았습니다. 그러나 파일의 내용을 보려면 어떻게 파일을 복호화할까요? 파일을 복호화하는 것은 암호화된 파일을 편집하거나 암호를 매번 제공하지 않고 내용을 읽을 때 유용합니다. 그리고 Ansible의 decrypt 하위 명령어가 유용하게 사용될 것입니다.

1. 다음 명령을 실행하여 secret.yml 파일을 복호화하십시오.

decrypt 하위 명령어는 암호화된 파일의 경로를 유일한 인수로 사용합니다.

ansible-vault decrypt secret.yml

파일의 암호를 입력하면 파일의 내용이 복호화되어 평문으로 디스크에 작성됩니다.

Decrypting File Data

2. 그다음, cat 명령을 실행하여 secret.yml 파일의 복호화된 내용을 확인하십시오.

cat secret.yml

아래에서는 암호화되지 않은 상태로 터미널에 출력된 secret.yml 파일의 내용을 확인할 수 있습니다. 이 시점에서 파일에 원하는대로 줄을 추가, 편집 또는 삭제할 수 있습니다.

file to your heart’s content

3. 마지막으로 아래 명령을 실행하여 secret.yml 파일을 암호화하고 파일의 내용을 안전하게 유지하기 위해 암호를 제공하십시오.

ansible-vault encrypt secret.yml
Encrypting a Decrypted File (secret.yml)

Ansible Vault의 암호 업데이트

파일을 암호화하고 복호화할 때마다 암호를 입력해야 함을 알 수 있습니다. 그러나 파일을 복호화하지 않고 파일의 암호를 업데이트하려는 경우 rekey 하위 명령어를 사용해야 합니다. 이 하위 명령어를 사용하면 파일의 암호를 원하는 대로 변경할 수 있습니다.

secret.yml 파일의 암호를 업데이트하려면 다음 명령을 실행하세요.

rekey 하위 명령은 유일한 인수로 암호화된 파일의 경로를 사용합니다.

ansible-vault rekey secret.yml

아래에 표시된대로 파일의 현재 암호 다음에 새 암호를 입력하세요.

이 시점에서 이전 암호를 사용하여 파일을 해독할 수 없습니다.

Updating Ansible Vault’s Password

이제 아래 명령을 실행하여 secret.yml 파일을 해독하려고 시도하세요.

ansible-vault decrypt secret.yml

프롬프트에서 이전 암호를 입력하면 해독 실패라는 오류 메시지가 표시됩니다. 이 출력은 파일의 암호가 성공적으로 업데이트되었음을 확인합니다.

Verifying New Password is in Effect

Playbook 및 모듈에서 보호된 데이터 사용하기

파일을 암호화하고 해독하는 명령을 실행하는 것을 보았습니다. 그러나 응용 프로그램을 안전하게 자동화하려면 playbook 및 모듈을 사용해야 합니다.

1. Ansible 설정 파일 (~/.ansible.cfg)을 편집기에서 열어 Ansible의 설정을 확인하세요.

다음 코드를 ~/.ansible.cfg 파일의 끝에 복사하여 변경 사항을 저장하고 편집기를 닫으세요. 이 코드는 Ansible이 인벤토리 파일 (~/.ansible-hosts)을 찾도록 지시합니다.

[defaults]
hostfile = ~/.ansible-hosts

2. 다음으로, Ansible 관리 노드에서 관리할 수 있는 호스트의 인벤토리를 포함하는 ~/.ansible-hosts 파일을 엽니다.

다음 코드를 ~/.ansible-hosts 파일에 작성하여 변경 사항을 저장하고 파일을 닫으세요. 이 코드는 Ansible이 로컬 연결 유형을 통해 localhost를 관리할 수 있도록 지시합니다.

localhost ansible_connection=local

3. 새로운 암호화된 파일을 생성하려면 아래 명령을 실행하십시오. 파일 이름은 자유롭게 지정할 수 있지만, 이 튜토리얼에서 파일은 helloworld.yml로 지정되었습니다.

ansible-vault create helloworld.yml
Creating Ansible Playbook (helloworld.yml)

아래 코드를 helloworld.yml 파일에 추가하고 변경 사항을 저장하고 편집기를 닫으십시오.

이 코드는 인벤토리의 모든 호스트에 대해 “hello world” 메시지를 출력하는 기본적인 Ansible 플레이북입니다. 코드 블록 상단의 — 기호는 YAML 문서의 시작을 나타냅니다.

---

- hosts: all # 인벤토리의 모든 호스트에 작업을 수행하도록 설정
  tasks: # 수행할 작업 설정
    - shell: echo 'hello world' # 'hello world' 메시지 출력

4. 마지막으로, 인벤토리의 모든 호스트에 helloworld.yml 플레이북을 실행하기 위해 아래의 ansible-playbook 명령을 실행하고 –ask-vault-pass 옵션을 추가하십시오.

ansible-playbook --ask-vault-pass helloworld.yml

prompt에서 helloworld.yml 파일의 암호를 입력하십시오. 아래에서 볼 수 있듯이, 플레이북 실행이 성공적으로 완료되었습니다.

  • ok=2 – 두 작업이 모두 성공적으로 실행되었음을 나타냅니다.
  • changed=1 – 작업이 시스템의 상태를 변경하였음을 나타냅니다. 이 경우, 쉘에 “hello world” 메시지를 작성했습니다.
  • unreachable와 failed는 모두 0 – 실행 중 호스트에 문제가 없음을 나타냅니다.
Running your playbook

암호 파일을 사용하여 Ansible Vault 사용하기

일회성 작업을 실행할 때 수동으로 암호를 입력하는 것은 실제 환경에서는 현실적이지 않습니다.

A better way to provide the password for encrypting and decrypting files is to use a password file. This way, you can store the password in a secure location, and Ansible will read the password from the file needed.

1. 아래 명령을 실행하여 Ansible Vault 비밀번호를 .vault_pass라는 파일에 저장하십시오. my_vault_password를 실제 Vault 비밀번호로 바꾸십시오.

echo 'my_vault_password' > .vault_pass

2. 다음으로, 각 명령을 실행하여 파일의 소유권(chown)을 root로 변경하고 .vault_pass 파일의 권한을 변경하십시오. 이러한 명령은 파일을 읽고 쓸 수 있는 권한이 root 사용자만 가지도록 보장합니다.

# 파일 소유권을 root 사용자로 변경
chown root:root .vault_pass
# 파일 권한을 root만 읽고 쓰기 권한으로 변경
chmod 700 .vault_pass

3. 마지막으로, 아래의 ansible-playbook 명령을 실행한 후 –vault-password-file 옵션을 사용하여 비밀번호 파일(.vault_pass)을 사용하여 플레이북(helloworld.yml)을 실행하십시오.

ansible-playbook --vault-password-file=.vault_pass helloworld.yml

아래에서 보듯이 Ansible은 암호화된 파일의 비밀번호를 요청하지 않고 플레이북을 실행합니다.

Running Playbook using a Password File

결론

이 튜토리얼에서는 Ansible Vault를 사용하여 Ansible 플레이북 및 작업에 대한 민감한 데이터를 암호화하고 복호화하는 방법을 배웠습니다. 비밀번호 파일을 사용하여 Ansible Vault 비밀번호를 안전한 위치에 저장했습니다. 이 동작은 플레이북을 실행할 때 사용자 개입을 줄일 수 있어 유용합니다.

이 새로운 지식을 갖고 있으면 민감한 데이터를 안전하게 암호화하고 플레이북을 다른 사람들과 공유할 때 데이터의 보안에 대해 걱정하지 않고 자신감을 가질 수 있습니다.

만약 비밀번호 관리를 위해 LastPass를 사용한다면, 왜 LastPass에 Ansible 보안 비밀번호를 저장하지 않고 필요할 때 Ansible이 자동으로 가져오도록 하지 않을까요?

Source:
https://adamtheautomator.com/ansible-vault/