netson的ansible hashicorp vault lookup(ahvl)插件的基本库
ahvl的Python项目详细描述
空气阀
netson的ansible hashicorp vault lookup(ahvl)插件的基本库
内容
简介
短版本
一组查找插件,从hashicorp保险库检索机密,如果不存在则自动生成它们。它支持生成密码、ssh密钥、ssh主机密钥和gpg密钥。密钥被生成并转换为各种格式,以支持广泛的应用程序。各种密钥的所有方面都存储在保险库中,并且可以访问。每个秘密都可以通过输出过滤器或散列函数传递,因此不需要进一步处理。需要盐的散列函数将盐存储在保险库中,并保持等幂。
tl;dr
妥善管理秘密是很困难的。尽管有很多很好的工具可以帮助您正确地管理、轮换和审核您的秘密,但它仍然需要很大的努力。这些ansible查找插件旨在使该过程更简单。当使用ansible管理许多服务器时,需要管理的机密数量不断增加,即使ansible提供了自己的ansible保险库作为以加密形式存储这些机密的手段,我仍然觉得这个过程相当麻烦,我想把我所有的秘密完全排除在版本控制之外,不管是否加密。
我第一次尝试使用一个不同的秘密商店,而不是Ansible金库,是建立在Keepass上的,我已经成功和愉快地使用了10多年了。在花了大量时间为keepass开发查找插件之后,我遇到了一个主要问题:性能!每次查找时,keepass数据库都必须解锁、解密、搜索、加密并再次关闭。对于一些查找,这不是一个问题,但是因为我们讨论的是每次查找的秒数,所以这似乎不是一个可伸缩的解决方案。进入Hashicorp保险库。hashicorp保险库是专门为管理机密而构建的,它提供了一些直接现成的重要功能:审计、细粒度访问控制、版本控制等。
我遇到的下一个主要问题是生成机密;当创建用户帐户时,当设置数据库时,当生成ssh密钥时,并且由于最终用户在windows系统上使用putty,当生成gpg密钥以保护自动化备份等。生成机密是一回事,但您需要将这些机密存储在保险库中,以便能够在您的行动手册中检索它们。同样,这是一个相当耗时的过程,更不用说由于缺少参数、系统默认值不安全、工具配置不当或只是缺乏睡眠而产生不安全机密的风险了!
另一个问题是,我在手动秘密管理过程中遇到的问题是,为了特定的目的,您通常需要特定格式的秘密。我已经提到了需要转换为putty格式的ssh密钥,但是在创建用户帐户时,您可能需要将密码散列为sha256crypt散列或特定的应用程序散列,如mysql41散列。
以前我有很多bash脚本来帮助我生成和转换所有这些秘密,但是安全地存储它们总是很麻烦。这些查找插件试图同时解决所有这些问题!不受版本控制的所有机密,将它们安全地存储在hashicorp vault中,当您请求一个不存在的机密时(现在),它只会动态地为您生成并存储在vault中!最后但并非最不重要的是,您可以请求您需要的特定输出,插件将返回转换后的秘密!
秘密
支持各种类型的秘密,分成不同的查找插件。对于所有的查找插件,已经设置了sane和secure默认值,但是您可以使用变量来操作秘密生成过程的几乎所有方面,以满足您的需要。
<表><广告>输出滤波器
在返回到你的剧本之前,上面的每个秘密都可以通过一个输出过滤器运行。如果选择需要salt的哈希算法,查找插件将自动为您生成一个唯一的salt,并将该salt存储在vault中,以确保每个后续的playbook运行都保持等幂性。对于secret、hostname和hash算法的每一种组合,都会生成一个唯一的salt并存储在请求的secret旁边,这样就可以很容易地找到它们,salt的重用也受到了尽可能多的限制。能够访问主机和服务。支持以下输出筛选器:
<表><广告>要求
这些查找插件依赖于以下软件包:
<表><广告>此外,还需要以下python包。这些应该自动安装,或者是默认python发行版的一部分。
<表><广告>安装
安装软件包
pip install ahvl
程序包很可能安装在ubuntu系统的/usr/local/lib/pythonx.x/dist packages/ahvl
中
升级包
pip install --upgrade ahvl
存储结构
默认情况下,这些查找插件在保险库的不同路径上存储不同的机密。
默认路径如下:
<表><广告>密码
主机/{hostname}/{find}
sshkey
sshkeys/{find}
sshhostkey
主机/{hostname}/sshhostkeys
gpgkey
gpgkeys/{find}
凭证
凭证/{find}
盐
不需要向查找插件提供选项path
,而是将对其进行计算。但是,如果希望具有不同的存储结构,则可以根据需要简单地更改基值。您可以在路径中使用变量{find}
和{hostname}
。不过,请注意任何冲突的路径。盐的特定路径无法设置,并且将始终遵循上述规则。
使用默认设置,您将得到一个类似于下面的结构。最低级别将包含键/值组合。
+-secret/
+-credentials/
+-aws/
+-gcp/
+-hosts/
+-srv1.example.com/
+-sshhostkeys/
+-ed25519/
+-rsa/
+-mariadb/
+-sshkeys/
+-myuser/
+-gpgkeys/
+-someusr/
示例
Hashicorp保险库连接
# ansible.cfg...# connection details for HashiVault lookup plugin[ahvl_connection]ahvl_url=https://192.168.1.100:8200ahvl_auth_method=tokenahvl_validate_certs=Trueahvl_cacert=/usr/local/share/ca-certificates/Netson_CA.crt
# /etc/environment...AHVL_CONNECTION_AHVL_TOKEN=<myvaulttoken>PASSLIB_MAX_PASSWORD_SIZE=16384 # to prevent error when using the hash function on (very) large passwords or keys
密码
---# playbook to demonstrate ahvl_password-hosts:localhostgather_facts:novars:output_filters:-plaintext-hexsha256-hexsha512-sha256crypt-sha512crypt-phpass-mysql41-postgresmd5-pbkdf2sha256-pbkdf2sha512-argon2-grubpbkdf2sha512tasks:# the path in vault which will be searched is [hosts/localhost/mariadb] on the default mountpoint-name:'ahvl_password:getpasswordforMariaDBaccountwithusernamemyuserandshowalloutputs'debug:msg:"{{lookup('ahvl_password',find='mariadb',in='myuser',out=item)}}"loop:"{{output_filters}}"-name:'ahvl_password:getpassword(length=8,type=phrase-willresultin8words)forMariaDBaccountwithusernameanotheruserandoutputthemysql41hash'debug:msg:"{{lookup('ahvl_password',find='mariadb',in='anotheruser',out='mysql41',pwd_length=8,pwd_type='phrase')}}"
ssh密钥
---# playbook to demonstrate ahvl_sshkey-hosts:localhostgather_facts:novars:ahvl_generate_sshkey:sshkey_pkcs8_enabled:yes# requires openssl 6.5+sshkey_putty_enabled:yes# requires puttygen 0.72+# PCKS8 and SSHCOM do not support Ed25519 keyssshkey_ed25519_in:-password-private-private_keybits-private_keytype-private_openssh-private_putty-public-public_rfc4716-fingerprint_sha256-fingerprint_sha256_clean-fingerprint_sha256_art-fingerprint_md5-fingerprint_md5_clean-fingerprint_md5_art-fingerprint_bubblebabble-fingerprint_bubblebabble_clean-fingerprint_puttysshkey_rsa_in:-password-private-private_keybits-private_keytype-private_pkcs8-private_openssh-private_putty-private_sshcom-public-public_pem-public_pkcs8-public_rfc4716-fingerprint_sha256-fingerprint_sha256_clean-fingerprint_sha256_art-fingerprint_md5-fingerprint_md5_clean-fingerprint_md5_art-fingerprint_bubblebabble-fingerprint_bubblebabble_clean-fingerprint_puttytasks:-name:'ahvl_sshkey:fetch/generateSSHkeyoftypeEd25519andoutputallinformationpieces'debug:msg:"{{lookup('ahvl_sshkey',find='myusername',in=item,out='plaintext')}}"loop:"{{sshkey_ed25519_in}}"-name:'ahvl_sshkey:rsa'debug:msg:"{{lookup('ahvl_sshkey',find='anotherusername',sshkey_type='rsa',in=item,out='plaintext')}}"loop:"{{sshkey_rsa_in}}"
ssh主机密钥
---# playbook to demonstrate ahvl_sshhostkey-hosts:localhostgather_facts:novars:sshhostkey_ins:-private-public-fingerprint_sha256-fingerprint_sha256_clean-fingerprint_sha256_art-fingerprint_md5-fingerprint_md5_clean-fingerprint_md5_art-fingerprint_bubblebabble-fingerprint_bubblebabble_clean-dns_sha1-dns_sha1_clean-dns_sha256-dns_sha256_cleantasks:# search path used for vault will be [hosts/localhost/sshhostkeys/rsa]-name:'ahvl_sshhostkey:lookupRSAhostkeyandoutputallpieces'debug:msg:"{{lookup('ahvl_sshhostkey',find='rsa',in=item,out='plaintext')}}"loop:"{{sshhostkey_ins}}"# search path used for vault will be [hosts/localhost/sshhostkeys/ed25519]-name:'ahvl_sshhostkey:lookupEd25519hostkeyandoutputallpieces'debug:msg:"{{lookup('ahvl_sshhostkey',find='ed25519',in=item,out='plaintext')}}"loop:"{{sshhostkey_ins}}"# search path used for vault will be [hosts/myhost2.local/sshhostkeys/rsa]-name:'ahvl_sshhostkey:lookupRSAforanotherhostandoutputallpieces'debug:msg:"{{lookup('ahvl_sshhostkey',find='rsa',in=item,sshhostkey_type='rsa',out='plaintext',hostname='myhost2.local')}}"loop:"{{sshhostkey_ins}}"
GPG键
---# playbook to demonstrate ahvl_gpgkey-hosts:localhostgather_facts:novars:gpgkey_regular_ins:-master_cert_pub_key_armored-master_cert_sec_key_armored-master_cert_sec_keytype-master_cert_sec_keyuid-master_cert_sec_password-master_cert_sec_fingerprint-master_cert_sec_keycurve-master_cert_sec_keygrip-master_cert_sec_keybits-master_cert_sec_creationdate-master_cert_sec_keyid-master_cert_sec_expirationdate-subkey_sign_sec_key_armored-subkey_sign_sec_fingerprint-subkey_sign_sec_keycurve-subkey_sign_sec_keygrip-subkey_sign_sec_keybits-subkey_sign_sec_creationdate-subkey_sign_sec_keyid-subkey_sign_sec_expirationdate-subkey_encr_sec_key_armored-subkey_encr_sec_fingerprint-subkey_encr_sec_keycurve-subkey_encr_sec_keygrip-subkey_encr_sec_keybits-subkey_encr_sec_creationdate-subkey_encr_sec_keyid-subkey_encr_sec_expirationdate-subkey_auth_sec_key_armored-subkey_auth_sec_fingerprint-subkey_auth_sec_keycurve-subkey_auth_sec_keygrip-subkey_auth_sec_keybits-subkey_auth_sec_creationdate-subkey_auth_sec_keyid-subkey_auth_sec_expirationdategpgkey_backup_ins:-sign_master_cert_pub_key_armored-sign_master_cert_sec_key_armored-sign_master_cert_sec_keytype-sign_master_cert_sec_keyuid-sign_master_cert_sec_password-sign_master_cert_sec_fingerprint-sign_master_cert_sec_keycurve-sign_master_cert_sec_keygrip-sign_master_cert_sec_keybits-sign_master_cert_sec_creationdate-sign_master_cert_sec_keyid-sign_master_cert_sec_expirationdate-sign_subkey_sign_sec_key_armored-sign_subkey_sign_sec_fingerprint-sign_subkey_sign_sec_keycurve-sign_subkey_sign_sec_keygrip-sign_subkey_sign_sec_keybits-sign_subkey_sign_sec_creationdate-sign_subkey_sign_sec_keyid-sign_subkey_sign_sec_expirationdate-encr_master_cert_pub_key_armored-encr_master_cert_sec_key_armored-encr_master_cert_sec_keytype-encr_master_cert_sec_keyuid-encr_master_cert_sec_password-encr_master_cert_sec_fingerprint-encr_master_cert_sec_keycurve-encr_master_cert_sec_keygrip-encr_master_cert_sec_keybits-encr_master_cert_sec_creationdate-encr_master_cert_sec_keyid-encr_master_cert_sec_expirationdate-encr_subkey_encr_sec_key_armored-encr_subkey_encr_sec_fingerprint-encr_subkey_encr_sec_keycurve-encr_subkey_encr_sec_keygrip-encr_subkey_encr_sec_keybits-encr_subkey_encr_sec_creationdate-encr_subkey_encr_sec_keyid-encr_subkey_encr_sec_expirationdatetasks:# search path used for vault will be [gpgkeys/name_ed25519_localhost_myemail]-name:'ahvl_gpgkey:fetch/generateregulared25519keyandoutputallpieces'debug:msg:"{{lookup('ahvl_gpgkey',gpgkey_fullname='name_ed25519',gpgkey_email='myemail',in=item,out='plaintext')}}"loop:"{{gpgkey_regular_ins}}"# search path used for vault will be [gpgkeys/name_rsa_localhost_myemail]-name:'ahvl_gpgkey:fetchgenerateregularRSAkeyandoutputallpieces'debug:msg:"{{lookup('ahvl_gpgkey',gpgkey_type='rsa',gpgkey_fullname='name_rsa',gpgkey_email='myemail',in=item,out='plaintext')}}"loop:"{{gpgkey_regular_ins}}"# search path used for vault will be [gpgkeys/bckp_ed25519_localhost_myemail]-name:'ahvl_gpgkey:fetch/generatebackuped25519keyandoutputallpieces'debug:msg:"{{lookup('ahvl_gpgkey',gpgkey_keyset='backup',gpgkey_fullname='bckp_ed25519',gpgkey_email='myemail',gpgkey_comment=inventory_hostname,in=item,out='plaintext')}}"loop:"{{gpgkey_backup_ins}}"# search path used for vault will be [gpgkeys/bckp_rsa_localhost_myemail]-name:'ahvl_gpgkey:fetch/generatebackupRSAkeyandoutputallpieces'debug:msg:"{{lookup('ahvl_gpgkey',gpgkey_keyset='backup',gpgkey_type='rsa',gpgkey_fullname='bckp_rsa',gpgkey_email='myemail',gpgkey_comment=inventory_hostname,in=item,out='plaintext')}}"loop:"{{gpgkey_backup_ins}}"
凭证
pip install ahvl0
配置选项
为了在配置这些查找插件的行为时提供最大的灵活性,有几种方法可以设置选项值,一种优先于另一种。它们的处理顺序如下。最低的数字将具有最高的优先级。显然,ansibe中定义的变量优先级也适用。有关详细信息,请参阅ansible docs。
<表><广告>查找('ahvl_password',find='mysql'in='myuser',out='mysql41')
ahvl_connection_ahvl_token=http://localhost:8200
ahvl_connection_ahvl_url:'http://localhost:8200'
ahvl_连接:
ahvl_url:'http://localhost:8200'
[ahvl_connection]
ahvl_token:'yourtoken'
无
AHVL保险库连接选项
每次查找都将至少生成一个到hashicorp保险库的请求。如果生成了新的机密,或者搜索路径不存在,将发出多个请求。可以设置以下连接详细信息:
<表><广告>协议://fqdn:port
令牌
/用户密码
/LDAP
/批准
令牌
无
true
/false
true
秘密
/fullpath/to/file.crt
无
无
无
无
无
无
AHVL常规选项
这些选项适用于所有查找插件,可以(有时必须)为每个查找设置。除了ahvl_tmppath,这些选项不能全局设置。
<表><广告>库存主机名
/fullpath/to/tmpdir
无
无
明文
/hexsha256
/hexsha512
/sha256crypt
/sha512crypt
/grubpbkdf2sha512
/phpass
/mysql41
/postgresmd5
/pbkdf2sha256
/pbkdf2sha512
/argon2
hexsha512
{find}
/{hostname}
true
/false
true
true
/false
false
ahvl查找密码选项
常规选项
<表><广告>主机/{hostname}/{find}
查找选项
但是,没有其他可用的选项,请同时检查"ahvl生成密码选项" rel="nofollow">ahvl生成密码选项部分!
ahvl查找ssh密钥选项
常规选项
<表><广告>sshkeys/{find}
无
私有
/密码
/私有密钥
/私有密钥类型
/私有pkcs8
/私有openssh
/私有putty
/私有sshcom
/公共/公共密码8
/公共密码RFC4716
/指纹SHA256
/指纹SHA256清除
/指纹SHA256清除
/指纹MD5清除
/指纹MD5清除
/指纹MD5清除/指纹泥
/指纹泡泡桶
/指纹泡泡桶
查找选项
但是,没有其他可用的选项,请检查ahvl generate ssh key options部分!
ahvl查找ssh主机密钥选项
常规选项
<表><广告>主机/{hostname}/sshhostkeys/{find}
无
ed25519
/rsa
无
私有
/私有密钥
/私有密钥类型
/指纹SHA256
/指纹SHA256清除
/指纹SHA256清除
/指纹MD5清除
/指纹MD5清除/指纹图像
/指纹图像
/指纹图像
/DNS图像
/DNS图像
/DNS图像
/DNS图像
/DNS图像
/DNS图像
/DNS图像
/公共图像
查找选项
但是,没有其他可用的选项,请检查ahvl generate ssh hostkey options部分也是!
AHVL查找GPG键选项
常规选项
<表><广告>gpgkeys/{find}
无
gpgkey_keyset=backup时:ed25519
/rsa
无
gpgkey_keyset=regular
:master_cert_pub_key_armaned
/master_cert_secu key_armaned
/master_cert secu keytype
/master_cert secu keyuid
/master_cert secu password
/master_cert secu指纹/主证书密钥曲线
/主证书密钥夹
/主证书密钥位
/主证书密钥创建日期
/主证书密钥ID/子键符号秒键指纹
/子键符号秒键曲线
/子键符号秒键抓取
/子键符号秒键位
/子键符号秒键创建日期
/子键符号秒键ID
/子键符号秒键过期日期/子键encr_secu key_armed
/子键encr_secu fingerprint
/子键encr_secu keycurve
/子键encr_secu keygrip
/子键encr_secu keybits
/子键encr_secu creationdate
/子键encr_secu keyid/子密钥加密密钥过期日期
/子密钥认证密钥装甲
/子密钥认证密钥指纹
/子密钥认证密钥曲线
/子密钥认证密钥夹
/子密钥认证密钥位
/子密钥认证密钥创建日期/子密钥验证安全密钥ID
/子密钥验证安全密钥过期日期
whengpgkey\u keyset=backup
:
签名主密钥是否被保护
/签名主密钥是否被保护
/签名主密钥是否被保护
/签名主密钥是否被保护/签名大师证书安全密钥
/签名大师证书安全密钥
/签名大师证书安全指纹
/签名大师证书安全密钥曲线
/签名大师证书安全密钥
/签名大师证书/签名大师证书证书创建日期
/签名大师证书证书证书密钥ID
/签名大师证书证书密钥过期日期
/签名大师密钥装甲
/签名子密钥指纹/sign_subkey_sign_secu keygrip
/sign_subkey_sign_secu keybits
/sign_subkey_sign_secu creationdate
/sign_subkey_sign_secu keyid
/sign_subkey_sign_secu expirationdate
/encr_master_cert_pu key_装甲
>./encr_master_cert_secu key_armaned
/encr_master_cert_secu key type
/encr_master_cert_secu key uid
/encr_master_cert_secu password
/encr_master_cert_secu fingerprint
/encr_master_cert_secu key curve
/encr_master_cert_secu keygrip
/encr_master_cert_secu keybits
/encr_master_cert_secu creationdate
/encr_master_cert_secu keyid
/encr_master_cert_secu expirationdate
/encr_subkey_encr_secu key_装甲
>./encr_subkey_encr_secu指纹
/encr_subkey_encr_secu密钥曲线
/encr_subkey_encr_secu密钥夹
/encr_subkey_encr_secu密钥
/encr_subkey_encr_secu创建日期
/encr_subkey_encr_secu密钥id/加密子密钥加密秒过期日期
查找选项
<表><广告>无
无
无
主机名
无
<;gpgkey_fullname>;\ult;gpgkey_comment>;\ult;gpgkey_email>;
常规
/备份
常规
但是,没有其他可用的选项,请同时选中"ahvl generate gpg key options" rel="nofollow">ahvl generate gpg key options部分!
ahvl查找凭证选项
常规选项
<表><广告>凭证/{find}
查找选项
没有其他选项。
ahvl生成密码选项
<表><广告>单词
/短语
单词
弱
/公平
/strong
/安全
安全
32
无
ascii-62
/ascii-50
/ascii-72
/hex
ascii_72
无
eff-long
/eff-short
/eff-u前缀
/bip39
eff_long
ahvl生成ssh密钥选项
<表><广告>ed25519
/rsa
ed25519
4096
无
查找
如果未提供无
用户名
如果未提供无
无
openssl
无
false
false
ahvl生成ssh主机密钥选项
<表><广告>ed25519
/rsa
无
中等
/strong
strong
无
无
ahvl生成gpg密钥选项
<表><广告>['keyid-format 0xlong'、'with fingerprint'、'personal cipher preferences aes256'、'personal digest preferences sha512'、'cert digest algo sha512']
gpgkey_pref
['sha512'、'sha384'、'sha256'、'sha224'、'aes256'、'aes192'、'zlib'、'bzip2'、'zip'、'uncompressed']
SHA512
AES256
SHA512
3
6501712
无
无
无
无
0
4096
ed25519
/rsa
ed25519
无
常规
/备份
常规
ahvl生成盐选项
<表><广告>itoa64
/alnum
ITOA64
和/
字符添加到alnum
集合中
更新ahvl包说明
- 创建工作目录mkdir/opt/ahvl&;cd/opt/ahvl
- 确保已安装绳线
pip安装绳线
- 确保您的github ssh密钥可用
- 登录github
ssh-t git@github.com
- 克隆存储库
- 设置远程原点
git远程设置url origin git@github.com:netson/ahvl.git
- 根据需要进行更改
- 删除任何可能存在的dist文件夹
rm-rf./dist&;rm清单
- 确定下一个pypi包版本号,查看
https://github.com/netson/ahvl/releases
- 更改
setup.py中的
版本和
下载URL
- 将更改提交到git
git add。&;git commit-m"提交消息"
- 按下主控键
git push origin master
- 在github上创建一个新版本,版本号与
download\u url中的版本号相同
- 创建pypi源发行版
python setup.py sdist
- 使用tween上传测试包
tween upload--存储库url https://test.pypi.org/legacy/dist/*
- 在
上验证测试结果https://test.pypi.org/manage/projects/
- 使用tween将包上载到pypi
tween upload dist/*
- 输入您的
完成了!-()用户名
和密码
- 将更改提交到git