Ansible 加密模塊 Vault

ansible-vault 只要用於配置文件加密,能夠加密或解密,具體使用方式以下:html

Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]

能夠看到有不少子命令:shell

  • create: 建立一個新文件,並直接對其進行加密
  • decrypt: 解密文件
  • edit: 用於編輯 ansible-vault 加密過的文件
  • encrypy: 加密文件
  • encrypt_strin: 加密字符串,字符串從命令行獲取
  • view: 查看通過加密的文件

加密文件

先本身建立一個文件,寫入一些內容:安全

[root@Ansible ~]# echo "123456" > pass.txt
[root@Ansible ~]# cat pass.txt 
123456
[root@Ansible ~]#

而後用 ansible-vault encrypt 加密文件:ssh

[root@Ansible ~]# ansible-vault encrypt pass.txt
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@Ansible ~]#

這裏會要求輸入密碼。ide

如今再去打開文件看看:工具

[root@Ansible ~]# cat pass.txt 
$ANSIBLE_VAULT;1.1;AES256
62633762393035316438663662343964656465376634393131313466313536336361333163313238
6162356161653365623961353533356264386134653830640a353531623635653337636564383763
38316636383334323533363666383963666161633332663461316338333332623434376162326265
6565623130373539330a313737646431626131336637663033656664383932393934633337383666
6334
[root@Ansible ~]#

查看文件內容,能夠用 ansible-vault view 命令:測試

[root@Ansible ~]# ansible-vault view pass.txt
Vault password: 
123456
[root@Ansible ~]#

把文件還原能夠用 ansible-vault decrypt 命令:加密

[root@Ansible ~]# ansible-vault decrypt pass.txt
Vault password: 
Decryption successful
[root@Ansible ~]# cat pass.txt 
123456
[root@Ansible ~]#

加密配置文件

上面的演示內容只是一個小工具的單獨使用,這裏看看結合ansible命令的使用。
在/etc/ansible/hosts文件中新加一臺主機用於測試:命令行

host1 ansible_host=127.0.0.1 ansible_connection=local

這裏加的就是本機。debug

而後單首創建這臺主機的變量文件 /etc/ansible/host_vars/host1 ,隨便寫入一些變量:

---
key1: vaule1
key2: VALUE2

先來驗證一下:

[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" 
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#

如今把配置文件加密:

[root@Ansible ~]# ansible-vault encrypt /etc/ansible/host_vars/host1 
New Vault password: 
Confirm New Vault password: 
Encryption successful
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" 
ERROR! Attempting to decrypt but no vault secrets found
[root@Ansible ~]#

加密後再運行就無論用了,這裏須要加一個參數 --ask-vault-pass 來提供vault加密的密碼:

[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}"  --ask-vault-pass
Vault password: 
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#

使用文件加密

以前都是直接使用密碼進行加密。對咱們來講,其實只是把一個密碼用另外一個密碼加密了。在使用的時候,咱們不使用原來的密碼,而是使用vault的密碼。
爲了方便不用每次都輸入密碼,能夠把密碼寫在文件中。不過直接把密碼明文寫在文件中老是不安全的。利用 ansible-vault 就是讓咱們能夠把密碼直接寫在配置中(也能夠是一個單獨的配置文件),而後把有敏感信息的文件加密。這樣作的好處是,整個項目全部的配置信息都是全的,包括項目中使用的密碼,而且是加密的。
若是每次使用時仍然不想輸入密碼,也能夠把vault的密碼寫到文件中(明文的),這樣每次使用時就不是手動輸入,而是讓ansible自動從文件中獲取這個密碼。

仍是重複使用以前的配置文件,先把文件進行解密:

[root@Ansible ~]# ansible-vault decrypt /etc/ansible/host_vars/host1 
Vault password: 
Decryption successful
[root@Ansible ~]#

而後再生成文件後用文件進行加密:

[root@Ansible ~]# echo "123456" > vault-pass-file
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}"
ERROR! Attempting to decrypt but no vault secrets found
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" --vault-password-file vault-pass-file
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key2={{key2}}" --ask-vault-pass
Vault password: 
host1 | CHANGED | rc=0 >>
key1=vaule1, key2=VALUE2
[root@Ansible ~]#

這裏最後還試了一下使用密碼 --ask-vault-pass 效果其實和使用 --vault-password-file 是同樣的。一個是手動輸入密碼,一個是從文件中讀取密碼字符串。

加密變量

上面的加密方式是加密整個文件。加密後,文件中敏感的內容不敏感的內容就都看不到了,這樣也很不方便。一個解決辦法是把敏感的和不敏感的內容分開,寫在不一樣的文件中,只加密敏感文件。就像以前的示例中那樣。
還有一個更靈活的方式,使用 ansible-vault encrypt_string 把值進行加密。

經過文件加密

準備好用做vault認證的文件:

[root@Ansible ~]# ansible-vault encrypt_string --vault-id vault-pass-file 'ssh_pass' --name 'key3'
key3: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          66613666353739356536663965336234383363373563353231353939303839313430616161336365
          6662336162386231316132633365366232363936613561650a313637643339323861626364633864
          32653666626333623961643866656235653764646333613533343231303734313862376232393734
          6563343539393264650a653438326463646364646338656339356236383537663135633935313239
          3664
Encryption successful
[root@Ansible ~]#

參數--name,能夠不寫。寫上後最後生成的內容就是帶key的,不然只是生成值的部分,key咱們也能夠手動加上。

手動輸入密碼

若是不使用文件,而是要手動輸入,能夠將指定的文件名替換爲prompt,這樣就會讓咱們輸入2次密碼確認了:

[root@Ansible ~]# ansible-vault encrypt_string --vault-id prompt 'ssh_pass' --name 'key3'
New vault password (default): 
Confirm new vault password (default): 
key3: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          30666333366265346464383165373062613165666130373066613930316364363432376336613938
          3131663337633863373539666134643661623734613330350a616661613934633335303365366266
          36363433613334386664663839346435656534373732333632303532303939383466303662396438
          3433633535333130350a323934373162356139363762383739386139333937666237613564313939
          3137
Encryption successful
[root@Ansible ~]#

加上用戶標識

官方的文檔以下:
https://docs.ansible.com/ansible/latest/network/getting_started/first_inventory.html#protecting-sensitive-variables-with-ansible-vault

在官方文檔的示例中 --vault-id 的參數值,都是加上了用戶名稱表示的,加在文件名或者prompt前,用@隔開:

$ ansible-vault encrypt_string --vault-id steed@vault-pass-file 'ssh_pass' --name 'key3'
$ ansible-vault encrypt_string --vault-id steed@prompt 'ssh_pass' --name 'key3'

貌似也沒什麼用,可是生成的內容中會有這個用戶標識。仍是儘可能參考官方的建議來比較好。

生成一個新的變量,將加密的值寫到配置文件中:

[root@Ansible ~]# ansible-vault encrypt_string --vault-id steed@vault-pass-file 'ssh_pass' --name 'key3' >> /etc/ansible/host_vars/host1
[root@Ansible ~]# cat /etc/ansible/host_vars/host1
---
key1: vaule1
key2: VALUE2
key3: !vault |
          $ANSIBLE_VAULT;1.2;AES256;steed
          30343264386638623133383632353762356632643531643735653131663662623164303533373163
          3032646663363765386135386362376433326131333262310a366636396233653038646133336334
          62376532343064396639623835646563643663613530383739666239663565386364303931316637
          6137343936636266340a306233633039323537346332336132313766383039653565646230393662
          6332
[root@Ansible ~]#

這裏能夠看到密文上一行的內容的最後,有以前加上的用戶標識信息。

使用的時候,使用密碼仍是指定文件均可以:

[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key3={{key3}}" --vault-id vault-pass-file 
host1 | CHANGED | rc=0 >>
key1=vaule1, key3=ssh_pass
[root@Ansible ~]# ansible host1 -a "echo key1={{key1}}, key3={{key3}}" --vault-password-file vault-pass-file 
host1 | CHANGED | rc=0 >>
key1=vaule1, key3=ssh_pass
[root@Ansible ~]#

官方文檔中是用 --vault-id 來指定解密用的文件的,不過試了下 --vault-password-file 也是能夠的。

其餘技巧

還有一些其餘的相關內容。

使用debug模塊進行調試

官方的建議是使用debug模塊就行調試:

To see the original value, you can use the debug module.

以前的示例就不改了,要用debug模塊,簡單的能夠這麼使用:

[root@Ansible ~]# ansible host1 -m debug -a 'var="key1,key2,key3"' --vault-password-file vault-pass-file
host1 | SUCCESS => {
    "key1,key2,key3": "('vaule1', 'VALUE2', 'ssh_pass')"
}
[root@Ansible ~]#

設置配置文件

每次都多打一個參數也是很麻煩,在配置文件中有對應的配置項,好比配置成下面這樣:

# If set, configures the path to the Vault password file as an alternative to
# specifying --vault-password-file on the command line.
vault_password_file = ~/vault_password_file

注意:配置生效後,就不能再本身加參數指定了,不然會報錯。而且這個狀況不僅是在解密的時候,加密的時候也同樣。

自動生成隨機密碼

網上方法有不少,我以爲用 openssl 比較方便:

$ openssl rand -base64 10
VStCUWZZ1HfVtw==
$

能夠直接生成一串長一點的到文件中:

$ openssl rand -base64 128 -out vault_password_file
$ cat vault_password_file 
MGt5jsPiFSLR3AUMxiOqcFmg3emStka72Zm6oqv8oB/uxY4QzYkWVYNLYVOF2Oiq
3smsUcJJ3yhmmjOSP0Lveb+qwtJhk2wZe+T0Er4cqa3ymrRvuGrLlmips566uFfO
doAYVPdrqYrKKb5IQ3VCQeX6tBBmJh972oiyVsg8XQg=
$

防止普通用戶查看加密信息

雖然配置加密了,可是若是用戶要執行任務,仍是須要加密的密碼或者文件的讀權限。有了這些,用戶就能夠解密配置獲取密碼了。

經過sudo限制用戶
若是限制用戶的文件讀權限,則用戶在執行命令的時候,會警告文件不可讀。因此這條行不通:

[WARNING]: Error in vault password file loading (default): Could not read vault password file
/home/asb/vault-pass-file: [Errno 13] Permission denied: '/home/asb/vault-pass-file'
ERROR! Could not read vault password file /home/asb/vault-pass-file: [Errno 13] Permission denied: '/home/asb/vault-pass-file'

可行的方案是使用sudo。經過sudo提權後,用戶就有了訪問文件的權限。可是sudo能夠限制使用的命令,這樣用戶擁有高權限時的行爲就受到了控制。只讓用戶能夠sudo提權執行有限的命令。
注意,若是讓用戶能夠sudo執行ansible相關的命令,那麼用戶只要本身用ansible調用debug模塊就能夠提權後,把敏感的信息打印出來。或者本身構建playbook,提權執行ansible-playbook,同樣能夠獲取加密信息。

須要建立一個專門存放腳本的目錄,讓普通用戶有目錄的執行權限,可是不可寫。sudo則是設置用戶能夠提權操做該目錄下的全部程序。須要用戶執行的ansible或者playbook命令則是寫成shell腳本,由管理員設置好屬組和可執行權限,放到該目錄下。

sudo 配置
下面是sudo文件的相關設置,修改sudo建議使用命令visudo:

[root@Ansible ~]# visudo

# 建立一個組,哪些命令或目錄能夠sudo執行。這裏添加了一個目錄
Cmnd_Alias ANSIBLE_SCRIPT = /home/ansible/script/
# 建立一個用戶組
User_Alias ANSIBLE_USERS = adam, bob, clark
# ANSIBLE_USERS的用戶 能夠在任何主機上 以ansible用戶的身份 免密碼執行 ANSIBLE_SCRIPT指定的命令
ANSIBLE_USERS ALL=(ansible) NOPASSWD:ANSIBLE_SCRIPT

# 這個設置是沒必要要的,不過不加的話,命令須要使用完整的路徑,加上path後,就只須要加上文件名就行了
# 這個就是sudo下的$PATH變量。使用了sudo,查找命令就不是全局的$PATH變量了,而是下面設置的值
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/home/ansible/script

修改完成後,也是 :wq 退出。程序在退出前會進行語法檢查,若是配置文件寫的不對是不能保存退出的。sudo的配置修改後當即生效。

相關文章
相關標籤/搜索