Rails 5.2凭证+资产预编译

时间:2018-05-01 18:54:44

标签: ruby-on-rails ruby-on-rails-5.2

我有一个持续集成,它使用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。

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

3 个答案:

答案 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的通用字符串或二进制内容,尤其是包含敏感知识的代码段。