LabHub
배우기 러닝패스 코스

Ansible in Practice

Putting Encrypted Secrets in the Repository

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

시크릿을 저장소 안에 두되 평문으로 두지 않고, 실행 시점에만 복호화해 쓰는 흐름을 손에 익힙니다.

왜 중요한가

시크릿 관리의 기준은 "암호화되는가"가 아니라 "노출 경로가 몇 개인가, 폐기와 교체가 몇 분 걸리는가" 입니다. 시크릿이 코드와 같은 저장소에 있으면 개수를 셀 수 있고 리뷰를 거치므로 그 두 질문에 답할 수 있게 됩니다. 반대로 .env 파일과 채팅과 위키에 흩어져 있으면 폐기 자체가 불가능해집니다. 실습에서 특히 신경 쓸 것은 두 가지입니다. 비밀번호 파일은 저장소 밖 또는 .gitignore 안에 두고 권한을 600 으로 하는 것, 그리고 시크릿을 다루는 태스크에 no_log 를 붙이는 것입니다. 애써 암호화하고 실행 로그에 평문으로 찍으면 아무 의미가 없습니다.

단계

  1. /root/ans/vault/.vault_pass 를 8바이트 이상으로 만들고 권한을 600 으로 두세요. /root/ans/vault/.gitignore.vault_pass 를 넣으세요.
  2. /opt/lab/fixtures/ansible/vault-secrets.plain.yml/root/ans/vault/vars/secrets.yml 로 복사해 암호화하세요. 첫 줄이 볼트 헤더여야 하고 평문 비밀번호가 보이면 안 됩니다.
  3. /root/ans/vault/vars/inline.yml 을 만들어 registry_token 키의 값만 암호화해 넣으세요. 값은 ghp_ 로 시작하는 아무 문자열이면 됩니다. 파일 자체는 평문이어야 합니다.
  4. /root/ans/vault/site.yml 에서 암호화 변수를 읽어 /root/ans/vault/artifacts/app.env 를 만드세요. 내용에 DB_PASSWORD=labhub-Pr0d-2026 이 있고 권한은 600 입니다.
  5. 시크릿을 다루는 태스크에 no_log 를 붙이고, 실행 로그를 /root/ans/vault/out/run.txt 로 저장하세요. 로그에 비밀번호가 남으면 안 됩니다.
  6. /root/ans/vault/.vault_pass_new 를 만들고 secrets.yml 을 rekey 하세요. 새 비밀번호로는 열리고 옛 비밀번호로는 열리지 않아야 합니다.
  7. /root/ans/vault/.vault_pass_prod 를 만들고 /root/ans/vault/vars/prod.ymlprod 라벨의 vault-id 로 암호화하세요. 헤더가 $ANSIBLE_VAULT;1.2;AES256;prod 여야 합니다.
  8. /root/ans/vault/out/audit.json 을 만드세요. encrypted_files(암호화된 파일 경로 3개 이상), plaintext_leaks(0개), verdict("clean") 세 키를 담습니다.

참고

비밀번호 파일 만들고 잠그기

/root/ans/vault/.vault_pass 를 8바이트 이상으로 만들고 권한을 600 으로 두세요. /root/ans/vault/.gitignore.vault_pass 를 넣으세요.

8자 이상으로 만들고 권한을 600 으로 두세요. 그리고 이 파일은 절대 커밋되면 안 됩니다.

변수 파일 통째로 암호화하기

/opt/lab/fixtures/ansible/vault-secrets.plain.yml/root/ans/vault/vars/secrets.yml 로 복사해 암호화하세요. 첫 줄이 볼트 헤더여야 하고 평문 비밀번호가 보이면 안 됩니다.

픽스처의 평문 파일을 복사한 뒤 encrypt 합니다. 첫 줄이 볼트 헤더로 바뀌어야 합니다.

값 하나만 인라인으로 암호화하기

/root/ans/vault/vars/inline.yml 을 만들어 registry_token 키의 값만 암호화해 넣으세요. 값은 ghp_ 로 시작하는 아무 문자열이면 됩니다. 파일 자체는 평문이어야 합니다.

encrypt_string 의 출력을 YAML 파일에 붙여 넣습니다. 파일 자체는 평문이고 값만 암호문입니다.

플레이북에서 복호화된 값 쓰기

/root/ans/vault/site.yml 에서 암호화 변수를 읽어 /root/ans/vault/artifacts/app.env 를 만드세요. 내용에 DB_PASSWORD=labhub-Pr0d-2026 이 있고 권한은 600 입니다.

vars_files 로 암호화 파일을 읽고 --vault-password-file 로 실행합니다. 결과 파일 권한은 600 입니다.

로그에 시크릿이 남지 않게 하기

시크릿을 다루는 태스크에 no_log 를 붙이고, 실행 로그를 /root/ans/vault/out/run.txt 로 저장하세요. 로그에 비밀번호가 남으면 안 됩니다.

시크릿을 다루는 태스크에 no_log 를 붙이고, 실행 로그에 값이 없는지 직접 확인하세요.

비밀번호 교체하기

/root/ans/vault/.vault_pass_new 를 만들고 secrets.yml 을 rekey 하세요. 새 비밀번호로는 열리고 옛 비밀번호로는 열리지 않아야 합니다.

rekey 후에는 옛 비밀번호로 열리면 안 됩니다. 새 비밀번호 파일을 따로 만드세요.

vault-id 라벨로 키 구분하기

/root/ans/vault/.vault_pass_prod 를 만들고 /root/ans/vault/vars/prod.ymlprod 라벨의 vault-id 로 암호화하세요. 헤더가 $ANSIBLE_VAULT;1.2;AES256;prod 여야 합니다.

--vault-id 라벨@파일 형태입니다. 라벨을 쓰면 헤더의 버전이 1.2 가 되고 라벨이 박힙니다.

저장소 시크릿 감사 보고서 만들기

/root/ans/vault/out/audit.json 을 만드세요. encrypted_files(암호화된 파일 경로 3개 이상), plaintext_leaks(0개), verdict("clean") 세 키를 담습니다.

암호화된 파일 목록과 평문 유출 목록을 JSON 으로 정리합니다. 유출이 0 이어야 합니다.