我正试图从S3桶下载一些文件作为.readthedocs.yaml
文件中jobs.pre_build
的一部分。对于创建的每个拉取请求,这是特别需要的。为此,我们需要在项目的ReadtheDocs高级设置的环境变量中设置IAM用户的访问键。
这里提到一个代码片段。
jobs:
pre_build:
- pip install awscli
- aws configure set aws_access_key_id ${aws_access_key_id}
- aws configure set aws_secret_access_key ${aws_secret_access_key}
- aws s3 cp s3://some_path some_file
此处aws_access_key_id
和aws_secret_access_key
配置为Readthedocs中的环境变量。
根据文档,Check the Public option if you want to expose this environment variable to builds from pull requests
。但是,我们不希望将AWS访问密钥公开。有没有其他方法可以设置这些密钥而不暴露它们?
这个问题问得好。
这个问题对于所有ci都是普遍的
当做Pull Request构建时,你基本上允许其他人在你的CI设置上构建他们的项目版本。
通常这很好:如果用户更改了文档中的某些内容,他们可以使用这些更改构建分支,例如生成在线预览。
但是有人也可以通过并把其他任何东西放进你的构建,因为它本质上只是一堆代码,在Docker容器中执行。它们可以覆盖来自git存储库的任何内容,包括Python依赖项,脚本和.readthedocs.yaml
中的添加命令。
通常,这不会导致任何漏洞,因为构建不包含秘密并且构建环境是隔离的。最坏的情况就是浪费计算资源。
我们可以在拉请求中使用秘密环境变量吗?
简短的回答:No, it's not possible.
在Pull Request构建中公开的环境变量不能作为"秘密"来维护。
很容易添加"echo $ENVIRONMENT_VARIABLE"通过阅读.readthedocs,也很容易获得变量名称的信息。yaml文件。
让我们假设您可以将密钥保密:那么下载的文件将仍然暴露给PR构建。因此,攻击者可以打开PR并将文件上传到某处。
解决方案?
假设文件不敏感:我建议使用,如果您能够生成一个只能下载这些文件的AWS访问密钥,那么获得对环境变量的访问将呈现对在构建中要下载和可读的完全相同的文件的访问。AWS访问密钥只允许访问构建中已经使用的相同文件,因此获得对密钥的访问权限没有任何意义。但你可以看到键是一个很好的障碍,更广泛地访问大型数据集,你可以在一段时间内旋转键。
假设文件敏感在这种情况下,我不建议您让PR构建访问文件本身。这实际上将问题从环境变量中转移了出来!
你也许可以给PR构建访问一组测试数据?
示例:从.readthedocs.yaml
运行pre_build.sh脚本。
.readthedocs.yaml:
jobs:
pre_build:
- sh -c pre_build.sh
pre_build.sh:
#!/bin/bash
if ["$READTHEDOCS_VERSION_TYPE" = "external"]
then
# Download some dummy data that's insensitive for PR builds
curl https://testdata.com/test.csv
else
pip install awscli
# These were from your original script, but they are insecure
# Use instead: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html
# aws configure set aws_access_key_id ${aws_access_key_id}
# aws configure set aws_secret_access_key ${aws_secret_access_key}
aws s3 cp s3://some_path some_filefi
⚠️对一般环境变量的强烈警告⚠️
运行像aws configure set aws_access_key_id ${aws_access_key_id}
这样的命令将使环境变量成为正在执行的命令的一部分-并且成为日志文件和进程监视的一部分。
这实际上泄露了秘密!
将环境变量传递给命令有很多小提示和技巧,但它总是有点麻烦。但是我认为aws CLI已经涵盖了您,因此您只需要为变量指定预期的名称:https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html