
密码学开发工具应用安全DevOps【免费下载链接】blackboxSafely store secrets in Git/Mercurial/Subversion项目地址https://gitcode.com/gh_mirrors/bl/blackbox点击查看免费下载BlackBox 是一款将敏感文件以 GPG 加密形式安全存储在 Git/Mercurial/Subversion 等版本控制系统中的工具而 Puppet 是业界最流行的配置管理平台之一。本文围绕仓库内 docs/with-puppet.md 官方指南系统讲解如何将 BlackBox 与 Puppet 集成一类场景是整文件加密SSL 证书、私钥等在发布到 Puppet master 时解密另一类场景是小字符串加密密码、API Key通过加密的 hiera YAML 文件按需读取。读完本文你将掌握两种集成模式的完整配置步骤、Puppet 代码写法、以及底层blackbox_postdeploy解密流程与运维要点。为什么需要把 BlackBox 引入 Puppet 环境Puppet 使用声明式的资源描述如file {}来管理被管节点的状态而 Puppet 的模块仓库modules与 hiera 数据仓库通常都放在 VCS 中。一旦这些仓库中包含 SSL 私钥、数据库密码、API Key 等敏感数据任何能够克隆仓库的人都可能读取到明文风险极高。BlackBox 的思路是只把.gpg密文提交进仓库明文只在需要的时刻、在受控的机器上解密。将其与 Puppet 结合后可以实现证书/私钥类整文件仓库中保存加密文件发布新版本到 Puppet master 时统一解密Puppet 通过puppet:///文件服务分发密码/Key 类小字符串仓库中保存加密后的 YAML如blackbox.yaml.gpg解密后接入 hieraPuppet 代码用hiera()函数取值自动化解密利用无口令 GPG 子密钥让 Puppet master 或 CI 无需交互即可解密全部文件对应blackbox_postdeploy命令。关于黑盒加密的底层原理多管理员公钥、多密钥可解密等可参考 docs/encryption.md完整的用户操作流程参见 docs/user-overview.md。方案一整文件加密SSL 证书与私钥对于 SSL 证书、私钥这类整体性文件BlackBox 将其视为普通文件处理在把新版本推送到 Puppet master 的任意时刻对它们进行解密。文件名与存放约定以一个名为secret_file.key的加密文件为例其三态命名规则如下形态路径明文文件modules/${module_name}/files/secret_file.key加密文件modules/${module_name}/files/secret_file.key.gpgPuppet 视角puppet:///modules/${module_name}/secret_file.key关键点Puppet 的source引用的是不含.gpg后缀的路径因为 Puppet 文件服务会自动将puppet:///modules/module/file映射到模块目录的files/file下而解密后的明文恰好放在该位置。Puppet 资源声明示例file { /etc/my_little_secret.key: ensure file, owner root, group puppet, mode 0760, source puppet:///modules/${module_name}/secret_file.key, # No .gpg }这段代码把模块中的secret_file.key分发到被管节点的/etc/my_little_secret.key属主root、属组puppet、权限0760。文件内容来自已解密文件因此证书、私钥等二进制内容也能原样分发——这正是 BlackBox 相对 hiera-eyaml 的优势之一无需 ASCII 化转义。发布流程何时解密按照 docs/encryption.md 中描述的 Stack Exchange 实践CI 系统把代码变更推送到 Puppet master 后master 上执行blackbox_postdeploy或blackbox decrypt --all --overwrite一次性解密所有文件。这样每次发布新版本时仓库中的.gpg文件被解密为明文Puppet master 再通过文件服务提供给 agent 拉取。bin/blackbox_postdeploy 脚本给出了这一流程的底层实现要点change_to_vcs_root prepare_keychain while IFS read 99 -r unencrypted_file; do encrypted_file$(get_encrypted_filename $unencrypted_file) decrypt_file_overwrite $encrypted_file $unencrypted_file cp_permissions $encrypted_file $unencrypted_file ... done 99$BB_FILES即从.blackbox/blackbox-files.txt注册文件清单逐行读取文件名将每个.gpg密文解密覆盖为明文并复制权限。该脚本还支持可选参数[GROUP]用于把解密结果chgrp到指定组例如puppet组并chmod gr方便 Puppet master 进程读取。这正是整文件方案中“每次推送新版本时解密”的标准做法。方案二小字符串接入 hiera密码与 API Key对于密码、API Key 这类短字符串更合适的做法是把它们集中写进一个加密的YAML 文件然后通过 hiera 提供给 Puppet。官方推荐的加密数据文件名为blackbox.yaml。步骤 1修改 hiera 搜索层级编辑 Puppet 的hiera.yaml把blackbox加入:hierarchy:搜索列表:hierarchy: - ... - blackbox - ...这样 hiera 在查找数据时就会依次搜索包括blackbox在内的层级最终落到blackbox.yaml文件。步骤 2在 blackbox.yaml 中写入敏感数据--- module::test_password: my secret password这里的键名采用module::key的层级命名方式值为密码明文。注意仓库中提交的应是blackbox.yaml.gpg通过blackbox file add blackbox.yaml加密注册后明文blackbox.yaml会被删除并加入.gitignore详见 docs/file-ops.md。在 Puppet master 上执行blackbox_postdeploy后明文blackbox.yaml才会出现在 hiera 数据目录如/etc/puppet/hieradata/中。步骤 3在 Puppet 代码中通过 hiera() 取值$the_password hiera(module::test_password, fail) file {/tmp/debug-blackbox.txt: content $the_password, owner root, group root, mode 0600, }hiera(module::test_password, fail)中的第二个参数fail是默认值若层级中找不到该键则返回fail。上例把密码写入/tmp/debug-blackbox.txt权限0600而$the_password变量本身可在任意需要字符串的位置使用。提示Puppet 4 之后的版本推荐使用lookup(module::test_password)替代hiera()但两种写法在语义上等价hiera()仍是官方指南采用的写法。自动化解密的关键无口令 GPG 子密钥与 role account无论是整文件还是 hiera 方案Puppet master 都需要在无人值守的情况下解密而 GPG 私钥默认要求口令。BlackBox 的解决方案是创建无口令的 GPG 子密钥subkey仅存放在需要解密的机器上。完整配置流程记录在 docs/role-accounts.md在安全主机SECUREHOST上为角色账户生成主密钥带口令与无口令加密子密钥gpg --homedir . --edit-key svc_deployacct gpg addkey # 选择 (6) RSA (encrypt only) gpg key 2 # 选中新子密钥 gpg passwd # 为主密钥输入口令后给子密钥设置空口令 gpg save把生成的 keyring 安全导出、传输到 Puppet masterNEWMASTER并导入到角色账户的~/.gnupg在仓库中把该角色密钥登记为 adminblackbox_addadmin $KEYNAME /path/to/dir随后blackbox_update_all_files用新密钥重加密全部文件并提交在 Puppet master 上以角色账户执行gpg --import与blackbox_postdeploy完成解密。bin/blackbox_postdeploy 与blackbox_decrypt_all_files的自动化逻辑正是为此设计——它们默认以批处理方式工作配合无口令子密钥即可实现全程无交互解密。安全警告无口令子密钥意味着任何能访问该 master 的人都能解密全部密钥。因此 Puppet master 本身必须高度加固——正如 docs/encryption.md 所言“如果你能攻破别人的 Puppet master你基本上就掌控了他们的网络”。为什么不直接用 hiera-eyaml官方在 docs/encryption.md 中列出了四条理由也构成了选择 BlackBox 的决策依据通用性BlackBox 适用于任意 Git/Mercurial 仓库即使完全不使用 Puppet 也能工作性能hiera-eyaml 按需解密Puppet master 每次被 agent 联系都要消耗大量 CPU 解密密钥会拖慢 masterBlackBox 是发布时一次性解密全部文件二进制支持hiera-eyaml 需要把内容 ASCII 化后粘贴进 YAML处理长达 10K、且几周就更换的证书非常痛苦BlackBox 对二进制文件原生支持历史原因编写 BlackBox 时 hiera-eyaml 尚不存在。运维要点与常见问题文件权限与属组解密后的明文文件权限默认为密文文件的权限cp_permissions逻辑见 bin/blackbox_postdeploy。若需要让puppet组可读可调用blackbox_postdeploy puppet脚本会额外执行chmod gr与chgrp puppet。角色密钥的命名约定官方建议使用usernameFQDN如svc_deployacctpuppet-master-1.example.com作为密钥标识而非真实邮箱。多台 master 各自持有独立密钥从密钥名即可辨认归属。常见错误排查gpg: decryption failed: No secret key说明忘记用新密钥重加密未执行blackbox_update_all_filesgpg: filename: skipped: No public keyblackbox-admins.txt中存在无效条目或已离职用户未清除Error: cant re-encrypt because a key has expired.某管理员密钥过期需按 docs/expired-keys.md 流程移除并替换。配置存放位置说明BlackBox 配置默认存放在.blackbox目录老仓库可能使用keyrings/live两者皆受支持优先检测$BLACKBOXDATA环境变量其次keyrings/live最后.blackbox。所有文档中的路径均以.blackbox为准。总结将 BlackBox 与 Puppet 集成只需掌握两条主线整文件走puppet:///文件服务 发布时解密小字符串走加密 hiera YAML hiera()函数取值。底层由blackbox_postdeploy在 Puppet master 上批量解密、无口令子密钥保障无人值守两者结合即可在享受 Puppet 配置管理便利的同时把敏感数据的暴露面严格限制在受控的 master 机器上。相关配套文档可进一步参考 docs/enable-repo.md仓库初始化、docs/with-ansible.mdAnsible 集成对照与 docs/advanced.md无仓库场景与 gpg/gpg2 混用。赞分享密码学开发工具应用安全DevOps【免费下载链接】blackboxSafely store secrets in Git/Mercurial/Subversion项目地址https://gitcode.com/gh_mirrors/bl/blackbox点击查看免费下载相关推荐fairseq S2T 完全指南基于 Speech-to-Text 框架的语音识别与语音翻译建模fairseq S2T 完全指南基于 Speech to Text 框架的语音识别与语音翻译建模 fairseq 的 Speech to TextS2T模密码学开发工具应用安全DevOps抖音批量下载实战指南单条视频到整个主页3 步配置 10 分钟跑通抖音批量下载实战指南单条视频到整个主页3 步配置 10 分钟跑通 凌晨一点运营新人小林还在浏览器里一条条保存竞品抖音视频存到第 40 个时已经磨掉半天耐网页爬虫CLIpuppet ssl 命令完全指南管理 Puppet 客户端 SSL 密钥与证书的实操手册puppet ssl 命令完全指南管理 Puppet 客户端 SSL 密钥与证书的实操手册 本指南以 Puppet 仓库中的 puppet ssl 手册页运维DevOpsIaC上一篇Playnite跨设备游戏库管理构建统一游戏生态的技术架构深度解析下一篇OpCore Simplify5分钟打造专属黑苹果系统的终极神器创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考