1. 程式人生 > >ansible基礎-加密

ansible基礎-加密

一 簡介

注:本文demo使用ansible2.7穩定版

眾所周知,ansible是很火的一個自動化部署工具,在ansible控制節點內,存放著當前環境服務的所有服務的配置資訊,其中自然也包括一些敏感的資訊,例如明文密碼、IP地址等等。

從安全形度來講,這些敏感資料的檔案不應該以明文的形式存在。此時就用到了ansible加密的特性。

ansible通過命令列「ansible-vault」給你目標檔案/字串進行加密。在執行playbook時,通過指定相應引數來給目標檔案解密,從而實現ansible vault的功能。

ansible可以加密任何部署相關的檔案資料,例如:

  • 主機/組變數等所有的變數檔案
  • tasks、hanlders等所有的playbook檔案
  • 命令列匯入的檔案(eg : -e @file.yaml  ,-e @file.json)
  • copy,template的模組裡src引數所使用的檔案,甚至是二進位制檔案。
  • playbook裡用到的某個字串引數也可以加密(Ansible>=2.3)

本節主要介紹下ansible資料檔案/字串的加解密及加密檔案的使用方法等知識點。

二 給檔案加密 

建立加密檔案

ansible-vault create foo.yml

執行該命令後,互動式輸入兩次相同的密碼,則建立加密檔案成功。

給現有檔案加密

ansible-vault encrypt foo.yml bar.yml baz.yml

如示例所示,該命令可以為多個檔案同時加密,同樣需要輸入兩次相同的密碼,則加密成功。

案例分析

很多情況下,我們需要給主機(組)部分變數檔案進行加密,而不是全加密。這裡介紹下加密和非加密需要同時存在時推薦的用法。以建立組變數為例:

定義了一個「nodes」主機組

➜  inventory cat hosts.yaml
---
# inventory/hosts
nodes:
  hosts:
    node1:
    node2:
    node3:

組變數檔案我們這樣建立,目錄結構如下:

➜  inventory tree group_vars
group_vars
└── nodes
    ├── vars.yaml
    └── vault.yaml

檔案「inventory/group_vars/nodes/vault.yaml」內容如下:

---
vault_db_name: test
vault_db_host: 127.0.0.1

上面示例中,我們為「nodes」主機組建立了一個「group_vars/nodes」目錄用於存放該主機組的變數檔案,其中「vars.yaml」和「vault.yaml」檔案分別存放不加密和加密變數通過這種拆分變數的方法,實現了加密和非加密同時存在的功能。

另外,為了便於識別,「vault.yaml」檔案裡的所有key值建議使用「vault_」開頭,這樣再playbook呼叫這些變數時,可以有很高的辨識度。

三 編輯加密檔案

對加密過的檔案進行編輯也是我們常遇到的,命令為:

ansible-vault edit foo.yml

這個命令會將該檔案解密,並放到一個臨時檔案,編輯完後再儲存到原檔案。

四 檢視加密檔案

有時我們不是想編輯檔案,而是簡單檢視下檔案內容,命令為:

ansible-vault view foo.yml bar.yml baz.yml

從示例中我們可以看出,一行命令可以檢視多個加密檔案。 

五 更改密碼

給加密檔案更改密碼,命令為:

ansible-vault rekey foo.yml bar.yml baz.yml

先互動式輸入舊的密碼,然後再互動式輸入兩次新密碼,即更改密碼成功。

 六 取消加密

取消加密的命令為:

ansible-vault decrypt foo.yml bar.yml baz.yml

互動式輸入密碼,即取消加密成功。

七 encypt_string建立加密變數

Vault ID和多密碼

ansible2.4版本以後,新增了Vault ID和多密碼的特性。Vault ID可以理解為為一個密碼設定一個標籤,用於管理員識別使用的是哪個密碼,例如dev,prod,cloud等等;多密碼指執行一次playbook時可以指定多個密碼檔案。

注:vault_id不會影響加密檔案的解密,只是為了便於管理員識別是哪個密碼。

encypt_string建立加密變數

在plabook檔案中,我們也可以為某個字串加密,從而達到加密變數巢狀在未加密YAML檔案內的效果。

「ansible-vault encrypt_string」命令用於給某個字串加密。

不設定vault_id,示例如下:

➜  lab-ansible ansible-vault encrypt_string --vault-id playbooks/test_vault.yaml  'maurice' --name 'the_name'
the_name: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          ...
          ...

設定vault_id為「dev」(給密碼打標籤)(加密引數也會有「dev」的標識):

➜  lab-ansible ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml  'maurice' --name 'the_name'
the_name: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          ...
          ...

從stdin讀取密碼:

➜  lab-ansible echo -n 'maurice' | ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
the_name: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          ...
          ...

互動式設定密碼,設定完密碼後按Ctrl+d:

➜  lab-ansible ansible-vault encrypt_string --vault-id [email protected]/test_vault.yaml --stdin-name 'the_name'
Reading plaintext input from stdin. (ctrl-d to end input)
maurice
the_name: !vault |
          $ANSIBLE_VAULT;1.2;AES256;dev
          ...
          ...

八 使用加密檔案

上面我們主要介紹了密碼檔案/變數的建立方式,接下來介紹下如何使用。

ansible執行playbook時,可以通過互動式或指定密碼檔案的方式來解密檔案。

互動式

執行playbook時在終端以互動式的形式輸入密碼,示例:

ansible版本<=2.4,該方式只支援一個密碼,不能指定vault_id

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

ansible2.4版本後,對應命令列如下,該方式只支援一個密碼,能指定vault_id

ansible-playbook --vault-id  [email protected]  playbooks/test_vault.yaml

指定密碼檔案

另外一種使用方式,是將密碼放在某個檔案內,執行playbook時,通過指定該密碼檔案進行解密。

ansible版本<=2.4,可以使用「--vault-password」引數:

ansible-playbook --vault-password-file dev-password site.yml

ansible2.4版本以後,又增加了「--vault-id」的引數,用來指定密碼檔案:

ansible-playbook --vault-id /path/to/my/vault-password-file site.yml

從可執行指令碼獲取密碼:

ansible-playbook --vault-id my-vault-password.py

指定密碼檔案同時指定vault_id:

ansible-playbook --vault-id [email protected] site.yml

指定多vault_id+多密碼檔案:

ansible-playbook --vault-id [email protected] --vault-id [email protected] site.yml

其他知識點

  1. 在僅使用多密碼檔案的情況下,預設的,ansible會按照命令列的排列順序,逐個嘗試。直到成功解密或失敗。
  2. 在使用vault_id+多密碼的情況下,ansible會優先匹配與vault_id相同的加密變數(這個標識上面加密變數有提到),如果不能解密再匹配其他vault_id變數檔案。
  3. 除了命令列,密碼檔案的預設路徑也可以通過ansible.cfg的「vault_password_file」或環境變數「ANSIBLE_VAULT_PASSWORD_FILE」獲取。

九 本節應該掌握的技能

  • 掌握變數檔案建立、檢視、編輯、更改、取消加密等方法
  • 掌握字串加密的方法
  • 掌握含加密檔案時playbook的執行方法

十 參考連結

  • https://docs.ansible.com/ansible/latest/user_guide/vault.html

 

歡迎大家關注我的公眾號: