- Ansible Vault는 패스워드, 키와 같은 보안에 민감한 파일들을 encryption / decryption 해주는 기능을 가짐(암호화)
- Ansible-Vault는 변수와 파일을 암호화하여 플레이북이나 role에서 비밀번호. 키와 같은 민감한 콘텐츠를 보호 가능
- Ansible을 이용할 때 해킹이나, 유출로 인해 서버 정보가 외부로 나갈 수 있음
- Ansible Vault를 통해 민감한 정보를 평문이 아니라 암호화된 파일로 관리하면 해킹당해도 문제 X
- SSH 개인 및 공개 키, 암호 및 SSL 인증서도 암호화된 파일로 관리하여 권한 없는 사람이 권한을 얻는 것을 방지
- Ansible Vault를 이용하면 Ansbile에서 사용하는 모든 구조화된 데이터 파일을 암호화 가능
- Ansible Vault는 변수 또는 전체 파일 및 YAML 플레이 북을 암호화 → 파일을 암호화하고 복호화 할 때 동일한 암호를 요구
1. Ansible-Vault 설치
Ansible을 설치하면 Ansible-vault도 함께 설치됨
암호화 알고리즘 : AES256
$ ansible-vault -h usage: ansible-vault [-h] [--version] [-v] {create,decrypt,edit,view,encrypt,encrypt_string,rekey} ... encryption/decryption utility for Ansible data files positional arguments: {create,decrypt,edit,view,encrypt,encrypt_string,rekey} create Create new vault encrypted file decrypt Decrypt vault encrypted file edit Edit vault encrypted file view View vault encrypted file encrypt Encrypt YAML file encrypt_string Encrypt a string rekey Re-key a vault encrypted file optional arguments: --version show program's version number, config file location, configured module search path, module location, executable location and exit -h, --help show this help message and exit -v, --verbose verbose mode (-vvv for more, -vvvv to enable connection debugging) See 'ansible-vault <command> --help' for more information on a specific command.
2. 암호화되지 않은 파일을 암호화 (../vars/main.yml 파일 암호화)
기존에 가지고 있는 파일을 암호화함으로 알수 없는 문자로 이루어진 파일 생성 (Plain text → Encrypt text)
암호화할때 AES256 암호화 표준을 사용
암호화된 파일의 key를 1234로 함
실전에서는 보다 복잡하게 생성해야하지만, 해당 key의 비밀번호를 담고있는 암호화 파일을 추가로 생성하여 vault password 입력할때 활용하는 테스트를 위해 단순하게 생성
# 암호화할 파일의 내용 확인 $ vi ../vars/main.yml --- #사용자 목록 root_user: "root" hippo_user: "hippo" #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시 root_newpasswd: "########" hippo_newpasswd: "########" # ../var/main.yml 파일을 암호화하여 새로운 암호화 파일 생성 $ ansible-vault encrypt ../vars/main.yml New Vault password: Confirm New Vault password: Encryption successful # ../vars/main.yml 파일이 암호화되어있음을 확인 가능 $ cat ../vars/main.yml $ANSIBLE_VAULT;1.1;AES256 33363235653433386533393236363138376133666234623535313431373835323563323230653838 3036383965373264646262316464306137623333656435370a333162616433653761336332343439 61323933646137666663616231613539393264363032613137393538343837393838306231383861 6265323931656562340a316539306433363436613262393633623463626361303339396430386465 30326638623336386133303136396431336662326639623439653035373363643966633161656666 65613632353539616365666530313532373530613239373632316532613838643434623962366332 31333834613237633134316332343437323063386234643063303464393365326133636462356266 63343662363237633365646535333733623966323735343865656536626664613263353332393263 31396361303533663463313832333362353732663939616539616131653533383331343064623961 38303966393434323266643133323635323461653265633338306430323566373236643662356565 62326336353336613937623738323861333636336234623030376434316564386131363639643739 38653764376634613636356665383830306230356364323932373734363831333030313730656464 31383231653330393764323638393034646539646366336438386533323534336631336133333337 62626434343532636338613339333739396231643934616135363836323961303032626661303737 62313433343236636134396136633566343165343963663462336531343162383361396536313434 35333064313739623464
3. 암호화한 ../vars/main.yml 파일이 이상없이 roles에서 적용가능한지 테스트
비밀번호를 변경하는 roles
암호화한 ../vars/main.yml 을 활용하기 위해서는 키가 필요
키를 수동으로 입력하기 위해서는 옵션을 넣어야함(--ask-vault-pass)
--ask-vault-pass 옵션이 없는 경우 ansible-vault로 암호화된 파일을 읽을 수 없어서 에러 발생
# 아래와 같이 일반 암호와 vault 암호를 같이 입력해야함 -> 정상 실행됨으로 실행 내용은 생략 # Vault password에 들어갈 비밀번호는 "1234" $ ansible-playbook change_passwd_role.yml -k --ask-vault-pass SSH password: Vault password: PLAY [change passwd Role] ******************************************************************* [...생략]
4. 암호화된 파일을 복호화 (../vars/main.yml 파일 복호화)
암호화된 파일을 Plain text 파일로 복호화 (Encrypt text → Plain text)
복호화할때 AES256 암호화 표준을 사용
암호화된 파일에 key를 1234로 하여 복호화
# 암호화된 ../var/main.yml 파일을 복호화하여 기존 파일으로 변경 $ ansible-vault decrypt ../vars/main.yml Vault password: Decryption successful # 암호화된 ../vars/main.yml 파일이 복호화되어있음을 확인 가능 $ cat ../vars/main.yml --- #사용자 목록 root_user: "root" hippo_user: "hippo" #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시 root_newpasswd: "########" hippo_newpasswd: "########"
5. 암호화 키 제작 → 암호화할 파일의 키를 암호화
암호화할 파일의 키는 "1234" → 중요한 정보를 암호화할 때 사용할 키
암호화할 파일의 키를 복호화할 키는 "9876" → 암호화한 키의 내용이 복호화되면 암호화된 정보까지 도달할 수 있기에 이 부분도 복잡하게 하는 것이 중요 (테스트이기에 단순하게 적용)
중요한 정보를 암호화할 키를 Plain text로 공유하면 관리에서 문제가 발생할 수 있음 → 암호화된 키로 공유하여 관리 문제 해결
# vault password는 vault_key 파일의 키 -> 복호화할때 사용 $ ansible-vault create ../vars/vault_key New Vault password: Confirm New Vault password: # 1234로 입력하고 wq!으로 저장하면 ../vars/vault_key 파일 생성 1234 # ../vars/vault_key 파일의 내용 확인 -> 해당 내용으로 암호화가 필요한 중요 파일을 암호화 $ cat ../vars/vault_key $ANSIBLE_VAULT;1.1;AES256 61336134633736613130643539316264356339333261623865356261366465623065613436313064 3263356335363463623362646333366338613764643932300a303635663930653934313931303966 37316437336635333137336330616264623264393831316537303434376138373463393361373936 6132636239613263350a363863343233656164343832663965353433393136343465383933656636 3962
6. 중요 파일을 암호화된 키로 암호화 → 암호화된 키 공유하여 ansible 활용
암호화 키를 공유해도 해당 키의 암호키를 모르기에 문제 X
중요한 파일을 암호화할 때 해당 암호화된 파일 활용 → 이전에 Plain text로 "1234" 입력하는 것과 동일 효과
암호화된 키를 활용하기 위해서는 vault-password-file 옵션 사용
해당 이슈 내용은 ansible 버전 업그레이드로 ansible-vault를 통해서 암호화된 파일은 ansible-vault키로 사용 X → 해결 방법으로는 6.1 부분과 6.2 부분를 보고 괜찮은 부분을 따라서 하면됨
ansible-vault로 encrypt한 ../vault_key 파일을 활용하여 ../main.yml 파일을 암호화할 때 문제 발생
$ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key # 이슈 내용: ansible-vault를 통해서 생성한 암호화 파일을 ansible-vault의 키로 사용할 경우 아래와 같은 에러가 발생함 [WARNING]: Error in vault password file loading (default): A vault password must be specified to decrypt data ERROR! A vault password must be specified to decrypt data
6.1. 생성한 AES256 암호화 파일을 ansible-vault에서 볼트 암호화 파일로 인식하지 못하게 하기
- vault_key 파일 확인
$ cat ../vars/vault_key $ANSIBLE_VAULT;1.1;AES256 61336134633736613130643539316264356339333261623865356261366465623065613436313064 3263356335363463623362646333366338613764643932300a303635663930653934313931303966 37316437336635333137336330616264623264393831316537303434376138373463393361373936 6132636239613263350a363863343233656164343832663965353433393136343465383933656636 3962
- vault_key 파일 내용 변경 → 출력되는 내용 중에 $(달러 기호)를 삭제
$ vi ../vars/vault_key ANSIBLE_VAULT;1.1;AES256 61336134633736613130643539316264356339333261623865356261366465623065613436313064 3263356335363463623362646333366338613764643932300a303635663930653934313931303966 37316437336635333137336330616264623264393831316537303434376138373463393361373936 6132636239613263350a363863343233656164343832663965353433393136343465383933656636 3962
vault_key를 평문으로 인식 → ../vars/vault_key 파일을 통해 ../vars/main.yml 파일을 암호화 복호화 테스트
# 암호화 테스트 $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key Encryption successful # 암호화가 정상적으로 진행되었는지 확인 $ cat ../vars/main.yml $ANSIBLE_VAULT;1.1;AES256 63643230343061333339313964343937336632386364663935643736313333336238663932323865 3730326361663139626232386562653962396263343931310a333161343061376331306530303736 36663832626133353932383464323539656431373563613563653230623136343963306230623962 6538353330343666380a396639323235653465356336346135646562616161306333313033336562 65333766643234633633633532623062393033636233643534336138366465326237333932643333 30353563343337643031353966366264383264356562316234393331393832656162653933343136 38646331333238633766393036336431366634643863323234353133643031653033663037356236 61393162386637326437623164323364666330613636666462366465363764663364666330303566 36306433366539623433386434616238663063633734656131316434323332623735346335616266 61303838393239643834343362386331386534343339313265663334323035653665616632363661 38376433643239323564616162666535393431326533643432396466633034646562396134356437 39626134346565326533393836653634316536633164616164393436316330323331336239336665 64383238383930613930653065386631343933633462383966313236666532353334343137333632 66643462626164616339303064633733303734653735313862653165633762353430313136386463 33663434306566323161386630376130333865343238613736356332383862323765303634643732 66383134383439356361 # 복호화 테스트 $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key Decryption successful # 복호화가 정상적으로 진행되었는지 확인 $ cat ../vars/main.yml --- #사용자 목록 root_user: "root" hippo_user: "hippo" #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시 root_newpasswd: "########" hippo_newpasswd: "########"
6.2. vault가 아닌 openssl을 이용하여 난수로 작성된 vault_key_by_ssl 파일 생성
- openssl 명령어를 실행하여 vault_key_by_ssl 이라는 암호화된 파일 생성 → vault_key_by_ssl 파일로 main.yml 파일을 암호화하는 키로 활용
# ../vars/vault_key_by_ssl 파일이름으로 암호화된 파일 생성(ansible-vault를 활용하지 않지만, openssl로 암호화한 key 활용) $ openssl rand -base64 2048 > ../vars/vault_key_by_ssl
- 생성한 vault_key_by_ssl 확인
# 암호화된 파일 내용 출력 $ cat ../vars/vault_key_by_ssl VYStaWnLsRJeUHog1Ab/uwCR0TRbOYKpQLFt6+/L3DMBZvd+xCDX5o1L2d/Hv0xn WYu5/FjULF/wKfea4MU1i4B/UIs7Avwt6VLATSSTCWed2YuhcuzdFEJ82nc9Bv5Q 9eQcO/5T1O68rdtRmR2MtcofNohN5CN9uaGYQXaLLCEIvnkr0KWqjVOaEjrBBv3P S+dDk5n9ul9ApNz5+SxzWQ+xIYZe4WXfJ99ug9Pu5YkU8xvTw0DhED8swTBGHT12 AMWS7IvSR4nQzzpCTinfQN4x+4/KgtarJoaFRXhcLiyQGDAR9Tx0+jaXo3GUtslY YckbKFlp2jKYCUdn8QnkHidQ1N+I8vgRIkJatqfbsdkptehX3H8vm9MWHtyaTkCV R9bt0YhZOBGxp4V8VNmB8Lekt2SsrSQuXvKWh0PSS4nyj7D3n8bslVfvUCPI/6/v Ybnl1PVlEwyAW7uqeXiovn22FKryoZ2rUurXZW4QYM+P4k7T9n5a1wz0PYPFH5xz juQSsqKyUukrzy7ZS9sDMtAQDjQiBLeSeTGQD2L8skmkgkKJvzRTeD3ReMS1cLst MX1T2SuZCwF2mZTWz1NCVC5RCMGEzyzSHJXt2d5QbGsZNddm6e+siRhe3+WpVdbL 6hPsWtweCs9FPFRN4N0VpPGja2JGb9gtD5QqLXpus87zK4R8zWyckNnIoKWFH/H0 iO7L7o2keFYVROFXdVA1rizPxkmfypyMfUihT8ss/fSPa6aHPg7pNRiROHXdOTCy ZDcoFkW5lkTXE2/7GeU5QjHcK7tdXdXQ4W3Bq44CVxk2s79yb5sgZ2ZuEsySui0c RYhjY62Rd5WuOg8KP+YnrkJobfhsKGKkhiK32qIrwkloTAryIQGdeIKlXj2Xxdpe tr1JlgU1zuHWkoz3/7xpw0HAgCpmU/pm9mjkP9GYXSZoKU4A4aZSsC5zrMkrWOqz v1Z4nFHXAMByEgQP9nALrxWk8ECLOdKF/Xzi7/mPbSy42YamUtYjYnawTp9dbLuU DoSTHNQpmB0oC1qHnaem/ynakdCmpgLGIdyLC207SbCn1l33kT104gDnucvMzWmx P9AYHXwONGIpoFChjZ5tnGiCE6jzkwkoT3RWwq5sKANJ75qbZiKtiTN5N/RGLiZ5 u8Qmk+nYaAQyGV1Q2tmUnoTELGGD1nmey6TGaUtnnnEuLi5XktDcqppcylNp9RmF HzLSn4ZsI6DMsJjcam6BMQNF6AcM8t+VX0ktUiVupkAwTKonx+Ho4BdtsJyoPbe0 NnHI9WSNgX92l/dIR6oo3rWcvB+fmWgOzV5iUUeAjeB/RguVJAU7DFi+rKCSzeDL Ii4wwLD60nLk0IJoS/MNjD6RRJjjXDw2tkN6bkxHR66nB7z0VXb5CkDjefcGmUWa jqlGHs0MA7oDpUPPwOVD1onUlXFHP+81PkirvZUWW3NoVmG4psNNekNVmqvvfdwF lywgrnc/SrHb1HtFtSrKLeY1Ndt88Q6H9ZGd0A7Z+VlSzjKF1eJoZ5lIExMK5Zxs EJs/IDOlyCtWIpg44pzBurvW1IkJzI/fiRqvvEO+wNihmW/lLWIWayCGU5CFsSwr e2cx0u87GA1C13f7Zp9Ic2/GU0cnJLPRXGpHKALxN1vt5MJEJu15w2yM9KvPBXTd rYrl84qwGVJrOdxZ/HKL03SItuwzbQMZKZzkAPhWmW5SztbKPoPmBaHE6oj8LZPL 4FB8Ns4qypZgFqGIP61Oe0AO1sInbbOHOyag/8N2sqrqkHWzHjYLQ0qENGhs8ij3 osv9ulHKUw7r/iWHowY7nRIEGglovXuHvzZ9Wa54jjnqVyp5TLC9LMVa46Zg6TOZ KvmOqcuHiN1DjnEaDy2RvnNikQ++PzZsYH9hivU+94KeZodyMYJ8d0MBzwIWy+C3 KM6qr0Htr2qSITiwNlCwd8FvtjGfU98cYG9/qIy/5dbjAkJeM/M1R5EQwnw1hl1L jJXsHMG6AVWon3Yh5LNG0ilOv/eqhKV9RhAmg+KyQygrqQ9mafbqyeCGM784sex7 TQOtNuH30Mc80L+3xTo/6FC+qdEfZ5X46ctbHIRdeiB/QdcqYRLTVsZyW+TtuqVh HDDK2zfBzl1hbw2Y3Gq+qSgCwos6/PcMpHQHevwugdhDFeeS2SmpvtZz5adlMWXb dKmXEnWze7k+cdpaAxJfomBfYpyVUfHLDhnwwobyCknonW4sShdY08u5e518Gq5Q sKRNegfeKwWE8hQ5Rq3Llx393IzQSCA80dWRzKQ8ceCYjm9eTrC2fcCo72KACB34 G96ZmkeCB6oGAqPzcbYUC18HxF4E5vQ/xui44+zvfaBw9HiGRCsl49dSqRRsQQJH TtqIhABtkU5/3iNVdSYKTubG79J09xSDXro3HPfDHk0nbAtdONVCBKGYbiTSvxxh 2qA9Ig5c2hLPpla+egpVQMX22a+3i9fc+xoCSxu31HJoGYAQEQUdAvzcHNJ8jAqA EN6KN5pfWhoHTKjpZgi6tqAnUaDOe9F4k+BR2uAuMhPQDP72IuYup2+z0hxFipva KpQeCo51fyvKTtH+jM4Q/Ja2KNy1QcHonvejm+xvBo+9+FX/wAaayy+R7JkKFoe1 UyOturM5FlwzEfhFPt4xZ4FXJjAkc48IrvVfq6D54TP6dFGzW7/jm8Jf1S7rAY1e diwsDv9JiTIcFBw7UA39QKgKOeCduRwgySbiF34vO38=
새로 생성한 vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 암호화
# 암호화 테스트 $ ansible-vault encrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl Encryption successful # 암호화된 ../vars/main.yml 파일 내용 확인 $ cat ../vars/main.yml $ANSIBLE_VAULT;1.1;AES256 33303566376566653234393138636562663863393431646566333262643232383862383439626531 6433303938363137623762316234666163383238383136320a333238623731333539353065313666 63633864663763346263663564646561666534343137616139373564363964396131343863363263 6366663236613735320a333264323761353230306239346663656466663638323961396364323138 35636665333737643838616161343835363732356536633833646431323465646131393432373863 35653939326435626464373036633531303466356164656437323039343435613532653531636231 35356237663464306566663463613939313433333031633736323165663839306266376334636336 39356537323930656263313037396531663961396162333162613765356265653135336535316366 39666432363036646364613165346461363830613032323961396563643466663633613635343633 62396536656562303365346563626338353234303161306432333430303662346166353133353230 39613636666165626362366637633061396266636561646463363966306135323835666536393765 34316662396265336365383462643932366532663132616361396238396561663166386532636264 64626266373266326266363739653633623664353765336136356539323665336265653461666466 33393462633138346638313866643132346239643061353131326132336134653737646565636262 35356131343362383532353232346430643237383165353132616133643630373466383761323030 38333061313761373938 # vault_key_by_ssl 파일을 이용해서 ../vars/main.yml 파일을 복호화 $ ansible-vault decrypt ../vars/main.yml --vault-password-file ../vars/vault_key_by_ssl Decryption successful # 복호화가 정상적으로 진행되었는지 확인 $ cat ../vars/main.yml --- #사용자 목록 root_user: "root" hippo_user: "hippo" #변경하고자하는 id의 비밀번호 -> 비밀번호 부분은 ####으로 표시 root_newpasswd: "########" hippo_newpasswd: "########"
7. 생성된 암호화 키 파일인 ../vars/vault_key과 ../vars/vault_key_by_ssl를 활용하여 ../vars/main.yml 파일을 암호화 → roles에서 적용가능한지 테스트
암호화된 키 파일을 활용 → 6.1과 6.2 중 하나를 이용하면 됨
암호화된 키 파일을 통해서 ../vars/main.yml 파일 암호화
roles를 이용하여 암호화된 파일이 이상 없는 지 확인 필요
--vault-password-file 옵션을 사용하여 암호화된 키 피일을 적용 → 암호화된 키를 통해 중요한 데이터가 암호화되어야만 정상 roles 작동
--vault-password-file 옵션으로 암호화된 파일을 적용하는 것은 문제 없으나, SSH 접속에는 비밀번호가 필요함으로 SSH password 부분에 적합한 비밀번호 적용 필요
해당 부분도 암호화로 변경하여 자동화 할수 있지만, 해당 파일의 목적이 비밀번호 변경임으로 비밀번호 확인 차원에서 SSH 접속 비밀번호는 수동으로 남겨놓음
# Vault password에 들어갈 비밀번호를 암호화된 파일을 이용하여 적용 -> --vault-password-file 옵션 활용 # 정상 실행됨으로 실행 내용은 생략 # 파일 경로는 직접 확인하여 적용 필요 $ ansible-playbook change_passwd_role.yml -k --vault-password-file ../vars/vault_key SSH password: PLAY [change passwd Role] ******************************************************************* [...생략]
※ ansible vault의 참고 사항
1. 암호화된 파일의 패스워드 변경하기
$ ansible-vault rekey ../vars/main.yml
2. 암호화된 파일의 내용 보기
$ ansible-vault view ../vars/main.yml
'Opensource(오픈 소스) > Vault' 카테고리의 다른 글
Vault로 클라이언트 SSH CA 키 관리하기 (0) | 2022.07.11 |
---|---|
Vault audit 로그를 활성화 (0) | 2022.07.10 |
unseal된 vault 서버에 로그인 (0) | 2022.07.10 |
Vault 서버 Seal(봉인)/Unseal(봉인 해제) (0) | 2022.07.10 |
Vault 실 서버 설치 및 systemd 서비스 관리 (0) | 2022.07.10 |