如何用OpenSSL安全恢复环境密钥?权限、解密及参数问题
问题背景与疑问
我对OpenSSL了解不多,看到一段GitHub Actions的YAML代码但无详细使用说明,代码如下:
# Assumption: # You've created the following GitHub secrets in your repository: # MY_CLIENT_SECRET - encrypt/decrypt with openssl - useful for public and public repositories # MY_OPENSSL_PASSWORD - used to protect secrets # MY_OPENSSL_ITER - Use a number of iterations on the password to derive the encryption key. # High values increase the time required to brute-force the resulting file. # This option enables the use of PBKDF2 algorithm to derive the key. name: Recovering Secret Keys on: push: workflow_dispatch: jobs: openssl: name: Recover With OpenSSL runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v3 - env: MY_CLIENT_SECRET: ${{ secrets.MY_CLIENT_SECRET }} MY_OPENSSL_PASSWORD: ${{ secrets.MY_OPENSSL_PASSWORD }} MY_OPENSSL_ITER: ${{ secrets.MY_OPENSSL_ITER }} run: | echo "MY_CLIENT_SECRET (***) = ${MY_CLIENT_SECRET}" echo "MY_CLIENT_SECRET (openssl) = $(echo "${MY_CLIENT_SECRET}" | openssl enc -e -aes-256-cbc -a -pbkdf2 -iter ${MY_OPENSSL_ITER} -k "${MY_OPENSSL_PASSWORD}")" echo "Copy the above value, and then execute locally:" echo "echo PASTE_HERE | openssl base64 -d | openssl enc -d -pbkdf2 -iter \$MY_OPENSSL_ITER -aes-256-cbc -k \$MY_OPENSSL_PASSWORD"
我有一个公开代码的个人项目,需要获取环境密钥并生成.env文件,但仅允许特定人员操作,具体疑问如下:
- 如何设置权限,仅允许特定人员查看并生成含密钥的.env文件?
- 如何解密并创建环境密钥文件?
- MY_CLIENT_SECRET、MY_OPENSSL_PASSWORD、MY_OPENSSL_ITER分别是什么,如何获取?
问题解答
1. 权限设置:仅允许特定人员操作
- 限制Workflow触发权限:进入仓库「Settings」→「Actions」→「General」,将「Workflow permissions」设置为「Read repository contents and packages permissions」,最小化权限范围。
- 控制手动触发权限:只有仓库「Write」及以上权限的用户才能触发
workflow_dispatch,因此在仓库「Collaborators and teams」里,仅给特定人员分配「Write」或「Admin」权限。也可以在Workflow步骤中添加权限校验脚本,过滤非授权用户:if ! gh api /repos/${{ github.repository }}/collaborators/${{ github.actor }}/permission | jq -r '.permission' | grep -E '(admin|write)'; then echo "Permission denied" exit 1 fi - 隐藏敏感输出:GitHub Secrets本身加密,Workflow运行时避免直接打印原始密钥,代码中已用
***隐藏原始值,加密后的内容可安全展示,但要确保只有授权人员能查看Workflow运行日志。
2. 解密并创建.env文件
按以下步骤操作:
- 获取加密密钥:触发Workflow后,在运行日志中找到
MY_CLIENT_SECRET (openssl)对应的加密字符串并复制。 - 本地解密生成.env:
- 终端中设置环境变量:
export MY_OPENSSL_PASSWORD="你的加密密码" export MY_OPENSSL_ITER="预设的迭代次数" - 将复制的加密字符串替换
PASTE_HERE,执行命令并写入.env文件:echo PASTE_HERE | openssl base64 -d | openssl enc -d -pbkdf2 -iter $MY_OPENSSL_ITER -aes-256-cbc -k $MY_OPENSSL_PASSWORD > .env - 打开.env文件验证内容是否正确。
- 终端中设置环境变量:
3. 三个Secret的定义与创建方式
- MY_CLIENT_SECRET:项目需要的原始敏感密钥(如API密钥、数据库密码等),由你自行生成或从服务提供商处获取。创建方式:仓库「Settings」→「Secrets and variables」→「Actions」→「New repository secret」,粘贴原始密钥并命名为
MY_CLIENT_SECRET。 - MY_OPENSSL_PASSWORD:用于加密/解密
MY_CLIENT_SECRET的自定义强密码(建议包含大小写、数字、特殊字符),同样添加到GitHub Secrets中,命名为MY_OPENSSL_PASSWORD。 - MY_OPENSSL_ITER:PBKDF2算法的迭代次数(如100000),数值越高暴力破解难度越大,由你自行指定后添加到GitHub Secrets,命名为
MY_OPENSSL_ITER。
内容的提问来源于stack exchange,提问作者THIAGO DE BONIS
相关产品推荐
相关产品推荐

