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 컬렉션을 사용하면 가능할 듯 싶습니다.
참고 문서
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