암호화된 변수와 파일 사용하기
암호화된 변수와 파일 사용하기 (Using encrypted variables and files)
암호화된 변수나 파일을 사용하는 작업·플레이북을 실행할 때는 그 변수·파일을 복호화할 비밀번호를 반드시 제공해야 해요. 커맨드 라인에서 제공하거나, 설정 옵션이나 환경 변수로 기본 비밀번호 소스를 지정할 수도 있어요.
출처: 문서
본문
단일 비밀번호 전달하기
작업·플레이북의 모든 암호화 변수·파일이 단일 비밀번호를 써야 한다면 --ask-vault-pass나 --vault-password-file CLI 옵션을 쓸 수 있어요.
비밀번호를 프롬프트로 입력받으려면:
ansible-playbook --ask-vault-pass site.yml
/path/to/my/vault-password-file 파일에서 비밀번호를 가져오려면:
ansible-playbook --vault-password-file /path/to/my/vault-password-file site.yml
vault 비밀번호 클라이언트 스크립트 my-vault-password-client.py에서 비밀번호를 가져오려면:
ansible-playbook --vault-password-file my-vault-password-client.py
vault ID 전달하기
--vault-id 옵션을 사용해 vault 라벨과 함께 단일 비밀번호를 전달할 수도 있어요. 단일 인벤토리 안에서 여러 vault를 사용할 때 이 방식이 더 명확해요.
dev vault ID의 비밀번호를 프롬프트로 입력받으려면:
ansible-playbook --vault-id dev@prompt site.yml
dev-password 파일에서 dev vault ID의 비밀번호를 가져오려면:
ansible-playbook --vault-id dev@dev-password site.yml
vault 비밀번호 클라이언트 스크립트 my-vault-password-client.py에서 dev vault ID의 비밀번호를 가져오려면:
ansible-playbook --vault-id [email protected]
여러 vault 비밀번호 전달하기
작업·플레이북이 서로 다른 vault ID로 암호화한 여러 암호화 변수·파일을 요구한다면 --vault-id를 사용해야 해요. 비밀번호의 소스(prompt, file, script)와 함께 vault ID(dev, prod, cloud, db)를 지정하는 --vault-id 옵션을 여러 번 전달해요. 예를 들어 파일에서 읽은 dev 비밀번호를 사용하고 prod 비밀번호를 프롬프트로 입력받으려면:
ansible-playbook --vault-id dev@dev-password --vault-id prod@prompt site.yml
기본적으로 vault ID 라벨(dev, prod 등)은 힌트일 뿐이에요. Ansible은 각 비밀번호로 vault 콘텐츠 복호화를 시도해요. 암호화 데이터와 같은 라벨을 가진 비밀번호가 먼저 시도되고, 그 다음에는 커맨드 라인에 지정된 순서대로 각 vault 시크릿이 시도돼요.
암호화 데이터에 라벨이 없거나, 라벨이 제공된 어떤 라벨과도 일치하지 않으면 비밀번호는 지정된 순서대로 시도돼요. 위 예제에서 Ansible이 어떤 vault ID로 암호화됐는지 모르는 경우에는 dev 비밀번호가 먼저, 그다음 prod 비밀번호가 시도돼요.
vault ID 없이 --vault-id 사용하기
--vault-id 옵션은 vault-id를 지정하지 않고도 사용할 수 있어요. 이 동작은 --ask-vault-pass나 --vault-password-file과 동일해서 거의 쓰지 않아요.
예를 들어 비밀번호 파일 dev-password를 사용하려면:
ansible-playbook --vault-id dev-password site.yml
비밀번호를 프롬프트로 입력받으려면:
ansible-playbook --vault-id @prompt site.yml
실행 가능한 스크립트 my-vault-password-client.py에서 비밀번호를 가져오려면:
ansible-playbook --vault-id my-vault-password-client.py
암호화 콘텐츠 사용을 위한 기본값 설정
기본 vault ID 설정하기
어떤 vault ID를 다른 것보다 자주 사용한다면 DEFAULT_VAULT_IDENTITY_LIST 설정 옵션으로 기본 vault ID와 비밀번호 소스를 지정할 수 있어요. --vault-id를 지정하지 않을 때마다 Ansible은 기본 vault ID와 소스를 사용해요. 이 옵션에 여러 값을 설정할 수 있고, 여러 값을 설정하는 것은 여러 --vault-id CLI 옵션을 전달하는 것과 동일해요.
기본 비밀번호 소스 설정하기
커맨드 라인에 비밀번호 파일을 제공하고 싶지 않거나, 어떤 vault 비밀번호 파일을 다른 것보다 자주 사용한다면 DEFAULT_VAULT_PASSWORD_FILE 설정 옵션이나 ANSIBLE_VAULT_PASSWORD_FILE 환경 변수로 기본 파일을 지정할 수 있어요. 예를 들어 ANSIBLE_VAULT_PASSWORD_FILE=~/.vault_pass.txt로 설정하면 Ansible이 자동으로 그 파일에서 비밀번호를 찾아요. Jenkins 같은 지속적 통합 시스템에서 Ansible을 쓸 때 특히 유용해요. 참조하는 파일은 비밀번호를 담은 파일(평문)이거나, 비밀번호를 반환하는 스크립트(실행 권한 설정)일 수 있어요.
암호화된 파일은 언제 보이게 되나요?
일반적으로 Ansible Vault로 암호화한 콘텐츠는 실행 후에도 암호화된 채로 남아요. 다만 예외가 하나 있어요. 암호화된 파일을 copy, template, unarchive, script 또는 assemble 모듈의 src 인자로 전달하면, 해당 파일은 대상 호스트에서 암호화되지 않아요(플레이를 실행할 때 올바른 vault 비밀번호를 제공한다는 전제하에요). 이 동작은 의도된 것이고 유용해요. 설정 세부 정보를 공유하지 않으려고 설정 파일이나 템플릿을 암호화할 수 있지만, 그 설정을 환경의 서버로 복사할 때는 로컬 사용자와 프로세스가 접근할 수 있도록 복호화되길 원하니까요.
Ansible Vault로 암호화된 파일의 형식
Ansible Vault는 UTF-8 인코딩 txt 파일을 만들어요. 파일 형식은 줄바꿈으로 끝나는 헤더를 포함해요. 예를 들어:
$ANSIBLE_VAULT;1.1;AES256
또는
$ANSIBLE_VAULT;1.2;AES256;vault-id-label
헤더는 세미콜론(;)으로 구분된 최대 네 가지 요소를 담아요.
- 형식 ID (
$ANSIBLE_VAULT) — 현재$ANSIBLE_VAULT만 유효한 형식 ID예요. 이 형식 ID는 Ansible Vault로 암호화된 콘텐츠를 식별해 줘요(vault.is_encrypted_file()). - vault 형식 버전 (
1.X) — 지원되는 모든 Ansible 버전은 현재, 라벨이 있는 vault ID가 제공되면1.1또는1.2를 기본값으로 사용해요.1.0형식은 읽기 전용으로 지원되고, 쓰기 시 자동으로1.1형식으로 변환돼요. 형식 버전은 현재 정확한 문자열 비교로만 사용돼요(버전 번호는 현재 '비교'되지 않아요). - 데이터 암호화에 사용한 암호 알고리즘 (
AES256) — 현재 AES256만 유일한 지원 암호 알고리즘이에요. Vault 형식 1.0은AES를 사용했지만, 현재 코드는 항상AES256을 사용해요. - 데이터 암호화에 사용한 vault ID 라벨 (선택,
vault-id-label) — 예를 들어--vault-id dev@prompt로 파일을 암호화하면 vault-id-label은dev예요.
참고: 미래에는 헤더가 바뀔 수 있어요. 형식 ID와 형식 버전 뒤의 필드는 형식 버전에 따라 달라져요. 미래의 vault 형식 버전은 더 많은 암호 알고리즘 옵션 및/또는 추가 필드를 추가할 수 있어요.
파일의 나머지 콘텐츠는 'vaulttext'예요. vaulttext는 암호화된 ciphertext의 텍스트 아머(text-armored) 버전이에요. 각 줄은 80자 너비이며, 마지막 줄만 더 짧을 수 있어요.
Ansible Vault payload 형식 1.1 - 1.2
vaulttext는 ciphertext와 SHA256 다이제스트를 이어붙인 결과를 'hexlify'한 것이에요. 'hexlify'는 Python 표준 라이브러리 binascii 모듈의 hexlify() 메서드를 가리켜요.
hexlify()된 결과에는 다음이 포함돼요:
hexlify()된 salt 문자열 + 줄바꿈(0x0a)hexlify()된 암호화 HMAC 문자열 + 줄바꿈. HMAC은:- RFC2104 스타일 HMAC
- 입력은: AES256 암호화된 ciphertext, PBKDF2 키
- PBKDF2 키는 salt에서 생성되며, cipher key와 cipher IV도 함께 생성돼요:
- salt, 바이트 단위
- 10000회 반복
- SHA256() 알고리즘
- 처음 32바이트는 cipher key
- 다음 32바이트는 HMAC key
- 나머지 16바이트는 cipher IV
hexlify()된 ciphertext 문자열. ciphertext는:- AES256 암호화 데이터. 데이터는 다음으로 암호화돼요:
- AES-CTR 스트림 암호
- cipher key
- IV
- 정수 IV에서 시드된 128비트 카운터 블록
- plaintext (원래 평문)
- AES256 블록 크기까지 패딩 (패딩에 사용한 데이터는 RFC5652 기반)
- AES256 암호화 데이터. 데이터는 다음으로 암호화돼요:
더 알아보기 (Learn more)
- 비밀번호는
--ask-vault-pass,--vault-password-file,--vault-id중 원하는 방식으로 전달할 수 있어요. 여러 vault는--vault-id를 여러 번 쓰면 돼요. - 기본 vault ID와 기본 비밀번호 소스는 설정 옵션이나 환경 변수로 지정해 커맨드 라인을 단순하게 할 수 있어요.
copy,template등 모듈의src로 전달한 암호화 파일은 대상에서 복호화된다는 점을 기억하세요.