使用Ansible Vault保護您的秘密

保護您的秘密不落入錯誤的手中是首要任務。但是該如何確保您的秘密安全呢?將其保存在本地文本文件中?沒有加密的話,這個選項太冒險了。為什麼不使用Ansible Vault來加密您的變數和文件呢?

在本教程中,您將學習如何使用Ansible Vault保護敏感內容,例如您的密碼或金鑰。

繼續閱讀,讓偷窺者無法窺探您的秘密!

先決條件

本教程將進行實踐演示。如果您想跟隨進行,請確保您擁有以下內容。

  • A Linux machine – This tutorial uses Ubuntu 20.04, but any Linux distribution will work.
  • 在您的計算機上安裝了Ansible。

配置默認的Ansible Vault編輯器

作為系統管理員,您可能正在處理包含不同服務器用戶名和密碼的各種Ansible playbook。您不能以純文本格式將這些文件提交到版本控制系統中,因為這是不安全的。因此,Ansible Vault非常有用。

Ansible Vault旨在集成到您現有的工作流程中,以將數據存儲在加密文件中。但在創建第一個Ansible Vault之前,您需要設置默認的Ansible Vault編輯器。

1. 打開終端並SSH到您的計算機。

2. 接下來,使用文本編輯器打開 ~/.bashrc 檔案。 ~/.bashrc 檔案是一個 shell 腳本,在每次新的終端會話開始時運行。 這個 shell 腳本初始化一個交互式 shell 會話並定義環境變量。

3. 將以下行添加到 ~/.bashrc 檔案的末尾,保存更改並退出編輯器。

這行設置了當前登錄用戶的 EDITOR 變量。 EDITOR 變量確保每次打開新終端會話時都使用您喜歡的文本編輯器。

您可以設置任何其他您喜歡的文本編輯器,但本教程使用 nano 文本編輯器。

export EDITOR=nano
Setting the Default Text Editor

4. 最後,執行以下命令應用更改 (source) 而不用退出並重新登錄,並打印 (echo) 您系統當前的默認文本編輯器。

# 將環境變量加載到您當前的 shell 會話中。
source ~/.bashrc
# 打印您系統當前的默認文本編輯器。
echo $EDITOR

確認 EDITOR 變量是否設置為您喜歡的編輯器,如下所示。

Applying and Verifying Changes

創建和加密您的第一個 Ansible 保險庫

你已經設置了默認的保險櫃編輯器,現在是時候創建你的第一個保險櫃了。你將創建並加密一個包含敏感信息(如用戶名、密碼、秘密訪問密鑰等)的文件。

你將運行ansible-vault命令,這是與 Ansible 保險櫃交互的主要界面。

1. 運行以下命令以創建 secret.yml 文件。Ansible 使用 YAML,這是一種與其他數據格式(如 JSON)相比更易讀的格式。

ansible-vault create secret.yml

系統會提示你輸入並確認文件的密碼。稍後你將使用此密碼來加密和解密secret.yml文件,所以請確保選擇一個你能記住的強密碼。

Creating the secret.yml File with a Password

2. 設置了保險櫃密碼後,你的默認文本編輯器將打開一個空文件。輸入你想存儲在文件中的敏感信息,保存並關閉編輯器。

本教程將 aws_access_key 和 aws_secret_key 變量存儲在secret.yml 文件中。此時,Ansible 將加密secret.yml文件,除非他們知道保險櫃密碼,否則其他人無法讀取保險櫃的內容。

Providing Sensitive Information (secrets)

3. 運行 cat 命令嘗試在沒有密碼的情況下查看secret.yml 文件的內容。

cat secret.yml

您可以通過下面顯示的隨機數來驗證文件的內容是否加密。文件頂部的$ANSIBLE_VAULT;1.1;AES256標頭表示該文件使用Ansible Vault使用AES256密碼加密。

高級加密標準(AES)是一種對稱密鑰算法,它使用相同的密鑰來加密和解密數據。

Viewing the secret.yml file Without the Vault’s Password

加密現有文件

您已經從頭開始創建了一個自動加密的文件。但是如何加密現有文件呢?Ansible還提供了encrypt子命令來加密指定的文件。要查看如何加密現有文件,您將加密一個包含Ansible變量的特定文件。

運行以下命令以加密文件(vars.yml)。

ansible-vault encrypt vars.yml

就像您第一次創建secret.yml文件時一樣,系統會提示您為vars.yml文件提供密碼。

默認編輯器這次不會打開,因為vars.yml文件已經存在。相反,您將收到加密成功消息,指示Ansible已加密文件,如下所示。

Encrypting an Existing File (vars.yml)

現在,運行以下cat命令來驗證Ansible是否已加密vars.yml文件。

cat vars.yml
Verifying Encrypted Existing File

從Ansible Vault解密數據

你已經知道如何加密文件,使其安全。但是當你需要查看文件內容時,如何解密文件呢?解密文件在你想編輯一個加密文件或者每次閱讀文件內容時不想提供密碼時非常有用。Ansible 的 decrypt子命令將派上用場。

1. 執行以下命令解密 secret.yml 文件。

decrypt 子命令需要一個加密文件的路徑作為其唯一參數。

ansible-vault decrypt secret.yml

輸入文件的密碼,文件的內容將被解密並以純文本形式寫入磁盤。

Decrypting File Data

2. 接下來,執行 cat 命令查看 secret.yml 文件的解密內容。

cat secret.yml

你可以在終端中看到 secret.yml 文件的內容,沒有任何加密。此時,你可以隨心所欲地添加、編輯或刪除文件中的任何行。

file to your heart’s content

3. 最後,執行以下命令加密 secret.yml 文件並提供密碼以保護文件的內容。

ansible-vault encrypt secret.yml
Encrypting a Decrypted File (secret.yml)

更新 Ansible Vault 的密碼

你已經看到每次加密和解密文件時都需要輸入密碼。但也許你只想更新文件的密碼而不解密文件。如果是這樣,你需要使用 rekey 子命令。這個子命令允許你隨時更改文件的密碼。

執行以下命令以更新secret.yml文件的密碼。

rekey子命令將加密文件的路徑作為其唯一參數。

ansible-vault rekey secret.yml

提供文件的當前密碼,然後是新密碼,如下所示。

此時,舊密碼將不再解密文件。

Updating Ansible Vault’s Password

現在,運行以下命令來嘗試解密secret.yml

ansible-vault decrypt secret.yml

當提示時提供舊密碼,您將看到一條錯誤消息,顯示解密失敗,如下所示。此輸出確認文件的密碼已成功更新。

Verifying New Password is in Effect

在Playbooks和Modules中使用安全數據

您已經看到運行加密和解密文件的命令是有效的。但是,如果您打算為應用程序安全地自動執行此過程,則需要使用Playbooks和Modules。

1.在您的編輯器中打開Ansible配置文件(~/.ansible.cfg),其中包含Ansible的設置。

將以下代碼複製並粘貼到~/.ansible.cfg文件的末尾,保存更改並關閉編輯器。此代碼告訴Ansible尋找庫存文件(~/.ansible-hosts)。

[defaults]
hostfile = ~/.ansible-hosts

2.接下來,打開~/.ansible-hosts文件,其中包含您的Ansible管理節點可以管理的主機的庫存。

將以下代碼行添加到~/.ansible-hosts文件中,保存更改並關閉文件。此代碼告訴Ansible它可以通過本地連接類型管理本地主機。

localhost ansible_connection=local

運行以下命令以創建新的加密文件。您可以將文件命名為任何名稱,但在本教程中該文件名為 helloworld.yml。

ansible-vault create helloworld.yml
Creating Ansible Playbook (helloworld.yml)

將下面的代碼填入 helloworld.yml 文件中,保存更改並關閉編輯器。

此代碼是一個基本的 Ansible playbook,在您的庫存中的所有主機上打印 hello world 消息。代碼塊頂部的 — 符號表示 YAML 文檔的開始。

---

- hosts: all # 設置在庫存中的所有主機上執行任務
  tasks: # 設置要執行的任務
    - shell: echo 'hello world' # 打印 'hello world' 消息

最後,運行下面的 ansible-playbook 命令,後面跟著 –ask-vault-pass 選項,在您的庫存中的所有主機上執行 helloworld.yml playbook。

ansible-playbook --ask-vault-pass helloworld.yml

在提示時提供 helloworld.yml 文件的密碼。如下所示,您的 playbook 執行成功。

  • ok=2 – 表示您的兩個任務均成功運行。
  • changed=1 – 表示您的任務已對系統狀態進行了一次更改。在本例中,它將一條 hello world 消息寫入了 shell。
  • unreachable 和 failed 都是 0 – 表示運行期間沒有主機不可達或失敗。
Running your playbook

使用帶有密碼文件的 Ansible Vault

手動輸入密碼運行一次性任務雖然有效,但在實際應用中不太實用。

A better way to provide the password for encrypting and decrypting files is to use a password file. This way, you can store the password in a secure location, and Ansible will read the password from the file needed.

1. 執行以下命令將 Ansible Vault 密碼存儲在名為 .vault_pass的文件中。將 my_vault_password 替換為您的實際 Vault 密碼。

echo 'my_vault_password' > .vault_pass

2. 接下來,執行以下每個命令來更改文件的所有者(chown)為 root,並更改.vault_pass 文件的權限。這些命令確保只有您(root 用戶)可以讀取和寫入文件。

# 將文件所有權更改為 root 用戶
chown root:root .vault_pass
# 將文件權限更改為僅限 root(讀取和寫入權限)
chmod 700 .vault_pass

3. 最後,執行下面的 ansible-playbook 命令,後跟 -vault-password-file 選項,以使用密碼文件(.vault_pass)執行 playbook(helloworld.yml)。

ansible-playbook --vault-password-file=.vault_pass helloworld.yml

注意下面 Ansible 在不要求加密文件密碼的情況下執行了 playbook。

Running Playbook using a Password File

結論

在本教程中,您已經學會了如何使用 Ansible Vault 為 Ansible playbook 和任務加密和解密敏感數據。您已經使用密碼文件將 Ansible Vault 密碼存儲在安全位置。當執行 playbook 時,這種行為對於減少用戶介入非常有用。

有了這些新的知識,你現在可以放心地加密敏感數據,並與他人分享你的操作手冊,而不用擔心數據的安全。

如果你使用LastPass來管理密碼,為什麼不將你的Ansible Vault密碼存儲在LastPass中,並在需要時讓Ansible自動檢索它呢?

Source:
https://adamtheautomator.com/ansible-vault/