10个ansible vault示例,用于解密/加密字符串和文件

时间:2020-01-09 10:34:04  来源:igfitidea点击:

Ansible版本2.3支持使用 !vault标签来单个加密变量加密单个变量。在本文中,我们将看到一些ansible vault示例,说明如何在我们的剧本中使用它。

Ansible Vault是一个命令行实用程序,默认情况下与Ansible一起安装。它允许我们加密密钥、凭证、密码等秘密,以包含在我们的剧本中。

通过这样做,我们还可以使用这些加密文件与其他人共享,因为它们包含访问加密数据的密码保护。我们可以使用这个特性来加密我们的变量、模板和剧本中的文件。

Ansible vault加密文件

使用"ansible vault",我们可以加密ansible使用的任何结构化数据文件。所以ansible vault encrypt file可以加密ansible使用的文件或者剧本。我们可以查看ansible vault的手册页以获取支持的参数列表

另请阅读:

我们还可以创建自己的手册页,其中包含已创建的脚本或者自定义工具的说明列表。

在实时生产环境中,总是建议为我们开发的每个脚本或者工具创建和发布一个手册页。

只要任何给定的运行只需要一个密码,就可以使用"-ask vault pass"和"-vault password file"选项。我们将在接下来的章节中使用它。或者,也可以使用"-vault id"选项提供密码,并指示该密码用于哪个vault标签。此处,ansible vault加密文件使用"default"vault id标签执行:

[ansible@controller base]$ ansible-vault create --vault-id @prompt secret.yml
New vault password (default):
Confirm new vault password (default):

输入密码短语后,ansible vault encrypt文件将使用默认编辑器打开,我们可以将内容放入文件中,如下所示:

--
- name: This is a secret file
  hosts: server2.example.com
  tasks:
    - name: Execute command 'date'
      command: date

现在,我们保存剧本文件。Post-ansible-vault-encrypt文件如果我们尝试读取内容,我们将看到它们实际上是加密的,带有一个小的头提示供ansible稍后使用

[ansible@controller base]$ cat secret.yml
$ANSIBLE_VAULT;1.1;AES256
61383366323932306663616165376432323838373662636464313136373833313533393961623139
3433326563386161393130626539643763643439656236320a646365363666396562626563333032
34623939363131366337643131653564646437353130666636393033393866346361646666326361
3239633533386466360a653436666665333365346462373935383030326563313263663962663866
66336532633662633930363864343537353265323565333535363634303038653133383465333237
34316431666139633530323566303436353437343362303961613563316261353532356663623064
35313735626234363131626662326463656163393630386232646561653233336536656431613832
39353837313531623934366663333662663966396237386337373235666237303766316431616363
65663635316631383539393935336636393838363033323831386163373265663935623734353563
6566306531623365623830623437363939376366386465383566

从标题中可以看出,"AES256"目前用于Vault加密,这意味着只要在创建Vault时使用良好的密码,数据就非常安全。

Ansible vault查看加密文件

正如我们现在看到的,我们无法看到加密文件的内容。因此,要使用ansible vault查看加密的文件内容,请将"ansible vault view"命令与playbook文件一起使用,如下面的ansible vault示例所示:

[ansible@controller base]$ ansible-vault view --vault-id @prompt  secret.yml
Vault password (default):
--
- name: This is a secret file
  hosts: server2.example.com
  tasks:
    - name: Execute command 'date'
      command: date

Ansible vault编辑加密文件

一旦文件用"ansible vault"加密,就不能直接编辑。在编辑器中打开文件将显示加密的数据。对文件进行任何更改都会损坏文件,Ansible将无法正确读取内容。我们必须使用ansible vault edit首先解密文件的内容,允许我们编辑这些内容,然后在将新内容保存回文件之前对其进行加密。

编辑ansible vault加密文件secret.yml,将"ansible vault edit"与playbook文件一起使用,在解密和打开编辑器之前,playbook文件将提示输入密码

[ansible@controller base]$ ansible-vault edit secret.yml
Vault password:

ansible vault打开时使用默认编辑器,并将临时文件作为文件路径。编辑器将保存此文件,然后"ansible vault"将对其进行加密并将其移动以替换原始文件

使用ansible vault密码文件

在前面的ansible vault示例中,我们使用"vault id"对剧本进行加密,现在我们将使用ansible vault密码文件方法进行加密。我们可以创建一个纯文本文件,并在该文件中提供密码,我们将进一步使用该文件对ansible vault文件进行加密。

提示:

使用ansible vault密码文件同样不安全,因为我们将创建一个纯文本密码文件,除非我们限制权限,否则其他人可以读取该文件。

为了克服这个问题,我们还可以在隐藏目录下创建隐藏文件,以防止未知用户使用它。

在这个ansible vault示例中,我将我的密码(mypassword)存储在一个临时的password_file中

[ansible@controller base]$ echo "mypassword" > password_file

现在可以使用此密码文件创建或者编辑ansible vault加密文件。

[ansible@controller base]$ ansible-vault edit --vault-id password_file secret.yml

或者

[ansible@controller base]$ ansible-vault edit --vault-password-file password_file secret.yml

我们可以将任一指令与ansible vault密码文件一起使用来创建/编辑/查看剧本文件。

加密现有文件的Ansible vault示例

前面的ansible vault示例都涉及使用"create"子命令创建新的加密文件。但是如果我们想加密一个现有的剧本文件呢?在这种情况下,可以使用"ansible vault encrypt":

我有一个未加密的剧本文件_条件.yml
我希望通过提示输入新密码来加密文件。这里我不使用任何ansible vault密码文件,而是使用带有默认标签的"ansible vault":

[ansible@controller base]$ ansible-vault encrypt --vault-id @prompt secret_conditonal.yml
New vault password (default):
Confirm new vault password (default):
Encryption successful

所以我们的ansible保险库加密文件成功了。接下来我们可以尝试检查文件的内容,它应该加密:

[ansible@controller base]$ cat secret_conditonal.yml
$ANSIBLE_VAULT;1.1;AES256
33303661356362363565383834623763353431346135393634366164613733633639393338313333
3865353734336139653266386431356537663033363565620a643763366666323462353365653634
34323338363534663063336633626433653266376633623039353261303261616137343266336133
6430646335633065360a393637663738363739346365323932623332653631356261643865376432
61663836373262373631633733363831393937363461373938326533366231663734653139336436
33326564666437363462636163313466363733396636666361393464636363353739363331653936
63386638623261343662633764333931643431303439306531313437333066303936623466316433
3939643536366463343362383937656330313832333064653934

Ansible vault更改加密文件的密码

随着时间的推移,随着贡献者的来来去去去,轮换用来加密你的秘密的密码是个好主意。加密和保护密码一样好。ansible vault提供了一个子命令,允许我们更改名为rekey的密码

我们可以使用下面的命令获取可用的受支持参数列表,并使用rekey

[ansible@controller base]$ ansible-vault  rekey --help

我们使用"-ask vault pass"提示"ansible vault"更改密码。

[ansible@controller base]$ ansible-vault rekey --ask-vault-pass secret.yml
Vault password:
New Vault password:
Confirm New Vault password:
Rekey successful

所以我们成功地更改了secret.yml剧本文件

Ansible vault解密文件

也可以使用ansible vault decrypt file对ansible中的剧本文件进行解密。如果在某个时候不再需要加密数据文件,可以使用"ansible vault decrypt"子命令删除对一个或者多个加密文件的加密。我将使用"--ask vault pass",而不是使用ansible vault密码文件。检查以下ansible vault示例:

[ansible@controller base]$ ansible-vault decrypt --ask-vault-pass secret.yml
Vault password:
Decryption successful

所以我们可以其中解密文件。现在我们可以使用任何编辑器来查看playbook文件的内容。

在剧本中使用ansible vault

  • 对于在playbook中使用ansible vault,我们需要能够通知"ansible playbook"如何访问它可能遇到的任何加密数据。

  • 与"ansible vault"不同的是,ansible playbook只用于处理文件加密或者解密,它更通用,并且默认情况下不会假设它处理的是加密数据。

  • 幸运的是,前面示例中所有熟悉的--vault id参数在ansible playbook中的工作方式与在"ansible vault"中的相同,并且不需要在playbook中使用ansible vault进行特殊处理

  • Ansible将在playbook执行期间将提供的密码和ID保存在内存中。

我有一个秘密.yml包含以下内容的剧本文件

--
- name: This is a secret file
  hosts: server2.example.com
  tasks:
    - name: Execute command 'date'
      command: date

在下面的ansible vault示例中,我们将使用"-vault id@prompt"执行这个剧本,它将在处理剧本之前提示我们yml文件的密码。

[ansible@controller base]$ ansible-playbook --vault-id @prompt secret.yml
Vault password (default):
PLAY [This is a secret file] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [Gathering Facts] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
ok: [server2.example.com]
TASK [Execute command 'date'] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
changed: [server2.example.com]
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
server2.example.com        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以这里我们在playbook中使用ansible保险库,在我们提供密码之后,ansible playbook将处理yml文件任务。

将Ansible playbook与vault密码文件一起使用

我们知道Ansible是关于自动化的,但是在上面的例子中,Ansible playbook会提示用户输入密码,所以这可能是一些组织的问题。为了克服这个问题,你可以创建一个包含剧本密码的计划文本隐藏文件。

例如,我创建了一个文本文件password_file,其中包含我的密码

[ansible@controller base]$ echo "password" > password_file

现在我可以使用下面的语法用这个vault密码文件重新生成我的ansible playbook

[ansible@controller base]$ ansible-playbook secret.yml --vault-password-file=password_file

Ansible vault加密字符串

在Ansible 2.3发布之前,安全数据必须在单独的文件中加密。现在我们不需要加密整个文件,相反,我们只能加密字符串,例如来自playbook文件的密码。我们可以使用ansible vault的"encrypt_string"子命令,该子命令生成可放入ansible YAML文件的加密字符串。

在下面的ansible vault示例中,我们有一个使用ansible vault加密字符串的示例剧本文件

[ansible@controller base]$ cat secret1.yml
--
- name: inline secret variable demonstration
  hosts: server1.example.com
  gather_facts: false
  vars:
    my_secret: secure_password
  tasks:
    - name: print the secure variable
      debug:
        var: my_secret

现在在YML文件中,我们提供了纯文本格式的"secure_password"密码。任何人都可以打开这个yml文件并获取不安全的密码信息。因此,我们既可以加密整个yml文件,也可以选择使用ansible vault encrypt string只加密"secure_password"字符串。

要加密"secure_password"字符串,请使用以下命令,这里我们再次使用默认的vault id标签:

[ansible@controller base]$ ansible-vault encrypt_string --vault-id @prompt secure_password
New vault password (default):
Confirm new vault password (default):
!vault |
          $ANSIBLE_VAULT;1.1;AES256
          32373210386330644061613237393466393363333031303965383063316338393261616134353233
          6364623038303966323834396636646463613837373461380a303662373161393466326139383565
          64396538393562343464666337633337353130306365666637373266393965633766366436623836
          3430396234626533340a613637393563333131626665626535393462653139346563383062343535
          6335
Encryption successful

ansible vault加密字符串成功。这为我们提供了"secure_password"字符串的加密密钥,我们将在ansible vault示例剧本文件中使用该字符串,格式如下

[ansible@controller base]$ cat secret1.yml
--
- name: inline secret variable demonstration
  hosts: server1.example.com
  gather_facts: false
  vars:
    my_secret: !vault |
          $ANSIBLE_VAULT;1.1;AES256
          32373330386330643061613237393466393363333031303965383063316338393261616134353233
          6364623038303966323834396636646463613837373461380a303662373161393466326139383565
          64396538393562343464666337633337353130306365666637373266393965633766366436623836
          3430396234626533340a613637393563333131626665626535393462653139346563383062343535
          6335
  tasks:
    - name: print the secure variable
      debug:
        var: my_secret

如我们所见,我已将"secure_password"字符串替换为从上面的ansible vault encrypt string命令获得的加密密钥:

现在我们可以使用playbook中的ansible vault重新连接此ansible:

[ansible@controller base]$ ansible-playbook --vault-id @prompt secret1.yml
Vault password (default):
PLAY [inline secret variable demonstration] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
TASK [print the secure variable] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
ok: [server1.example.com] => {
    "my_secret": "secure_password"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ****
server1.example.com        : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

请注意,playbook的运行方式与我们第一次测试它时完全相同,当时所有的数据都是开放给全世界看的。不过,现在我们已经成功地将ansible vault加密字符串放在一个未加密的YAML剧本中。