Contents

Ansible - Vault 加密檔案管理

透過 PlayBook 可以很方便執行大量機器部署,如果要執行的任務有機敏性的資料,並存放在共用的主機控制節點,可以透過 Vault 將檔案加密,在每一次執行要求使用者必須輸入加密過後的 playbook.yml 的密碼才能執行或檢視檔案內容。

練習環境
可以使用 HowHow 的創建 Lab 練習環境,來操作多台機器練習 Ansible,使用方式請參閱 HowHow 網站

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

  1. 下載 Lab 檔案,如果已經下載可以忽略此步驟。
1
git clone https://github.com/JeffWen0105/ansible-lab.git
  1. 使用 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 資料夾內。

  1. 執行 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   
  1. 使用執行結果的 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。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!