49/120

김건호·2022년 4월 20일
0

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 user@.vaultpass
  • script : 패스워드를 참조할 수 있는 스크립트
    예: 패스워는 MySQL 저장, python 코드로 DB에서 패스워드를 가져올 수 있는
    --vault-id user3@getpass.py
    파이썬 코드를 지정
    가장 안전하긴함 -> 코드를 짜야함

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

안전하고 편하게 vault 멀티 패스워드를 사용하는 방법

ansible.cfg

[defaults]
vault_identity_list = user1@user1pass, user2@user2pass

복호화

ansible-vault view var2.yaml
ansible-playbook test.yaml

암호화

ansible-vault create var3.yaml --encrypt-vault-id user1
absible-vault encrypt var3.yaml --encrypt-vault-id user1

AWX

Ansible 위에 구축된 웹 기반의 인터페이스
목적: 실행 / 모니터링
AWX : RedHat Ansible Tower 제품 Upstream(뭐를 가지고 만드느냐)

  • CentOS --up --> RHEL --up --> Fedora ( ~ Centos7)
    레드햇은 페도라 리눅스를 만들고 안정화된 패키지구조로 안전버전안 rhel를 만듬 rhel로 centos를 만듬
    국내에서 많이 사용하는 이유는 rhel과 레드햇 같음 -> 안정성이 보장되어있음
  • RHEL --> CentOS Stream --> Fedora (Cento0s8 ~ )
  • Ansible Tower --> AWX
  • Ubuntu --> Debian

AnsibleWorks -> AWX

AWX 설치

AWX의 소스파일

Docker 설치

https://docs.docker.com/engine/install/centos/

레포지토리 설치를 위한 yum-utils 패키지 설치

$ sudo yum install -y yum-utils

레포지토리 다운로드

$ sudo yum-config-manager \
    --add-repo \
    https://download.docker.com/linux/centos/docker-ce.repo

$ ls /etc/yum.repos.d/
...    docker-ce.repo

Docker Engine과 containerd 설치

$ sudo yum install -y docker-ce docker-ce-cli containerd.io

docker 서비스 시작 및 부팅 시 자동 실행 설정

$ sudo systemctl enable --now docker

docker 설치확인

$ docker --version
Docker version 20.10.14, build a224086

Docker-Compose 설치

docker는 python3 필요

$ sudo yum install -y python3 python3-pip

python은 의존성이 좋지 않아, 관련 패키지 따로 설치

$ sudo pip3 install -U -I pip wheel setuptools
$ sudo pip3 install docker-compose

설치 확인

$ docker-compose --version

AWX 설치

AWX 코드를 github에서 다운 받아야 하기 때문에 git 패키지 설치

$ sudo yum -y install git

홈 디렉토리에서 awx 코드 받아오기

$ cd ~
$ git clone --branch 17.1.0 --single-branch https://github.com/ansible/awx.git

설치를 위해 installer로 이동

$ cd ~/awx/installer
$ ls
build.yml  install.yml  inventory  roles

install.yml 앤서블에 의해 실행

인벤토리 변수 변경

inventory 파일
# 라인 호스트네임을 뭐라고 할것인지
63 awx_task_hostname=awx
64 awx_web_hostname=awxweb
# 포스트 그래스 데이터가 저장되는 위치 == mysql var/lib/mysql
66 postgres_data_dir="~/.awx/pgdocker"
# 67 awx웹 인터페이스니까 포트 
67 host_port=80
68 host_port_ssl=443
# 웹 인터페이스에 로그인할 사용자
107 admin_user=admin
108 admin_password=password

108번 라인과 141번 라인의 주석을 해제
~/awx/installer/inventory

108 admin_password=password
141 project_data_dir=/var/lib/awx/projects

selinux를 파이썬이 관리하는 패키지 설치

sudo yum -y install libselinux-python3

현재 bash 셸 사용중인데 docker는 bourne shell에 있어 링크 걸기

sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

AWX 설치 실행

ansible-playbook -i inventory install.yml -b

컨테이너 확인

sudo docker ps
CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                                   NAMES
1ea4d852e694   ansible/awx:17.1.0   "/usr/bin/tini -- /u…"   11 minutes ago   Up 11 minutes   8052/tcp                                awx_task
9c527c75a323   ansible/awx:17.1.0   "/usr/bin/tini -- /b…"   20 minutes ago   Up 11 minutes   0.0.0.0:80->8052/tcp, :::80->8052/tcp   awx_web
f6775cad37ab   redis                "docker-entrypoint.s…"   20 minutes ago   Up 11 minutes   6379/tcp                                awx_redis
16d33e864106   postgres:12          "docker-entrypoint.s…"   20 minutes ago   Up 11 minutes   5432/tcp                                awx_postgres

웹브라우저 접속

http://192.168.100.10


inventory 107, 108번 라인에서 설정한 값으로 로그인

AWX 리소스 생성

  • Projects: 플레이북을 가지는 리소스
    - /var/lib/awx/projects
  • Inventories: 관리 노드/인벤토리 그룹을 가지는 리소스
  • Credentials: SSH, Sudo, Vault 등 자격증명 정보를 가지는 리소스
  • Templates: 프로젝트, 인벤토리, 자격증명을 가지는 리소스

플레이북 준비

sudo mkdir /var/lib/awx/projects/test-awx
sudo vi /var/lib/awx/projects/test-awx/debug.yaml
- hosts: all
  tasks:
    - debug:
        msg: Hello AWX World
[test-awx-group]
192.168.100.11

프로젝트 생성

Resouces -> Projects -> Add

  • Name: test-awx-project
  • Source Control Credentials Type: manual
  • Playbook Directory: test-awx
  • Save

인벤토리 생성

Resources -> Inventories -> Add -> Add Inventory

  • Create new inventory
    - Name: test-awx-inventory
    - Save

  • Details -> Groups 탭 -> Add
    - Name: test-awx-group
    - 'Save'

  • Group details -> Hosts 탭 -> Add -> Add new host
    - Name: 192.168.100.11
    - Save

자격증명 생성

Resources -> Credentials -> Add

  • Name: test-awx-credentials
  • Credential Type: Machine
  • Username: vagrant
  • SSH Private Key
    - controller 시스템의 vagrant 사용자의 홈디렉토리에서 ~/.ssh/id_rsa 파일 내용 복사
  • Privilege Escalation Method: sudo
  • Privilege Escalation Username: root
  • Save

템플릿 생성

Resources -> Templates -> Add -> Add job template

  • Name: test-awx-template
  • Inventory: test-awx-inventory
  • Project: test-awx-project
  • Playbook: debug.yaml
  • Credentials: test-awx-credentials
  • Save

작업 실행

Resources -> Templates -> test-awx-template -> 로켓 버튼

profile
Ken, 🔽🔽 거노밥 유튜브(house icon) 🔽🔽

0개의 댓글