让Ansible更安全:使用Vault进行加密

管理目标节点时,有些操作需要使用密码才允许访问,但Ansible是一个自动化配置管理工具,在自动化操作的阶段中要求交互式输入密码的行为应该是一件让人败兴的事。

通常,实现非交互式的方案有:

(1).将敏感数据写入文件(比如写入变量文件),然后读取,这种方案不安全;

(2).定义敏感数据对应的环境变量,缺点是有些客户端工具不一定支持这种方式,且这种方案不够方便;

(3).使用命令行选项,但缺点是不安全,且Ansible不支持这种功能;

(4).expect类工具,缺点是不方便。

Ansible自身提供了更方便更安全的方案:Vault加密,它使用AES256加密算法为Ansible保驾护航。

在Ansible
2.4版本以前,其Vault加密功能并不友好,功能限制较大,比如所有任务涉及到的加密必须共享使用同一个密码,比如更早的版本不能加密部分字符串。现在的Ansible版本的Vault加密功能则比较友好,本文会详细介绍友好版本的Vault加密功能。

1、 一个入门示例:创建一个加密文件

Ansible使用ansible-
valut命令完成Vault加解密相关操作,它有很多子命令,比如创建加密文件的create子命令、查看加密文件的view子命令,等等,这些子命令的选项大多类似。

$ ansible-vault --help

positional arguments:
  {create,decrypt,edit,view,encrypt,encrypt_string,rekey}
    create              创建新的文件并加密
    decrypt             解密已加密的文件
    edit                编辑已加密文件的内容
    view                查看已加密文件的内容
    encrypt             加密已存在的未加密文件
    encrypt_string      加密一段字符串
    rekey               修改已加密文件的Vault ID和凭据密码

例如,使用create子命令创建一个加密文件passwd_prompt.yml,并在此文件中写入一个密码变量。

$ ansible-vault create --vault-id @prompt passwd_prompt.yml

New vault password (default):             # 提示用户输入的
Confirm new vault password (default):     # 提示用户输入的

---                      # 自动打开编辑器,比如打开vim
mypasswd: 123456         # 输入一个变量
                         # 保存并退出

上面使用了–vault-id @prompt作为ansible-vault的参数,当执行ansible-vault
create时,这会以交互式的方式提示用户输入一个密码,这个密码是加密这个加密文件passwd_prompt.yml所需的密码。简单地说,这个文件里保存了加密的密码数据,但要访问这个文件,也需要密码。为了区分,本文之后将称该密码为"凭据密码"。

在上面的示例中,我设置了一个变量mypasswd,且其值为123456。当退出编辑器后,会自动加密该文件。例如:

#为排版需求,我截断了一部分字符
$ cat passwd_prompt.yml
$ANSIBLE_VAULT;1.1;AES256
316336393534333831363334363633653232303268
373962616633356439393830353430373230613239
323530393466363035633164306133663030303839
6137616561353337660a3430313931376266643034
373234623839383838386537643635666232303563

如果想要查看该密文,可使用ansible-vault的view子命令,同样需要提供凭据密码。

$ ansible-vault view --vault-id @prompt passwd_prompt.yml
Vault password (default):      # 输入凭据密码后将展示如下内容
---
mypasswd: 123456

另外,请暂时记住加密文件中的第一行$ANSIBLE_VAULT;1.1;AES256,稍后会解释该行各字段的含义。

2、 Vault ID和凭据密码提供方式

在上面的示例中,使用了选项–vault-id @prompt,它的行为是以交互式的方式提示用户输入凭据密码。

实际上,–valut-id选项的完整用法是这样的:

--vault-id label@prompt
--vault-id label@path_to_normal_txt_file
--vault-id label@path_to_script_file

在解释这些用法之前,介绍一点Ansible Vault的历史:在以前的Ansible版本中,每次执行ansbile或ansible-
playbook命令时都只能提供一个凭据密码,这使得本次执行的所有任务中所涉及到的所有加密都只能共同使用这一个凭据密码。![在这里插入图片描述](https://img-
blog.csdnimg.cn/direct/0119889370ac42769591acec3f3fab51.png)

--vault-id dev_mysql@xxx
--vault-id test_mysql@xxx
--vault-id prod_mysql@xxx

也可以省略Vault ID,这时将统一使用默认的Vault ID。

–vault-id label@xxx中的xxx是什么呢?它是凭据密码的来源。凭据密码的来源有三种:

(1).prompt:prompt是固定的值,表示以交互式的方式提示用户提供凭据密码

(2).普通文件的文件名:比如"a.txt",表示从该文件中读取凭据密码

(3).脚本文件名:表示从该脚本执行结果中获取凭据密码

例如有普通文件a.txt:

echo '123456' >a.txt

有脚本文件a.sh内容如下(py脚本、perl脚本甚至是程序等都可以,只要密码会输出到标准输出并且有可执行权限即可):

#!/bin/bash
echo 123456

那么下面用三种不同的凭据密码源来创建三个加密文件:

$ ansible-vault create --vault-id id1@prompt first_encrypted.yml
$ ansible-vault create --vault-id id2@a.txt  second_encrypted.yml
$ ansible-vault create --vault-id id3@a.sh   third_encrypted.yml

如果省略Vault ID,则:

$ ansible-vault create --vault-id @prompt first_encrypted1.yml

$ ansible-vault create --vault-id a.txt  second_encrypted1.yml
$ ansible-vault create --vault-id @a.txt  second_encrypted1.yml

$ ansible-vault create --vault-id a.sh   third_encrypted1.yml
$ ansible-vault create --vault-id @a.sh   third_encrypted1.yml

当需要访问加密数据时,比如ansible命令、ansible-playbook命令、ansible-vault命令等,需指定与加密时相同的Vault
ID,且可以指定多个。

例如:

# 以文件的方式获取凭据密码
ansible-vault view --vault-id id2@a.txt  second_encrypted.yml

# 以交互式方式提供凭据密码
ansible-vault view --vault-id id2@prompt  second_encrypted.yml

# 指定多个凭据密码,通常用在ansible-playbook命令中,
# 比如变量文件中多个敏感数据使用了不同的vault id加密
ansible-playbook --vault-id id1@a.txt --vault-id id2@a.sh main.yml

3、加密已存在的文件

如果想要加密一个已经存在的文件,使用ansible-vault encrypt,用法和create子命令几乎一样。

例如,plain.yml文件目前是明文的变量文件:

$ cat plain.yml
---
plain_passwd: 123456
port: 2312

加密之:

$ ansible-vault encrypt --vault-id id1@a.txt plain.yml
Encryption successful

$ cat plain.yml
$ANSIBLE_VAULT;1.2;AES256;id1
336130623037643739633938313061336431
363838333864616665623034336439316234
643337663235366365316332643063653863
3534303533633334340a6438326433616236
383566346533653135313633633139613133
353935653734363833616464326662336132

可以一次性加载多份数据,但是它们使用相同的Vault ID和密码。

$ ansible-vault encrypt --vault-id idx@a.txt foo.yml bar.yml baz.yml

4、加密协议头的含义

在每个已加密的文件中,都包含了一行头部数据。可使用cat命令查看,例如:

$ cat plain.yml
$ANSIBLE_VAULT;1.2;AES256;id1        #<==加密协议头
336130623037643739633938313061336431
363838333864616665623034336439316234
643337663235366365316332643063653863
3534303533633334340a6438326433616236
383566346533653135313633633139613133
353935653734363833616464326662336132

有两种协议头:

$ANSIBLE_VAULT;1.1;AES256
$ANSIBLE_VAULT;1.2;AES256;id1

其中第一个字段目前只能是$ANSIBLE_VAULT。

第二个字段1.1、1.2表示的是Vault格式的版本号,如果给定了Vault ID,则版本号为1.2,如果使用默认的Vault
ID,则版本号为1.1。老版本还有1.0版本的,但现在不会设置成该版本号,1.0版本号的加密数据只能被读。

第三个字段目前只支持AES256加密算法。

第四个字段,如果加密时指定了Vault ID,则第四个字段保存的是Vault ID,否则不设置第四个字段。

当忘记了某个加密文件对应的Vault ID后,可以直接cat命令查看该加密文件来获取ID,也可以直接提取出来:

$ awk -F';' 'NR==1{print $4}' encrypted.yml
id2

如果Ansible需要访问多个Vault加密的文件,将会自动根据Vault ID去寻找用户提供的凭据密码。

例如,对于如下命令来说,main.yml中引用了两个加密的变量文件,那么自然需要两个Vault
ID和两个密码。当任务执行过程中需要解密第一个文件时,Ansible将自动获取其Vault ID并从命令行中寻找对应的Vault ID及其凭据密码来源。

$ ansible-playbook --vault-id id1@a.txt --vault-id id2@b.txt main.yml

5、解密已加密的文件

对于一个已Vault加密的文件,可使用ansible-vault decrypt解密文件。

例如,解密上面示例中已加密的plain.yml:

$ ansible-vault decrypt --vault-id id1@a.sh plain.yml
Decryption successful

$ cat plain.yml
---
plain_passwd: 123456
port: 2312

解密多个文件:

$ ansible-vault decrypt --vault-id idx@a.txt foo.yml bar.yml baz.yml

6、修改Vault ID和凭据密码

对于一个已Vault加密的文件,可使用ansible-vault rekey修改其Vault ID或其凭据密码。

例如,first_passwd.yml是一个已加密的文件:

$ cat first_encrypted.yml
$ANSIBLE_VAULT;1.2;AES256;id1
6361623434363834363065643838346361383830
3038366239353535663330653463376666346636
6439663030643839623965613563343632343234
3739313638363262390a62666466343864626466
3235633862306366383161663765663962306132

修改它的Vault ID和凭据密码:

$ ansible-vault rekey --vault-id id1@a.txt \
                      --new-vault-id id2@b.txt \
                      first_encrypted.yml
Rekey successful

再看加密后的内容,无论是Vault ID还是密文都已经改变了:

$ cat first_encrypted.yml
$ANSIBLE_VAULT;1.2;AES256;id2
366666343166313633396135346464653537373936
343936653437616235316630333538343139336361
656330646535656335376662623062343863306561
3033383533306266620a3866396139663235303931
313230666235303833633330653863323738623339

当然,也可以只修改Vault ID或只修改凭据密码,只需保持label@xxx中的其中一项不变即可。例如:

# Vault ID不变,只修改凭据密码
$ ansible-vault rekey --vault-id id1@a.txt \
                      --new-vault-id id1@b.txt \
                      first_encrypted.yml
                      
# 凭据密码,只修改Vault ID
$ ansible-vault rekey --vault-id id1@a.txt \
                      --new-vault-id id2@a.txt \
                      first_encrypted.yml

7、编辑已加密文件的内容

如果想要编辑一个已Vault加密的文件内容,使用ansible-vault edit命令。

$ ansible-vault edit --vault-id id2@a.txt first_encrypted.yml

它将自动打开默认的编辑器(如vim)让用户进行编辑。内部过程是先创建一个带有原始明文数据的临时文件(在打开vim时,vim底部状态栏看到临时文件名),用户修改的操作都在该临时文件中进行,当保存时,将自动加密并覆盖原文件。

也可以采用先解密、再修改、再重新加密的方式,而且这种方式可以以非交互式的方式进行。

ansible-vault decrypt xxx
sed -i 'xx' xxx
ansible-vault encrypt xxx

8、ansible-playbook任务中使用Vault加密文件

对数据进行加密的原始目标是在playbook文件、task文件或变量文件中隐藏敏感数据。那么使用加密的文件呢?

例如,名为test.yml的playbook文件内容如下:

---
- hosts: localhost
  gather_facts: no
  vars_files: 
    - first_passwd.yml
    - second_passwd.yml
  tasks: 
    - name: debug var in first_passwd
      debug: 
        var: passwd1
    - name: debug var in second_passwd
      debug: 
        var: passwd2

此playbook中引入了两个变量文件first_passwd.yml和second_passwd.yml,然后分别用两个任务去访问这两个变量文件中定义的两个变量passwd1和passwd2。

这两个变量文件的内容如下:

# first_passwd.yml内容:
---
passwd1: "passwd in first_passwd"

# second_passwd.yml内容:
---
passwd2: "passwd in second_passwd"

使用不同的Vault ID和凭据密码加密这两个文件:

$ echo 'abcdef' >a.txt
$ echo 'ABCDEF' >b.txt

$ ansible-vault encrypt --vault-id passwd1@a.txt first_passwd.yml
$ ansible-vault encrypt --vault-id passwd2@b.txt second_passwd.yml

然后执行该playbook,因为涉及到了多个加密文件的访问,且Vault ID不同,凭据密码也不同,所以需要指定多个–vault-id选项。如下:

$ ansible-playbook --vault-id passwd1@a.txt --vault-id passwd2@b.txt test.yml
......
TASK [debug var in first_passwd] *********************
ok: [localhost] => {
    "passwd1": "passwd in first_passwd"
}

TASK [debug var in second_passwd] ********************
ok: [localhost] => {
    "passwd2": "passwd in second_passwd"
}
......

9、加密字符串并嵌入YAML文件

使用ansible-vault encrypt_string可以加密一段字符串。

例如:

$ ansible-vault encrypt_string --vault-id id1@a.txt 'hello' --name 'mysql_pass' 
mysql_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;id1
          39623437656130313338613033383464376437
          66303938343635623430353664303334623138
          33353435366262653437663839316261623664
          6362633233653237360a343439376437633733
          6262
Encryption successful

其中hello是需要被加密的明文数据,–name mysql_pass是yaml中的key,比如可以作为变量的名称。也可以省略–name选项。

$ ansible-vault encrypt_string --vault-id id1@a.txt 'hello'
!vault |
          $ANSIBLE_VAULT;1.2;AES256;id1
          61336334663365656361316532356133623
          62343863366463396338333933343635373
          39656461643962643831653561313266366
          6432316334653339340a336565333361346
          3635
Encryption successful

加密一段字符串之后,就可以将这段加密后的字符串原样拷贝到yaml文件中。比如下面是MySQL Role的一个变量文件:

---
mysql_port: 3306
mysql_user: root
mysql_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;id1
          39623437656130313338613033383464376437
          66303938343635623430353664303334623138
          33353435366262653437663839316261623664
          6362633233653237360a343439376437633733
          6262
mysql_host: 192.168.200.27

此外,ansible-vault encrypt_string也可以从标准输入中获取要加密的明文数据:

$ ansible-vault encrypt_string --vault-id id1@a.txt --stdin-name 'mysql_pass' <<<"hello"
mysql_pass: !vault |
          $ANSIBLE_VAULT;1.2;AES256;id1
          35386538393939633862626361323735306
          63383966356265333336303231313735376
          38346566373262663866363631373539313
          6531643131306537350a363232656661303
          6333
Encryption successful

# 或者
$ echo -n 'hello' | ansible-vault encrypt_string --vault-id id1@a.txt --stdin-name 'mysql_pass'

注意从标准输入获取待加密数据时,使用的选项是–stdin-name,而不是–stdin --name。

10、 加速加解密的过程

如果要加解密的文件较多,按照官方文档所说,可安装cryptography包来解决。

pip install cryptography

11 、Vault加密最佳实践

Ansible
Vault可以加密所有的yaml、json格式的文件,但是不建议直接加密一个包含很多数据的文件,因为加密后不方便查看和修改任务文件,建议加密只包含敏感数据的文件。

比如,下面这个变量文件:

---
mysql_port: 3306
mysql_user: root
mysql_pass: xxxxxxxx
mysql_host: 192.168.200.27

其实该文件只有mysql_pass是想要隐藏的敏感数据,建议的做法是在此文件中使用jinja2再引用一次以vault_开头的变量,以vault_开头是为了一眼就能看到这是Vault加密的变量。例如:

---
mysql_port: 3306
mysql_user: root
mysql_pass: "{{vault_mysql_pass}}"
mysql_host: 192.168.200.27

然后单独在一个文件中定义被引用的变量vault_mysql_pass并加密该变量文件。例如,在mysql_pass.yml文件里定义vault_mysql_pass变量:

---
vault_mysql_pass: "abcdef"

加密之:

$ ansible-vault encrypt --vault-id mysql@a.txt mysql_pass.yml



链接:https://www.cnblogs.com/f-ck-need-u/p/17718508.html

(版权归原作者所有,侵删)

关注 工 仲 好:IT运维大本营,获取60个G的《网工+系统大礼包》

题外话

初入计算机行业的人或者大学计算机相关专业毕业生,很多因缺少实战经验,就业处处碰壁。下面我们来看两组数据:

2023届全国高校毕业生预计达到1158万人,就业形势严峻;

国家网络安全宣传周公布的数据显示,到2027年我国网络安全人员缺口将达327万。

一方面是每年应届毕业生就业形势严峻,一方面是网络安全人才百万缺口。

6月9日,麦可思研究2023年版就业蓝皮书(包括《2023年中国本科生就业报告》《2023年中国高职生就业报告》)正式发布。

2022届大学毕业生月收入较高的前10个专业

本科计算机类、高职自动化类专业月收入较高。2022届本科计算机类、高职自动化类专业月收入分别为6863元、5339元。其中,本科计算机类专业起薪与2021届基本持平,高职自动化类月收入增长明显,2022届反超铁道运输类专业(5295元)排在第一位。

具体看专业,2022届本科月收入较高的专业是信息安全(7579元)。对比2018届,电子科学与技术、自动化等与人工智能相关的本科专业表现不俗,较五年前起薪涨幅均达到了19%。数据科学与大数据技术虽是近年新增专业但表现亮眼,已跻身2022届本科毕业生毕业半年后月收入较高专业前三。五年前唯一进入本科高薪榜前10的人文社科类专业——法语已退出前10之列。

“没有网络安全就没有国家安全”。当前,网络安全已被提升到国家战略的高度,成为影响国家安全、社会稳定至关重要的因素之一。

网络安全行业特点

1、就业薪资非常高,涨薪快 2022年猎聘网发布网络安全行业就业薪资行业最高人均33.77万!

img

2、人才缺口大,就业机会多

2019年9月18日《中华人民共和国中央人民政府》官方网站发表:我国网络空间安全人才 需求140万人,而全国各大学校每年培养的人员不到1.5W人。猎聘网《2021年上半年网络安全报告》预测2027年网安人才需求300W,现在从事网络安全行业的从业人员只有10W人。
img

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

黑客&网络安全如何学习

今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。

1.学习路线图

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。

2.视频教程

网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。

内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。

3.技术文档和电子书

技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。

4.工具包、面试题和源码

“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。

还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。

这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。

参考解析:深信服官网、奇安信官网、Freebuf、csdn等

内容特点:条理清晰,含图像化表示更加易懂。

内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…

img

因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取

如果你对网络安全入门感兴趣,那么你需要的话可以点击这里👉网络安全重磅福利:入门&进阶全套282G学习资源包免费分享!

  • 15
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值