透過 PlayBook 可以很方便執行大量機器部署,如果要執行的任務有機敏性的資料,並存放在共用的主機控制節點,可以透過 Vault 將檔案加密,在每一次執行要求使用者必須輸入加密過後的 playbook.yml 的密碼才能執行或檢視檔案內容。
1. Ansible Vault 介紹
ansible-vault 工具,管理加密檔案從創建、加密、解密、查閱、編輯、更新密碼、或是針對某段字串進行加密等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[student@workstation ~]$ ansible-vault --help
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)
|
Tip
加密使用 AES256 演算法加密,不過如果不是直接輸入密碼,而是透過檔案內容來指定僅使用 128 bits 來加密 ~
2.創建加密檔案
所創建的加密檔案不限定只能加密 playbook ,任何文件都能創建,並且被加密。
1
|
ansible-vault create <filename>
|
2.1. 創建一個加密的 example.yml
1
2
3
4
|
[student@workstation example]$ ansible-vault create example.yml
New Vault password:
Confirm New Vault password:
...
|
2.2. 創建一個加密的 example.yml ,密碼由檔案內容指定
1
2
3
|
[student@workstation example]$ echo "redhat" > my-passwd
[student@workstation example]$ chmod 0600 my-passwd
[student@workstation example]$ ansible-vault create --vault-password-file my-passwd example.yml
|
Note
使用 ansible-vault create 直接創建加密的 playbook 不會自動載入已經設定好的~/.vimrc 的配置檔 。
3. 加密以存在的檔案
直接加密已經寫好的 playbook 這種方式比較常用,驗證可以正常執行的 playbook 就可以將檔案加密,避免其它人隨意查閱、修改或是執行。
1
|
ansible-vault encrypt <filename>
|
3.1. 加密 example.yml
1
2
3
4
|
[student@workstation example]$ ansible-vault encrypt example.yml
New Vault password:
Confirm New Vault password:
Encryption successful
|
3.2. 加密 example.yml, 密碼由檔案內容指定
1
2
3
|
[student@workstation example]$ echo "redhat" > my-passwd
[student@workstation example]$ chmod 0600 my-passwd
[student@workstation example]$ ansible-vault encrypt --vault-password-file my-passwd example.yml
|
4. 編輯或查閱已經加密的檔案
4.1 查閱已經加密的檔案
檔案已經加密的情況,直接使用 cat 或是任何編輯器,都只會呈現加密亂碼。
1
|
ansible-vault view <filename>
|
1
2
3
|
[student@workstation example]$ ansible-vault view example.yml
Vault password:
...
|
4.2 編輯已經加密的檔案
想修改已經加密的檔案可以使用 edit 執行修改,預設會使用 vi 編輯器。
1
|
ansible-vault edit <filename>
|
1
2
3
|
[student@workstation example]$ ansible-vault edit example.yml
Vault password:
...
|
5. 更新密碼
如果要更換密碼,可以使用 rekey, 會要求輸入舊密碼及新密碼來更新。
1
|
ansible-vault rekey <filename>
|
1
2
3
4
5
|
[student@workstation example]$ ansible-vault rekey example.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful
|
Warning
請勿必要記得加密的密碼, ansible-vault rekey 沒有舊密碼的情況下是無法進行重置!!
6. 執行加密過的 playbook
使用 ansible-playbook 無法直接執行加密過的檔案,可以透過手動輸入密碼,或是指定存有密碼的檔案才可以正常執行。
6.1 輸入密碼執行 Playbook
1
|
ansible-playbook <filename> --vault-id @prompt
|
1
2
3
|
[student@workstation example]$ ansible-playbook playbook.yml --vault-id @prompt
Vault password (default):
...
|
Tip
也可以使用舊版本的 –ask-vault-pass 參數,差異為新式方法可以輸入多個不同的密碼,舊式方式並需確保所有加密的密碼一致。
6.2 指定存放密碼的檔案
1
|
ansible-playbook <filename> --vault-password-file <password filename>
|
1
2
|
[student@workstation example]$ ansible-playbook playbook.yml --vault-password-file passwd
...
|
7. LAB 練習
7.1 LAB
- 下載 Lab 檔案,如果已經下載可以忽略此步驟。
1
|
git clone https://github.com/JeffWen0105/ansible-lab.git
|
- 使用 data-secret 專案,使用 my-passwd 密碼執行 playbook.yml ,會產生新密碼提示,以新密碼重新變更 playbook.yml (已經配置好 ansible.cfg 及 inventory)。
Quote
如果使用 HowHow 的 Lab 環境,可以再練習前或是練習後,於 bastion 機器上輸入 rht-vmctl reset <server name>
重置機器,恢復原始環境。
7.2 LAB 解答
參考解答在 playbook-basic/data-secret 資料夾內。
- 執行 playbook 並使用 my-passwd 解密。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
[student@workstation example]$ ansible-playbook playbook.yml --vault-password-file my-passwd
PLAY [Example Secrets] ******************************************************************************************************************************************************************************************
TASK [Gathering Facts] *******************************************************************************************************************************************************************************************
ok: [servera.lab.example.com]
TASK [print new password to console] *****************************************************************************************************************************************************************************
ok: [servera.lab.example.com] => {
"msg": "New Passwd: ansible"
}
PLAY RECAP *******************************************************************************************************************************************************************************************************
servera.lab.example.com : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
|
- 使用執行結果的 ansible 更新 playbook 密碼。
1
2
3
4
|
[student@workstation example]$ ansible-vault rekey playbook.yml --vault-password-file my-passwd
New Vault password: ansible
Confirm New Vault password: ansible
Rekey successful
|
8. 小結
加密檔案可以有效防範機敏性資料被第三方查閱或是被修改,可以很好的保護檔案隱私性及安全性。千萬要注意別忘記密碼,除了暴力破解密碼之外,是無法還原被加密的 playbook,只能重新撰寫 playbook。