在开源项目中使用持续部署的安全风险

80次阅读
没有评论

问题描述

在为一个开源项目使用Travis设置持续部署过程中遇到了一个问题,加密的私钥是否容易被泄露?具体的部署流程如下:
1. 在Travis的构建作业中,构建和测试代码。
2. 如果通过测试,部署代码。
3. 解密加密的私有SSH密钥并启动SSH客户端。
4. 推送到生产服务器上的Git远程仓库。
使用travis encrypt-file deploy_rsa --add命令,私钥被加密,并且只能在Travis的构建作业中解密。我是否正确地认为,fork该仓库并创建Travis构建作业的人将无法解密该密钥?此外,唯一的攻击向量是拥有推送权限的人修改.travis-ci脚本以解密密钥并将其发送给自己吗?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在这里,你面临着三个威胁:
1. 有人可能修改.travis-ci文件并使用它来窃取未加密的密钥材料。
2. 你可能会在发布过程中意外地检入或发布解密的密钥材料。
3. 有人可能试图直接攻击加密的密钥材料;鉴于现代实践和当前的计算能力,这种可能性非常小。
在开源项目中,秘密管理的挑战是常见的。我过去采用的一种方法是在私有仓库和流水线中设置第二个“部署”阶段。私有仓库和流水线可以完全保护敏感数据,从而保护你免受1和3的攻击。你可以通过白名单文件来减少出错的概率,从而防止2的发生。
最后,一种增加攻击检测性的方法是将密钥存储在AWS CloudHSMGoogle Cloud HSMAzure KeyVault中,并将私钥标记为“不可导出”,然后将任何加密、封装或签名请求交给云端处理。这意味着即使HSM/KeyVault的凭据被窃取,你也可以知道每次使用它们进行签名的情况,并可以完全撤销对密钥的访问。不幸的是,目前似乎没有办法对SSH密钥进行这样的操作,但是对于代码签名证书来说,这种方法非常有效。

方案2

使用脚本或工具来管理密钥的加密和解密过程可能会增加复杂性,并且需要确保私钥的安全性。
另一种方法是编写脚本或使用工具来控制密钥的加密和解密过程。你可以使用openssl命令来手动加密和解密密钥,或者使用一些第三方工具来管理密钥的加密和解密过程。
以下是一个简单的bash脚本示例,可以用来加密和解密密钥:

#!/bin/bash
# 加密密钥
openssl aes-256-cbc -in deploy_rsa -out deploy_rsa.enc -k your_password
# 解密密钥
openssl aes-256-cbc -d -in deploy_rsa.enc -out deploy_rsa -k your_password

在这个示例中,我们使用openssl命令将密钥加密为deploy_rsa.enc文件,并使用密码your_password进行加密。然后,我们使用相同的密码将加密的密钥解密为deploy_rsa文件。
请注意,这只是一个示例,实际使用时需要根据具体情况进行修改和调整。

正文完