49/120

Ansible Vault

변수파일에서 패스워드 부분
암호화 처리가 필요

암호화 -> CPU를 많이 사용 -> 필요한 부분만 암호화 -> 재사용 기법 사용


파일, 일부 텍스트를 암호화

  • 파일 수준
    플레이북 전체
    인벤토리 변수 파일
    include/import 작업 파일
  • 텍스트 수준
    변수의 값

Valut Password

관리 노드 접속 -> 키 쌍 인증

[vagrant@controller ~]$ ansible-vault create -h
optional arguments:
	--ask-vault-pass      ask for vault password
    --vault-password-file VAULT_PASSWORD_FILES

#ansible-playbook 에도 볼트와 관련된 옵션들이 존재
[vagrant@controller ~]$ ansible-playbook -h
optional arguments:
  --ask-vault-pass      ask for vault password
   --vault-id VAULT_IDS  the vault identity to use
  --vault-password-file VAULT_PASSWORD_FILES

AES 알고리즘 사용 (대칭키)
키는 나만 가지고 있으면 됨

컨트롤 노드에 플레이북에서 참조하는 파일들이 존재 -> 내 컴퓨터에 저장
실제 실행 시에는 풀어서 실행 -> 암호화된 데이터를 메모리에 올리고 메모리에서 풀기 -> 플레이북 실행
네트워크는 발생하지 않고 내 컴퓨터에서 실행되기 때문에 대칭키를 사용해도 무방

속도 비교 대칭키는 공개키보다 월등히 빠르다 -> 반대로 공개키는 대칭키에 비해 월등히 성능이 느려짐 -> 수학적인 알고리즘 때문에 -> 암호화 복호화 하는 키가 다르기 때문에 비용이 들어서

  • 단일 패스워드 -> A 사용자가 B사용자의 내용 확인 가능 -> 키가 같기 때문에
  • 멀티 패스워드 -> 사용자마다 다른 패스워드

사용법

ansible-vault [SUB-COMMAND] <FILE>

create

암호화할 빈 파일을 생성

[vagrant@controller vault]$ ansible-vault create a.yaml
New Vault password: 
Confirm New Vault password:

[vagrant@controller vault]$ cat a.yaml 
$ANSIBLE_VAULT;1.1;AES256
64656462623230313931313839353863376266353035386337393837323631383163396361316131
6631343335303666393439666464656233316465613063330a353762323230373065633934393065

암호화 되어 있음 -> 직접 수정해서는 안됨

아스키 코드, 유니코드

view

암호화 된 파일을 보기

[vagrant@controller vault]$ ansible-vault view a.yaml 
Vault password: 
- hosts: 192.168.100.11
  tasks:
    - debug:
        msg: hello world

edit

암호화된 파일 수정

[vagrant@controller vault]$ ansible-vault edit a.yaml 
Vault password:

decrypt

암호화된 파일 암호화 해제

[vagrant@controller vault]$ ansible-vault decrypt a.yaml 
Vault password: 
Decryption successful
[vagrant@controller vault]$ cat a.yaml 
- hosts: 192.168.100.11
  tasks:
    - debug:
        msg: hello world

encrypt

기존 파일 암호화

[vagrant@controller vault]$ ansible-vault encrypt a.yaml 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[vagrant@controller vault]$ cat a.yaml 
$ANSIBLE_VAULT;1.1;AES256
39373862393762613234346535356536393436356363373238306466313436393431656538353338
6662643565346432376264353930666664313030393035340a613835663363386137666262336633

rekey

암호화된 파일의 비밀번호 재설정

[vagrant@controller vault]$ ansible-vault rekey a.yaml 
Vault password: 
New Vault password: 
Confirm New Vault password: 
Rekey successful

--vault-password-file VAULT_PASSWORD_FILES

--ask-valult-pass 기본 옵션

  • 비밀번호만 저장된 파일 생성
[vagrant@controller vault]$ echo "P@ssw0rd" > vaultpass
[vagrant@controller vault]$ cat vaultpass 
P@ssw0rd
  • 패스워드 입력 없이 파일안에 패스워드를 이용하여 vault 옵션 실행 가능
$ ansible-vault [SUB-COMMAND} <FILE> --vault-password-file vaultpass
  • rekey에 같은 경우는 기존 파일과 새로 생성할 파일을 옵션으로 같이 지정
$ ansible-vault rekey --help
optional arguments:
	-new-vault-password-file NEW_VAULT_PASSWORD_FILE
                        new vault password file for rekey
$ ansible-vault rekey a.yaml --vault-password-file valutpass --new-vault-passwod-file newvaultpass

ssh 접속을 위해 배스쳔을 두듯이 앤서블 컨트롤러를 공동으로 사용하는 경우
sudo 권한이 가능한 시스템은 다른사람 사용자에게 접근할 수 있음
루트 안주면 좋지만 어쩔수없이 줘야할 때 -> 패스워드파일이 보안상 좋지 않을수도 있음

ansible 설정파일에 암호파일 경로 설정

$ more /etc/ansible/ansible.cfg
---
# If set, configures the path to the Vault password file as an alternative to
# specifying --vault-password-file on the command line.                     
#vault_password_file = /path/to/vault_password_file
---
[vagrant@controller vault]$ vi ansible.cfg
[defaults]
vault_password_file = vaultpass

-vault-password-file vaultpass 옵션 없이 사용가능

안전하고 편하게 vault를 사용하는 방법ansible.cfg

암호파일을 숨김파일 지정후

[defaults]
vault_password_file = ./.vaultpass

.vaultpass

P@ssw0rd

암호파일의 소유자만 사용가능하도록 권한 설정

chmod 600 .vaultpass

암호화된 플레이북 실행

  • 비밀번호를 직접 입력하여 실행
ansible-playbook plaintext.yaml --ask-vault-pass
  • 암호파일을 이용하여 실행
ansible-playbook plaintext.yaml --vault-password-file <File>
  • ansible.cfg에 암호파일 경로를 지정하여 실행-> playbook에도 옵션이 존재하기 때문
[vagrant@controller ~]$ ansible-playbook -h
optional arguments:
  --ask-vault-pass      ask for vault password
   --vault-id VAULT_IDS  the vault identity to use
  --vault-password-file VAULT_PASSWORD_FILES

encrypt_string

특정 값을 암호화 -> 변수를 암호화 하려고 할 때 많이 사용

[vagrant@controller vault]$ ansible-vault encrypt_string
New Vault password: 
Confirm New Vault password: 
Reading plaintext input from stdin. (ctrl-d to end input)
hello world
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          36313965353138363262383633613563646136643263393531343538313439323162643234353862
          6635313861363435343536303535313137396331373833350a396637666334613663663739343166
          34326563336666303330613364653735363963303437366465616464356463383939633461313038
          3633363063383633320a373561646261656162346636336134343631323436663565366437356630
          6262
Encryption successful

원하는 내용 입력후 [ctrl+d] 2번 or [enter][ctrl+d]
!부터의 내용을 전부 복사
test.yaml

- hosts: 192.168.100.11
  vars:
    message: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36313965353138363262383633613563646136643263393531343538313439323162643234353862
          6635313861363435343536303535313137396331373833350a396637666334613663663739343166
          34326563336666303330613364653735363963303437366465616464356463383939633461313038
          3633363063383633320a373561646261656162346636336134343631323436663565366437356630
          6262

  tasks:
    - debug:
        msg: "{{message}}"

변수에 암호화된 내용 붙여넣기

그냥 실행하면 복호화 할수 없다고 뜸

[vagrant@controller vault]$ ansible-playbook test.yaml
TASK [debug] 
fatal: [192.168.100.11]: FAILED! => {"msg": "Attempting to decrypt but no vault secrets found"}

ansible.cfg에 암호파일을 지정해두었다면 상관없지만 파일을 지정하지 않아 위처럼 에러가 난다 -> 암호를 질의하여 실행 -> string 암호화 할때 썻던 비밀번호 입력

[vagrant@controller vault]$ ansible-playbook test.yaml --ask-vault-pass
Vault password:
TASK [debug] 
ok: [192.168.100.11] => {
    "msg": "hello world\n"
}

단일 패스워드 오류

test.yaml

- hosts: 192.168.100.11
  vars:
    var.yaml

  tasks:
    - debug:
        msg: "{{message1}} {{message2}"

var.yaml

message1: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          30373636666531636139656666663036646335646466323863383639616131353538303530353561
          3830373463346233376363313837386137653136326366340a376461633232633636323232316463
          35376137386361616138666235323931376138336232343338396330376639346561343436353732
          6161343565363930650a333832613134386334323764323333356235643139626261333039373236
          3032

message2: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          36646134343530303937666466343065333034323065353238343032353536636230316133633030
          3938653064323162373665373661356665653636343336660a323634616136613661363136623238
          66366334336463663237346530383061363830343732636530356639316161666262663232313064
          6262346632626463390a306435313830316161393331306135656261376132373664643236653166
          3366

두 변수에는 hello, world라는 단어를 각각 다른 패스워드로 암호화하여 저장

실행하게 되면 하나의 패스워드만 입력할 수 있기 때문에 하나는 복호화 하지못하여 결과적으로 실행이 불가 -> 그렇다면?! 멀티패스워드

멀티 패스워드

--vault-id 옵션 사용

--vault-id rable@source
rable을 id로 이해하면 쉬움
id를 사용하여 다른 패스워드를 사용할수 있도록 만들어줌
관련 내용

source

  • prompt : 패스워드를 대화식의 프롬포트로 받음
    --vault-id user1@prompt 패스워드를 프롬포트로 받음 대화 형식
  • file : 파일에서 패스워드를 참조
    --vault-id [email protected]
  • script : 패스워드를 참조할 수 있는 스크립트
    예: 패스워는 MySQL 저장, python 코드로 DB에서 패스워드를 가져올 수 있는
    --vault-id [email protected]
    파이썬 코드를 지정
    가장 안전하긴함 -> 코드를 짜야함

prompt

test.yaml

- hosts: 192.168.100.11
  vars_files:
    - var1.yaml
    - var2.yaml
  tasks:
    - debug:
        msg: "{{ message1 }} {{ message2 }}"
echo "message1: hello" > var1.yaml
echo "message2: world" > var2.yaml

파일을 id와 함께 각각 다른 비밀번호로 설정

ansible-vault encrypt var1.yaml --vault-id user1@prompt
New vault password (user1):
Confirm new vault password (user1): 
Encryption successful
ansible-vault encrypt var2.yaml --vault-id user2@prompt
New vault password (user2): 
Confirm new vault password (user2): 
Encryption successful

--vault-id user1@prompt 옵션을 실행시에도 적용시켜 각각 비밀번호를 묻게하여 복호화

ansible-playbook test.yaml --vault-id user1@prompt --vault-id user2@prompt
[vagrant@controller vault]$ ansible-playbook test.yaml --vault-id user1@prompt --vault-id user2@prompt
Vault password (user1): 
Vault password (user2):
TASK [debug] 
ok: [192.168.100.11] => {
    "msg": "hello world"
}

vault file

test.yaml은 prompt 사용시와 동일

echo "message1: hello" > var1.yaml
echo "message2: world" > var2.yaml

echo "P@ssw0rd1" > user1pass
echo "P@ssw0rd2" > user2pass

# 보안상 권한은 설정하는 것이 좋음
chmod 600 user1pass 
chmod 600 user2pass 

ansible-vault encrypt var1.yaml --vault-id user1@user1pass
ansible-vault encrypt var2.yaml --vault-id user1@user2pass

# file 사용시 source는 파일명으로 지정
ansible-playbook test.yaml --vault-id user1@user1pass --vault-id user1@user2pass

좋은 웹페이지 즐겨찾기