ansible-vault 只要用於配置文件加密,能夠加密或解密,具體使用方式以下:html
Usage: ansible-vault [create|decrypt|edit|encrypt|encrypt_string|rekey|view] [options] [vaultfile.yml]
能夠看到有不少子命令:shell
先本身建立一個文件,寫入一些內容:安全
[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 ~]#
在官方文檔的示例中 --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模塊就行調試:
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的配置修改後當即生效。