새소식

IaC/Ansible

[A101 Study 3주차] AWS Secret Manager 와 Ansible Vault 활용

  • -

CloudNet@ 팀의 가시다님께서 Leading 하시는 A101 Study 3주차 스터디 내용 정리

 

 

해당 스터디는 '앤서블로 시작하는 인프라 자동화' 책을 기반으로 진행하였습니다.
실습 환경은 'Control Node 1 대 + Target Node 3대' 로 구성하였습니다.

 

 

이번 글에서는 Ansible Vault 사용 시 AWS SecretManager 를 활용하는 방법을 알아보겠습니다.

 

 

 

1. 개요

 

앤서블에서는 민감한 정보를 앤서블 Vault 를 통해 암호화 할 수 있습니다.
그리고 앤서블 Vault 암호화를 위한 암호를 AWS SecretManager 를 활용하여 저장할 수 있습니다.

 

 

1.1. 플레이북 개발

 

이전에 활용했던 Linux 계정 생성 플레이북을 재활용 해보겠습니다.

 

- ansible.cfg

[defaults]
inventory = ./inventory
remote_user = ubuntu
ask_pass = false

[privilege_escalation]
become = true
become_method = sudo
become_user = root
become_ask_pass = false

 

 

- inventory file

tnode1
tnode2
tnode3

 

 

- PlayBook File (create_user.yml)

---

- hosts: all

  # vault로 사용자 계정 관련 변수가 정의된 파일을 임포트하여 사용
  vars_files:
    - vars/secret.yml

  tasks:
  # loop 문을 사용하여 user_info의 userid와 userpw 사용
  - name: Create user
    ansible.builtin.user:
      name: "{{ item.userid }}"
      password: "{{ item.userpw | password_hash('sha512', 'mysecret') }}"
      state: present
      shell: /bin/bash
    loop: "{{ user_info }}"

 

 

- Variable File (vars/secret.yml)

 

해당 파일이 Vault 암호화를 사용하는 파일입니다.
암호는 임의로 'qwe123' 으로 설정하겠습니다.

ansible-vault create vars/secret.yml
New Vault password: qwe123
Confirm New Vault password: qwe123
---

user_info:
  - userid: "ansible"
    userpw: "ansiblePw1"
  - userid: "stack"
    userpw: "stackPw1"

 

 

 

1.2. 플레이북 실행

 

앤서블 Vault 를 통해 암호화한 파일이 포함된 플레이북을 실행하려면 아래와 같은 명령어를 입력합니다.
그러면 암호를 입력하는 과정이 표시됩니다.

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

Vault password:

 

 

 

 

1.3. AWS SecretManager 와 Vault 연동

 

암호를 잊어버리거나 서버 내부에 저장될 경우 보안 위험이 발생할 수 있습니다.
AWS SecretManager 와 같은 외부 저장소에 암호를 저장하고 이를 사용하는 방법에 대해서 알아보겠습니다.

 

우선 AWS SecretManager 에 저장할 암호 파일을 생성해줍니다. (AWS 콘솔에서 작업해도 무방합니다.)
해당 파일은 SecretManager 에 암호 저장 후 삭제합니다.

 

vault-password.json 파일 생성 후 데이터 입력

 

{
  "ansible_vault_password": "qwe123"
}

 

 

AWS CLI 를 사용하여 secret 생성

 

aws secretsmanager create-secret --name ansible/password \
  --region ap-northeast-2 \
  --description "Secrets for ansible-vault descryption" \
  --secret-string file://vault-password.json

 

 

 

AWS SecretManger 의 암호를 가져오는 스크립트 파일 생성

 

- get-vault-password.sh

#!/bin/sh
aws secretsmanager get-secret-value \
  --region ap-northeast-2 \
  --secret-id ansible/password | jq -r .SecretString | jq -r .ansible_vault_password
# 스크립트에 실행권한 부여
chmod +x get-vault-password.sh

 

 

 

1.4. 앤서블 플레이북 실행 ( with SecretManager )

 

ansible-playbook create_user.yml --vault-password-file ./get-vault-password.sh

 

 


 

이 방법을 사용하면 Secret Manger 에 저장된 암호를 사용해서 Ansible Vault 의 암/복호화가 가능합니다.

스크립트 파일 자체를 사용하지 않고 Secret Manager 에서 암호를 가져올 수 있는 방법이 있는 지 확인이 필요한데,

아마 앤서블의 aws 컬렉션을 사용하면 가능할 듯 싶습니다.

 

참고 문서

 

  • Ansible Vault

https://malwareanalysis.tistory.com/692

 

  • Look up secrets stored in AWS Secrets Manager

https://docs.ansible.com/ansible/latest/collections/amazon/aws/secretsmanager_secret_lookup.html#ansible-collections-amazon-aws-secretsmanager-secret-lookup

 

 

Contents

포스팅 주소를 복사했습니다