Ansible Vault를 효과적으로 사용하여 구성 비밀을 보호하는 가이드

Vault 명령어, 암호화된 변수 파일, 비밀번호 처리 및 실용적인 플레이북 사용법을 통해 Ansible 비밀을 안전하게 보호하세요.

Ansible Vault를 효과적으로 사용하여 구성 비밀을 보호하는 가이드

Ansible Vault는 일반 Ansible 변수를 사용하면서 구성 비밀이 일반 텍스트로 노출되지 않도록 보호합니다. 플레이북에 데이터베이스 비밀번호, API 키 또는 개인 키가 포함된 경우, 암호화되지 않은 상태로 커밋하면 일상적인 저장소 유출이 인프라 사고로 이어질 수 있습니다.

Ansible Vault는 구조화된 변수 파일이나 개별 값을 암호화하고, Ansible이 볼트 비밀번호를 가지고 있을 때만 복호화합니다. 이 가이드는 실제로 사용할 명령어, 플레이북에서 볼트 변수를 로드하는 방법, 그리고 팀이 주로 실수하는 부분을 보여줍니다.

Ansible Vault 핵심 개념 이해하기

Ansible Vault는 강력한 대칭 암호화(AES256)를 사용하여 데이터를 보호합니다. 핵심 메커니즘은 마스터 키 역할을 하는 Vault 비밀번호가 필요합니다. 이 비밀번호는 암호화된 콘텐츠에 접근하거나 수정해야 할 때마다 Ansible에 제공되어야 합니다.

Ansible Vault를 사용하는 이유

  • 보안: 민감한 데이터를 저장 시 암호화하여 저장소 침해로부터 보호합니다.
  • 규정 준수: 자격 증명 암호화를 요구하는 업계 표준(예: PCI DSS, SOC 2)을 충족하는 데 도움이 됩니다.
  • 워크플로: 비밀이 포함된 구성 파일을 버전 관리 시스템(예: Git)에 안전하게 커밋할 수 있습니다.

필수 Ansible Vault 명령어

ansible-vault 명령어는 플레이북 실행 외부에서 암호화된 파일을 관리하기 위한 독립 실행형 유틸리티입니다.

1. 새 볼트 파일 생성하기

비밀 전용 새 파일을 생성하려면 create 명령어를 사용합니다. 즉시 새 볼트 비밀번호를 입력하라는 메시지가 표시되고 기본 텍스트 편집기($EDITOR)에서 파일이 열립니다.

ansible-vault create secrets/db_passwords.yml

예시 내용 (db_passwords.yml 저장 후):

# 이 파일은 암호화되어 있습니다
db_user: app_admin
db_pass: HighlySecurePassword123!
api_key: abc-123-def-456

편집기를 저장하고 닫으면 콘텐츠가 암호화되며 파일을 버전 관리에 커밋할 준비가 됩니다.

2. 암호화된 콘텐츠 보기

볼트 파일의 내용을 편집하지 않고 빠르게 확인해야 하는 경우 view 명령어를 사용합니다. 볼트 비밀번호를 입력하라는 메시지가 표시됩니다.

ansible-vault view secrets/db_passwords.yml

3. 기존 볼트 파일 편집하기

edit 명령어는 비밀을 수정하는 기본 방법입니다. Ansible이 파일을 복호화하고 편집기에서 열며, 저장 시 자동으로 다시 암호화합니다.

ansible-vault edit secrets/db_passwords.yml

팁: 원활한 편집 환경을 위해 $EDITOR 환경 변수가 올바르게 설정되어 있는지 확인하세요(예: export EDITOR=vim).

4. 기존 파일 암호화 및 복호화

보안이 필요한 기존 일반 텍스트 파일이 있는 경우 encrypt 명령어를 사용합니다. 반대로 decrypt는 암호화된 파일을 일반 텍스트로 되돌리는 데 사용됩니다(주의해서 사용하며, 일반적으로 마이그레이션용).

# 기존 파일 암호화
ansible-vault encrypt plain_vars.yml

# 기존 볼트 파일 복호화 (위험! 필요한 경우에만 사용)
ansible-vault decrypt secured_vars.yml

5. 볼트 비밀번호 변경 (Rekey)

볼트 파일의 마스터 비밀번호를 업데이트하려면 rekey 명령어를 사용합니다. 현재 비밀번호를 입력한 다음 새 비밀번호를 설정해야 합니다.

ansible-vault rekey secrets/db_passwords.yml

이는 보안 순환이나 새 자격 증명 관리 시스템으로 전환할 때 필수적입니다.

Ansible 플레이북에 볼트 비밀 통합하기

파일이 암호화되면 플레이북 실행 중에 이를 로드하고 필요한 볼트 비밀번호를 제공하는 방법이 필요합니다.

암호화된 변수 로드하기

암호화된 변수 파일은 일반적으로 플레이북에서 vars_files 지시문을 사용하여 다른 변수 파일과 동일하게 로드됩니다.

플레이북 예시 (site.yml):

---
- name: 데이터베이스 비밀이 필요한 애플리케이션 배포
  hosts: webservers
  vars_files:
    - secrets/db_passwords.yml  # Ansible이 자동으로 볼트 파일임을 감지합니다

  tasks:
    - name: 데이터베이스 사용자 구성 확인
      ansible.builtin.template:
        src: config.j2
        dest: /etc/app/config.conf
        mode: '0600'
      # {{ db_user }} 및 {{ db_pass }} 같은 변수를 사용할 수 있습니다

실행 중 볼트 비밀번호 제공하기

Ansible은 기록이나 스크립트에 비밀번호를 노출하지 않고 볼트 비밀번호를 안전하게 제공하는 여러 방법을 제공합니다.

방법 1: 대화형 프롬프트

가장 간단한 방법은 --ask-vault-pass 플래그를 사용하여 런타임에 사용자에게 비밀번호를 안전하게 입력하도록 요청하는 것입니다.

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

방법 2: 비밀번호 파일 사용

자동화, CI/CD 파이프라인 또는 대화형 프롬프트가 바람직하지 않은 환경의 경우 일반 텍스트 비밀번호 파일(주 저장소 외부에 저장되고 제한된 파일 권한으로 보호됨)을 사용할 수 있습니다.

# 참고: 비밀번호 파일에는 볼트 비밀번호 텍스트만 포함되어야 합니다.
ansible-playbook site.yml --vault-password-file ~/.ansible/vault_key.txt

방법 3: 단일 변수 암호화 (encrypt_string)

전체 YAML 파일 대신 단일 작은 변수(예: inventory 파일 내)만 암호화해야 하는 경우 ansible-vault encrypt_string을 사용합니다.

# 'echo' 또는 'printf'를 사용하여 비밀을 직접 전달합니다
ansible-vault encrypt_string 'MySuperSecretAPIKey' --name 'prod_api_key'

이 명령어는 인벤토리 또는 변수 파일에 직접 붙여넣을 수 있는 암호화된 문자열을 출력합니다:

prod_api_key: !vault |
  $ANSIBLE_VAULT;1.1;AES256
  37666236613364656165386638323438646132646337326462613134373463353434613861313361
  ... (나머지 암호화된 데이터)

엔터프라이즈 볼트 관리를 위한 모범 사례

효과적인 비밀 관리는 단순히 파일을 암호화하는 것 이상입니다. 이러한 모범 사례를 채택하면 보안과 유지 관리성이 보장됩니다:

1. 전용 볼트 비밀번호 파일

자동화된 환경에서는 항상 --vault-password-file 방법을 사용하세요. 비밀번호가 포함된 파일은 매우 제한적인 권한(chmod 400)을 가져야 하며 Git에 절대 커밋되지 않아야 합니다.

2. 환경 분리

개발, 스테이징, 프로덕션 등 서로 다른 환경에 대해 별도의 볼트 파일을 사용하세요. 이렇게 하면 낮은 위험 환경이 높은 위험의 프로덕션 자격 증명에 접근하는 것을 방지할 수 있습니다.

  • vars/prod_vault.yml
  • vars/stage_vault.yml

인벤토리 그룹이나 플레이북의 조건부 로직을 사용하여 이러한 파일을 조건부로 로드하세요.

3. 볼트가 충분하지 않을 때 외부 비밀 저장소 사용

대규모 환경의 경우 HashiCorp Vault, AWS Secrets Manager 또는 클라우드 네이티브 키 관리와 같은 외부 비밀 저장소를 고려하세요. Ansible 조회 플러그인은 런타임에 해당 값을 가져올 수 있으며, Ansible Vault는 소규모 비밀, 부트스트랩 값 또는 전용 비밀 플랫폼이 아직 없는 팀에 유용합니다.

4. 그룹 변수 대 플레이북 변수

볼트 변수는 일반 변수 파일 이름을 사용하여 group_vars 또는 host_vars 아래에 저장하는 것이 더 깔끔한 경우가 많습니다. Ansible은 파일이 로드될 때 볼트 콘텐츠를 복호화합니다. 확장자는 규칙일 뿐 복호화를 트리거하는 기능이 아닙니다.

# 구조 예시
inventory/
├── hosts
└── group_vars/
    └── webservers/
        └── vault.yml

Vault를 실용적으로 유지하기

플레이북이 이미 로드하는 비밀을 암호화하는 것부터 시작한 다음, 팀이 볼트 비밀번호를 제공하는 방법을 표준화하세요. 볼트 비밀번호를 Git 외부에 보관하고, 프로덕션 비밀을 하위 환경과 분리하며, 접근 권한이 변경될 때 ansible-vault rekey로 비밀번호를 순환하세요.