我有一个持续集成,它使用rails app并将其打包为docker镜像。
作为此打包过程的一个步骤,我想进行资产预编译。
我在Rails 5.1上这样做了。我不得不提供一些虚拟SECRET_KEY_BASE
来让它通过。
SECRET_KEY_BASE=1 RAILS_ENV=production rails assets:precompile
我现在转向Rails 5.2并希望开始使用凭据。我正在尝试以下命令:
RAILS_ENV=production rails assets:precompile
如果我不RAILS_MASTER_KEY
,那么它会显示错误:
缺少用于解密文件的加密密钥。向你的团队询问你的情况 主密钥并将其写入/home/config/master.key或将其放入 ENV [' RAILS_MASTER_KEY&#39]。
如果我提供虚假(不正确)RAILS_MASTER_KEY
,则会抱怨它无法解码凭据。
我不想给真正的RAILS_MASTER_KEY
CI。
结果,问题是。如何在没有它的情况下编译资产或者解决方法是什么?
答案 0 :(得分:1)
我也没有看到解决方案。另一种方法是继续设置config / environments / production.rb以获得行:
config.require_master_key = false
并继续使用您的SECRET_KEY_BASE=1 rails assets:precompile
我还没有找到更好的方法。至少这种方式似乎比维护假主密钥更好。
答案 1 :(得分:0)
我创建了一个假的credentials.yml.enc和RAILS_MASTER_KEY,并在我预编译资产时使用它们。
答案 2 :(得分:0)
通过使用docker机密将 master.key 传递到CI容器,我们可以轻松解决Docker 1.13及更高版本中的问题(假设您的CI也正在Docker容器中运行)。请注意,这仅在docker swarm中起作用,而且单个docker容器也可以充当docker swarm节点。要将单个节点(例如,在本地开发系统上)更改为群节点,请使用 init 命令并按照说明进行操作:
docker swarm init
https://docs.docker.com/engine/reference/commandline/swarm_init/
然后在CI容器的 docker-compose.yml 中,将 master.key 声明为Docker机密,并在右侧定位在容器中的位置:
version: '3.4'
services:
my_service:
...
secrets:
- source: master_key
target: /my_root/config/master.key
uid: '1000'
gid: '1000'
mode: 0440
...
security_opt:
- no-new-privileges
...
secrets:
master_key:
file: config/master.key
https://docs.docker.com/compose/compose-file/
如您所见,我们还可以为容器中的 master.key 分配专用的访问权限,并防止特权升级。有关docker swarm的更多说明,请访问:
https://docs.docker.com/engine/swarm/secrets/#how-docker-manages-secrets
为什么这应该是该问题的首选解决方案?您的秘密 master.key 不再存储在CI Docker容器中,而是安全地保存在Docker Swarm基础结构的加密Raft日志中,并且您不必使用伪造的密钥进行任何杂技变形。
顺便说一句,我使用这种方法来保护我在公共Docker容器中特定于域的专业知识:使用 target 参数,每个Docker机密可以携带最大500 kb的通用字符串或二进制内容,尤其是包含敏感知识的代码段。