웹사이트 검색

Ansible Vault를 사용하여 민감한 플레이북 데이터를 보호하는 방법


소개

Ansible Vault는 사용자가 Ansible 프로젝트 내에서 값과 데이터 구조를 암호화할 수 있는 기능입니다. 이는 Ansible 재생을 성공적으로 실행하는 데 필요하지만 비밀번호나 개인 키와 같이 공개적으로 볼 수 없어야 하는 민감한 데이터를 보호하는 기능을 제공합니다. Ansible은 키가 제공되면 런타임에 볼트 암호화 콘텐츠를 자동으로 해독합니다.

이 가이드에서는 Ansible Vault를 사용하는 방법을 시연하고 사용을 단순화하기 위한 몇 가지 권장 사례를 살펴봅니다. 우리는 Ansible 제어 시스템에 Ubuntu 20.04 서버를 사용할 것입니다. 원격 호스트가 필요하지 않습니다.

전제 조건

따라 하려면 sudo 권한이 있는 루트가 아닌 사용자가 있는 Ubuntu 20.04 서버가 필요합니다. Ubuntu 20.04 초기 서버 설정 가이드에 따라 적절한 권한이 있는 사용자를 생성할 수 있습니다.

서버에서 Ansible을 설치하고 구성해야 합니다. Ubuntu 20.04에 Ansible 설치에 대한 자습서를 따라 적절한 패키지를 설치할 수 있습니다.

서버가 위의 요구 사항으로 구성된 경우 이 가이드를 계속 진행하십시오.

앤서블 볼트란?

Ansible Vault는 암호화된 콘텐츠를 Ansible 워크플로에 투명하게 통합할 수 있는 메커니즘입니다. ansible-vault라는 유틸리티는 비밀이라는 기밀 데이터를 디스크에서 암호화하여 보호합니다. 이러한 비밀을 일반 Ansible 데이터와 통합하기 위해 임시 작업 및 구조화된 플레이북을 각각 실행하기 위한 ansibleansible-playbook 명령 모두 볼트 암호화 콘텐츠의 암호 해독을 지원합니다. 런타임에.

Vault는 파일 수준 단위로 구현됩니다. 즉, 개별 파일이 암호화되거나 암호화되지 않습니다. AES256 알고리즘을 사용하여 사용자가 제공한 비밀번호에 대칭 암호화 키를 제공합니다. 이는 동일한 암호가 콘텐츠를 암호화하고 해독하는 데 사용된다는 것을 의미하며, 이는 유용성 관점에서 도움이 됩니다. Ansible은 플레이북 또는 작업을 실행하는 동안 찾은 볼트 암호화 파일을 식별하고 해독할 수 있습니다.

이제 Vault가 무엇인지 이해했으므로 Ansible이 제공하는 도구와 기존 워크플로에서 Vault를 사용하는 방법에 대해 논의할 수 있습니다.

Ansible Vault 편집기 설정

ansible-vault 명령을 사용하기 전에 원하는 텍스트 편집기를 지정하는 것이 좋습니다. Vault의 몇 가지 명령에는 편집기를 열어 암호화된 파일의 내용을 조작하는 작업이 포함됩니다. Ansible은 EDITOR 환경 변수를 살펴보고 선호하는 편집기를 찾습니다. 이것이 설정되지 않은 경우 기본값은 vi입니다.

vi 편집기로 편집하지 않으려면 환경에서 EDITOR 변수를 설정해야 합니다.

참고: 실수로 vi 세션에 있는 경우 Esc 키를 누르고 :q!를 입력한 다음 Enter 키를 눌러 종료할 수 있습니다. vi 편집기에 익숙하지 않은 경우 의도하지 않은 변경이 있을 수 있으므로 이 명령은 저장하지 않고 종료됩니다.

개별 명령에 대한 편집기를 설정하려면 다음과 같이 명령 앞에 환경 변수 할당을 추가합니다.

  1. EDITOR=nano ansible-vault . . .

이것을 영구적으로 만들려면 ~/.bashrc 파일을 엽니다.

  1. nano ~/.bashrc

파일 끝에 EDITOR 할당을 추가하여 원하는 편집기를 지정합니다.

export EDITOR=nano

완료되면 파일을 저장하고 닫습니다.

파일을 다시 소싱하여 현재 세션에 대한 변경 사항을 읽습니다.

  1. . ~/.bashrc

EDITOR 변수를 표시하여 설정이 적용되었는지 확인합니다.

  1. echo $EDITOR
Output
nano

이제 원하는 편집기를 설정했으므로 ansible-vault 명령으로 사용할 수 있는 작업에 대해 논의할 수 있습니다.

ansible-vault로 민감한 파일을 관리하는 방법

ansible-vault 명령은 Ansible 내에서 암호화된 콘텐츠를 관리하기 위한 기본 인터페이스입니다. 이 명령은 처음에 파일을 암호화하는 데 사용되며 나중에 데이터를 보거나 편집하거나 해독하는 데 사용됩니다.

새 암호화 파일 생성

Vault로 암호화된 새 파일을 생성하려면 ansible-vault create 명령을 사용합니다. 생성하려는 파일의 이름을 전달합니다. 예를 들어 중요한 변수를 저장하기 위해 vault.yml이라는 암호화된 YAML 파일을 생성하려면 다음을 입력할 수 있습니다.

  1. ansible-vault create vault.yml

비밀번호를 입력하고 확인하라는 메시지가 표시됩니다.

Output
New Vault password: Confirm New Vault password:

암호를 확인하면 Ansible이 원하는 내용을 입력할 수 있는 편집 창을 즉시 엽니다.

암호화 기능을 테스트하려면 몇 가지 테스트 텍스트를 입력하십시오.

Secret information

Ansible은 파일을 닫을 때 내용을 암호화합니다. 파일을 확인하면 입력한 단어가 아니라 암호화된 블록이 표시됩니다.

  1. cat vault.yml
Output
$ANSIBLE_VAULT;1.1;AES256 65316332393532313030636134643235316439336133363531303838376235376635373430336333 3963353630373161356638376361646338353763363434360a363138376163666265336433633664 30336233323664306434626363643731626536643833336638356661396364313666366231616261 3764656365313263620a383666383233626665376364323062393462373266663066366536306163 31643731343666353761633563633634326139396230313734333034653238303166

Ansible이 파일을 처리하는 방법을 알기 위해 사용하는 몇 가지 헤더 정보와 숫자로 표시되는 암호화된 콘텐츠를 볼 수 있습니다.

기존 파일 암호화

Vault로 암호화하려는 파일이 이미 있는 경우 ansible-vault encrypt 명령을 대신 사용하십시오.

테스트를 위해 다음을 입력하여 예제 파일을 만들 수 있습니다.

  1. echo 'unencrypted stuff' > encrypt_me.txt

이제 다음을 입력하여 기존 파일을 암호화할 수 있습니다.

  1. ansible-vault encrypt encrypt_me.txt

다시 암호를 제공하고 확인하라는 메시지가 표시됩니다. 그런 다음 암호화를 확인하는 메시지가 표시됩니다.

Output
New Vault password: Confirm New Vault password: Encryption successful

편집 창을 여는 대신 ansible-vault는 파일의 내용을 암호화하고 디스크에 다시 기록하여 암호화되지 않은 버전을 대체합니다.

파일을 확인하면 유사한 암호화 패턴을 볼 수 있습니다.

  1. cat encrypt_me.txt
Output
$ANSIBLE_VAULT;1.1;AES256 66633936653834616130346436353865303665396430383430353366616263323161393639393136 3737316539353434666438373035653132383434303338640a396635313062386464306132313834 34313336313338623537333332356231386438666565616537616538653465333431306638643961 3636663633363562320a613661313966376361396336383864656632376134353039663662666437 39393639343966363565636161316339643033393132626639303332373339376664

보시다시피 Ansible은 새 파일을 암호화하는 것과 거의 동일한 방식으로 기존 콘텐츠를 암호화합니다.

암호화된 파일 보기

경우에 따라 파일을 편집하거나 암호화되지 않은 파일 시스템에 쓸 필요 없이 볼트 암호화 파일의 내용을 참조해야 할 수 있습니다. ansible-vault view 명령은 파일의 내용을 표준 출력으로 피드합니다. 기본적으로 이는 내용이 터미널에 표시됨을 의미합니다.

볼트 암호화 파일을 다음 명령에 전달합니다.

  1. ansible-vault view vault.yml

파일의 암호를 묻는 메시지가 표시됩니다. 성공적으로 입력하면 내용이 표시됩니다.

Output
Vault password: Secret information

보시다시피 암호 프롬프트가 파일 내용의 출력에 혼합되어 있습니다. 자동화된 프로세스에서 ansible-vault 보기를 사용할 때 이 점을 염두에 두십시오.

암호화된 파일 편집

암호화된 파일을 편집해야 하는 경우 ansible-vault edit 명령을 사용합니다.

  1. ansible-vault edit vault.yml

파일의 암호를 묻는 메시지가 나타납니다. 파일을 입력하면 Ansible이 파일을 편집 창에서 열어 필요한 사항을 변경할 수 있습니다.

저장 시 새 콘텐츠는 파일의 암호화 암호를 사용하여 다시 암호화되고 디스크에 기록됩니다.

암호화된 파일을 수동으로 해독

볼트 암호화 파일을 복호화하려면 ansible-vault decrypt 명령을 사용하십시오.

참고: 중요한 데이터를 실수로 프로젝트 리포지토리에 커밋할 가능성이 높기 때문에 ansible-vault decrypt 명령은 파일에서 암호화를 영구적으로 제거하려는 경우에만 제안됩니다. 볼트 암호화 파일을 보거나 편집해야 하는 경우 일반적으로 각각 ansible-vault view 또는 ansible-vault edit 명령을 사용하는 것이 좋습니다.

암호화된 파일의 이름을 전달합니다.

  1. ansible-vault decrypt vault.yml

파일의 암호화 암호를 묻는 메시지가 나타납니다. 올바른 암호를 입력하면 파일이 해독됩니다.

Output
Vault password: Decryption successful

파일을 다시 보면 저장소 암호화 대신 파일의 실제 내용이 표시됩니다.

  1. cat vault.yml
Output
Secret information

이제 파일이 디스크에서 암호화되지 않았습니다. 완료되면 중요한 정보를 제거하거나 파일을 다시 암호화하십시오.

암호화된 파일의 비밀번호 변경

암호화된 파일의 암호를 변경해야 하는 경우 ansible-vault rekey 명령을 사용하십시오.

  1. ansible-vault rekey encrypt_me.txt

명령을 입력하면 먼저 파일의 현재 암호를 묻는 메시지가 나타납니다.

Output
Vault password:

암호를 입력하면 새 볼트 암호를 선택하고 확인하라는 메시지가 표시됩니다.

Output
Vault password: New Vault password: Confirm New Vault password:

새 암호를 성공적으로 확인하면 재암호화 프로세스의 성공을 나타내는 메시지가 나타납니다.

Output
Rekey successful

이제 새 암호를 사용하여 파일에 액세스할 수 있습니다. 이전 암호는 더 이상 작동하지 않습니다.

볼트 암호화 파일로 Ansible 실행

민감한 정보를 Vault로 암호화한 후에는 Ansible의 기존 도구로 파일을 사용할 수 있습니다. ansibleansible-playbook 명령은 올바른 비밀번호가 제공된 볼트 보호 파일을 해독하는 방법을 알고 있습니다. 필요에 따라 이러한 명령에 암호를 제공하는 몇 가지 방법이 있습니다.

따라하려면 볼트 암호화 파일이 필요합니다. 다음을 입력하여 만들 수 있습니다.

  1. ansible-vault create secret_key

비밀번호를 선택하고 확인합니다. 원하는 더미 콘텐츠를 입력합니다.

confidential data

파일을 저장하고 닫습니다.

인벤토리로 임시 hosts 파일을 생성할 수도 있습니다.

  1. nano hosts

Ansible localhost만 추가하겠습니다. 이후 단계를 준비하기 위해 [database] 그룹에 배치합니다.

[database]
localhost ansible_connection=local

완료되면 파일을 저장하고 닫습니다.

다음으로, 아직 존재하지 않는 경우 현재 디렉토리에 ansible.cfg 파일을 생성합니다.

  1. nano ansible.cfg

지금은 [defaults] 섹션을 추가하고 Ansible이 방금 생성한 인벤토리를 가리킵니다.

[defaults]
inventory = ./hosts

준비가 되면 계속 진행하십시오.

대화식 프롬프트 사용

런타임에 콘텐츠를 해독하는 가장 간단한 방법은 Ansible이 적절한 자격 증명을 묻는 메시지를 표시하도록 하는 것입니다. --ask-vault-passansible 또는 ansible-playbook 명령에 추가하여 이 작업을 수행할 수 있습니다. Ansible은 찾은 볼트 보호 콘텐츠를 해독하는 데 사용할 암호를 묻는 메시지를 표시합니다.

예를 들어 볼트로 암호화된 파일의 내용을 호스트에 복사해야 하는 경우 copy 모듈과 --ask-vault-pass 를 사용하여 복사할 수 있습니다. 깃발. 파일에 실제로 중요한 데이터가 포함되어 있는 경우 권한 및 소유권 제한으로 원격 호스트에 대한 액세스를 잠그고 싶을 것입니다.

참고: 이 예제에서는 필요한 서버 수를 최소화하기 위해 localhost를 대상 호스트로 사용하고 있지만 결과는 호스트가 진정한 원격인 경우와 같아야 합니다.

  1. ansible --ask-vault-pass -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

우리의 작업은 파일의 소유권이 root로 변경되어야 하므로 관리 권한이 필요하도록 지정합니다. -bK 플래그는 Ansible에 대상 호스트에 대한 sudo 암호를 묻는 메시지를 표시하도록 지시하므로 sudo 암호를 묻는 메시지가 표시됩니다. 그런 다음 Vault 비밀번호를 묻는 메시지가 표시됩니다.

Output
BECOME password: Vault password:

암호가 제공되면 Ansible은 찾은 모든 암호화된 파일에 대해 Vault 암호를 사용하여 작업 실행을 시도합니다. 실행 중에 참조되는 모든 파일은 동일한 암호를 사용해야 합니다.

Output
localhost | SUCCESS => { "changed": true, "checksum": "7a2eb5528c44877da9b0250710cba321bc6dac2d", "dest": "/tmp/secret_key", "gid": 0, "group": "root", "md5sum": "270ac7da333dd1db7d5f7d8307bd6b41", "mode": "0600", "owner": "root", "size": 18, "src": "/home/sammy/.ansible/tmp/ansible-tmp-1480978964.81-196645606972905/source", "state": "file", "uid": 0 }

암호를 묻는 메시지는 안전하지만 특히 반복 실행 시 지루할 수 있으며 자동화를 방해하기도 합니다. 고맙게도 이러한 상황에 대한 몇 가지 대안이 있습니다.

암호 파일과 함께 Ansible Vault 사용

작업을 실행할 때마다 Vault 암호를 입력하지 않으려면 Vault 암호를 파일에 추가하고 실행 중에 파일을 참조할 수 있습니다.

예를 들어 다음과 같이 .vault_pass 파일에 비밀번호를 입력할 수 있습니다.

  1. echo 'my_vault_password' > .vault_pass

버전 제어를 사용하는 경우 실수로 커밋하지 않도록 암호 파일을 버전 제어 소프트웨어의 무시 파일에 추가해야 합니다.

  1. echo '.vault_pass' >> .gitignore

이제 파일을 대신 참조할 수 있습니다. --vault-password-file 플래그는 명령줄에서 사용할 수 있습니다. 다음을 입력하여 마지막 섹션에서 동일한 작업을 완료할 수 있습니다.

  1. ansible --vault-password-file=.vault_pass -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

이번에는 Vault 암호를 입력하라는 메시지가 표시되지 않습니다.

Output
localhost | SUCCESS => { "changed": false, "checksum": "52d7a243aea83e6b0e478db55a2554a8530358b0", "dest": "/tmp/secret_key", "gid": 80, "group": "root", "mode": "0600", "owner": "root", "path": "/tmp/secret_key", "size": 8, "state": "file", "uid": 0 }

암호 파일을 자동으로 읽기

플래그를 제공하지 않으려면 ANSIBLE_VAULT_PASSWORD_FILE 환경 변수를 비밀번호 파일의 경로로 설정할 수 있습니다.

  1. export ANSIBLE_VAULT_PASSWORD_FILE=./.vault_pass

이제 현재 세션에 대해 --vault-password-file 플래그 없이 명령을 실행할 수 있어야 합니다.

  1. ansible -bK -m copy -a 'src=secret_key dest=/tmp/secret_key mode=0600 owner=root group=root' localhost

세션 전체에서 Ansible이 비밀번호 파일 위치를 인식하도록 하려면 ansible.cfg 파일을 편집할 수 있습니다.

이전에 생성한 로컬 ansible.cfg 파일을 엽니다.

  1. nano ansible.cfg

[defaults] 섹션에서 vault_password_file 설정을 지정합니다. 암호 파일의 위치를 가리킵니다. 사용자에게 가장 유용한 경로에 따라 상대 경로 또는 절대 경로가 될 수 있습니다.

[defaults]
. . .
vault_password_file = ./.vault_pass

이제 암호 해독이 필요한 명령을 실행할 때 볼트 암호를 묻는 메시지가 더 이상 표시되지 않습니다. 보너스로 ansible-vault는 파일의 암호를 사용하여 파일을 해독할 뿐만 아니라 ansible-vault create로 새 파일을 생성할 때 암호를 적용합니다. 및 ansible-vault encrypt.

환경 변수에서 비밀번호 읽기

실수로 암호 파일을 리포지토리에 커밋하는 것에 대해 걱정할 수 있습니다. Ansible에는 비밀번호 파일의 위치를 가리키는 환경 변수가 있지만 비밀번호 자체를 설정하기 위한 환경 변수는 없습니다.

그러나 비밀번호 파일이 실행 가능한 경우 Ansible은 이를 스크립트로 실행하고 결과 출력을 비밀번호로 사용합니다. Brian Schwind는 다음 스크립트를 사용하여 환경 변수에서 암호를 가져올 수 있다고 제안합니다.

편집기에서 .vault_pass 파일을 엽니다.

  1. nano .vault_pass

내용을 다음 스크립트로 바꿉니다.

#!/usr/bin/env python3

import os
print os.environ['VAULT_PASSWORD']

다음을 입력하여 파일을 실행 가능하게 만드십시오.

  1. chmod +x .vault_pass

그런 다음 현재 세션에서 사용할 수 있는 VAULT_PASSWORD 환경 변수를 설정하고 내보낼 수 있습니다.

export VAULT_PASSWORD=my_vault_password

불편하게 들릴 수 있는 각 Ansible 세션 시작 시 이 작업을 수행해야 합니다. 그러나 이렇게 하면 심각한 단점이 있을 수 있는 Vault 암호화 암호를 실수로 커밋하는 것을 효과적으로 방지할 수 있습니다.

일반 변수와 함께 볼트 암호화 변수 사용

Ansible Vault는 임의의 파일과 함께 사용할 수 있지만 중요한 변수를 보호하는 데 가장 자주 사용됩니다. 예제를 통해 일반 변수 파일을 보안과 유용성의 균형을 이루는 구성으로 변환하는 방법을 보여드리겠습니다.

예제 설정

이 예에서는 실제로 데이터베이스를 필수 구성 요소로 설치할 필요 없이 데이터베이스 서버를 구성하는 것처럼 가장합니다.

이전에 hosts 파일을 만들 때 이 단계를 준비하기 위해 database라는 그룹에 localhost 항목을 배치했습니다. 데이터베이스에는 일반적으로 민감한 변수와 민감하지 않은 변수가 혼합되어 있어야 합니다. 이들은 그룹 이름을 딴 파일의 group_vars 디렉토리에 할당할 수 있습니다.

  1. mkdir -p group_vars
  2. nano group_vars/database

group_vars/database 파일 내부에 몇 가지 일반적인 변수를 추가합니다. MySQL 포트 번호와 같은 일부 변수는 비밀이 아니며 자유롭게 공유할 수 있습니다. 데이터베이스 암호와 같은 다른 변수는 기밀입니다.

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: supersecretpassword

Ansible의 debug 모듈과 hostvars 변수를 사용하여 호스트에서 모든 변수를 사용할 수 있는지 테스트할 수 있습니다.

  1. ansible -m debug -a 'var=hostvars[inventory_hostname]' database
Output
localhost | SUCCESS => { "hostvars[inventory_hostname]": { "ansible_check_mode": false, "ansible_version": { "full": "2.2.0.0", "major": 2, "minor": 2, "revision": 0, "string": "2.2.0.0" }, "group_names": [ "database" ], "groups": { "all": [ "localhost" ], "database": [ "localhost" ], "ungrouped": [] }, "inventory_dir": "/home/sammy", "inventory_file": "hosts", "inventory_hostname": "localhost", "inventory_hostname_short": "localhost", "mysql_host": "10.0.0.3", "mysql_password": "supersecretpassword", "mysql_port": 3306, "mysql_user": "fred", "omit": "__omit_place_holder__1c934a5a224ca1d235ff05eb9bda22044a6fb400", "playbook_dir": "." } }

출력은 설정한 모든 변수가 호스트에 적용되었음을 확인합니다. 그러나 group_vars/database 파일은 현재 모든 변수를 보유하고 있습니다. 즉, 데이터베이스 암호 변수로 인해 보안 문제인 암호화되지 않은 상태로 두거나 모든 변수를 암호화하여 사용성 및 공동 작업 문제를 일으킬 수 있습니다.

민감한 변수를 Ansible Vault로 이동

이 문제를 해결하려면 민감한 변수와 민감하지 않은 변수를 구분해야 합니다. 기밀 값을 암호화하는 동시에 중요하지 않은 변수를 쉽게 공유할 수 있어야 합니다. 이를 위해 변수를 두 파일로 분할합니다.

둘 이상의 파일에서 변수를 적용하기 위해 Ansible 변수 파일 대신 변수 디렉토리를 사용할 수 있습니다. 이 기능을 활용하기 위해 구성을 리팩토링할 수 있습니다. 먼저 기존 파일의 이름을 database에서 vars로 바꿉니다. 이것은 암호화되지 않은 변수 파일이 됩니다.

  1. mv group_vars/database group_vars/vars

다음으로 이전 변수 파일과 동일한 이름으로 디렉토리를 생성합니다. vars 파일을 내부로 이동합니다.

  1. mkdir group_vars/database
  2. mv group_vars/vars group_vars/database/

이제 단일 파일 대신 database 그룹에 대한 변수 디렉터리가 있고 암호화되지 않은 단일 변수 파일이 있습니다. 중요한 변수를 암호화할 것이므로 암호화되지 않은 파일에서 해당 변수를 제거해야 합니다. group_vars/database/vars 파일을 편집하여 기밀 데이터를 제거합니다.

  1. nano group_vars/database/vars

이 경우 mysql_password 변수를 제거하려고 합니다. 파일은 이제 다음과 같아야 합니다.

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

다음으로, 암호화되지 않은 vars 파일과 함께 위치하게 될 디렉터리 내에서 볼트로 암호화된 파일을 만듭니다.

  1. ansible-vault create group_vars/database/vault

이 파일에서 vars 파일에 있었던 민감한 변수를 정의합니다. 동일한 변수 이름을 사용하되 앞에 vault_ 문자열을 추가하여 이러한 변수가 볼트 보호 파일에 정의되어 있음을 나타냅니다.

---
vault_mysql_password: supersecretpassword

완료되면 파일을 저장하고 닫습니다.

결과 디렉터리 구조는 다음과 같습니다.

.
├── . . .
├── group_vars/
│   └── database/
│       ├── vars
│       └── vault
└── . . .

이 시점에서 변수는 분리되며 기밀 데이터만 암호화됩니다. 이는 안전하지만 구현이 유용성에 영향을 미쳤습니다. 우리의 목표는 민감한 을 보호하는 것이었지만 실제 변수 이름에 대한 가시성을 본의 아니게 줄였습니다. 둘 이상의 파일을 참조하지 않고 어떤 변수가 할당되는지 명확하지 않으며 공동 작업 중에 기밀 데이터에 대한 액세스를 제한하고 싶지만 여전히 변수 이름을 공유하고 싶을 수 있습니다.

이를 해결하기 위해 Ansible 프로젝트는 일반적으로 약간 다른 접근 방식을 권장합니다.

암호화되지 않은 변수에서 볼트 변수 참조

중요한 데이터를 볼트 보호 파일로 옮길 때 변수 이름 앞에 vault_를 붙였습니다(mysql_passwordvault_mysql_password가 됨). 원래 변수 이름(mysql_password)을 암호화되지 않은 파일에 다시 추가할 수 있습니다. 이를 민감한 값으로 직접 설정하는 대신 Jinja2 템플릿 문을 사용하여 암호화되지 않은 변수 파일 내에서 암호화된 변수 이름을 참조할 수 있습니다. 이렇게 하면 단일 파일을 참조하여 정의된 모든 변수를 볼 수 있지만 기밀 값은 암호화된 파일에 남아 있게 됩니다.

시연하려면 암호화되지 않은 변수 파일을 다시 엽니다.

  1. nano group_vars/database/vars

mysql_password 변수를 다시 추가하십시오. 이번에는 Jinja2 템플릿을 사용하여 볼트 보호 파일에 정의된 변수를 참조합니다.

---
# nonsensitive data
mysql_port: 3306
mysql_host: 10.0.0.3
mysql_user: fred

# sensitive data
mysql_password: "{{ vault_mysql_password }}"

mysql_password 변수는 볼트 파일에 정의된 vault_mysql_password 변수의 값으로 설정됩니다.

이 방법을 사용하면 group_vars/database/vars 파일을 보고 database 그룹의 호스트에 적용될 모든 변수를 이해할 수 있습니다. 민감한 부분은 Jinja2 템플릿에 의해 가려집니다. group_vars/database/vault는 값 자체를 보거나 변경해야 하는 경우에만 열면 됩니다.

지난번과 같은 방법으로 모든 mysql_* 변수가 제대로 적용되었는지 확인할 수 있습니다.

참고: Vault 비밀번호가 비밀번호 파일과 함께 자동으로 적용되지 않는 경우 아래 명령에 --ask-vault-pass 플래그를 추가하세요.

  1. ansible -m debug -a 'var=hostvars[inventory_hostname]' database
Output
localhost | SUCCESS => { "hostvars[inventory_hostname]": { "ansible_check_mode": false, "ansible_version": { "full": "2.2.0.0", "major": 2, "minor": 2, "revision": 0, "string": "2.2.0.0" }, "group_names": [ "database" ], "groups": { "all": [ "localhost" ], "database": [ "localhost" ], "ungrouped": [] }, "inventory_dir": "/home/sammy/vault", "inventory_file": "./hosts", "inventory_hostname": "localhost", "inventory_hostname_short": "localhost", "mysql_host": "10.0.0.3", "mysql_password": "supersecretpassword", "mysql_port": 3306, "mysql_user": "fred", "omit": "__omit_place_holder__6dd15dda7eddafe98b6226226c7298934f666fc8", "playbook_dir": ".", "vault_mysql_password": "supersecretpassword" } }

vault_mysql_passwordmysql_password 모두 액세스할 수 있습니다. 이 복제는 무해하며 이 시스템 사용에 영향을 미치지 않습니다.

결론

프로젝트에는 복잡한 시스템을 성공적으로 설치하고 구성하는 데 필요한 모든 정보가 있어야 합니다. 그러나 일부 구성 데이터는 정의상 민감하며 공개적으로 노출되어서는 안 됩니다. 이 가이드에서는 Ansible Vault가 보안을 손상시키지 않고 모든 구성 데이터를 한 곳에 보관할 수 있도록 기밀 정보를 암호화하는 방법을 설명했습니다.