10

我有一个持续集成,它采用 rails 应用程序并将其打包为 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']。

如果我提供 dummy (incorrect) RAILS_MASTER_KEY,它会抱怨它无法解码凭据。

我不想给RAILS_MASTER_KEYCI 一个真实的东西。

结果,问题是。没有它如何编译资产或有什么解决方法?

4

3 回答 3

1

我也没有看到解决方案。另一种方法是继续设置 config/environments/production.rb 以具有以下行:

config.require_master_key = false

并继续使用您的SECRET_KEY_BASE=1 rails assets:precompile

我还没有找到更好的方法。至少这种方式似乎比维护一个假的万能钥匙更好。

于 2018-05-22T21:53:51.870 回答
0

我创建了一个伪造的 credentials.yml.enc 和与之关联的 RAILS_MASTER_KEY,并在我预编译资产时使用它们。

于 2018-05-03T02:20:53.557 回答
0

我们可以通过使用 docker secret 将master.key传递给 CI 容器来轻松解决 Docker 1.13 及更高版本中的问题(假设您的 CI 也在 Docker 容器中运行) 。请注意,这仅适用于 docker swarm,但单个 docker 容器也可以充当 docker swarm 节点。要将单个节点(例如,在本地开发系统上)更改为 swarm 节点,请使用init命令并按照说明进行操作:

docker swarm init

https://docs.docker.com/engine/reference/commandline/swarm_init/

然后在CI 容器的docker -compose.yml 中将 master.key声明为docker secret 并将定位到容器中的正确位置:

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 容器中的特定领域的专业知识:使用目标参数,每个 Docker 机密可以携带最大 500 kb 的通用字符串或二进制内容,尤其是包含敏感知识的代码片段。

于 2018-10-11T07:53:05.663 回答