使用Chef Habitat部署Rails应用时如何管理敏感凭证密钥
Chef Habitat部署Rails应用时的敏感信息管理方案
以下是无需将敏感信息提交到版本控制系统的落地方法:
1. 基础配置剥离敏感值
- 所有密码、凭证、密钥不要硬编码到
plan.sh/plan.ps1、Rails的config/secrets.yml、config/database.yml这类会提交到代码库的文件中,敏感字段统一用占位符填充。 - 借助Habitat的配置模板功能,把占位符替换为Habitat配置变量,比如数据库密码写为
{{cfg.database.password}}、Rails签名密钥写为{{cfg.secret_key_base}},模板文件可以正常提交到版本库,不包含任何真实敏感值。
2. 构建阶段敏感信息处理
如果构建过程需要用到敏感信息(比如拉取私有Gem源的凭证、拉取私有npm包的令牌),不要写入plan文件,用hab pkg build的--secret参数临时传入:hab pkg build --secret="GEM_HOST_TOKEN=私有源访问令牌" .
这类参数仅在构建容器的临时环境变量中存在,不会打进最终的.hart部署包,也不会留存到构建日志中。
3. 运行阶段敏感信息注入
部署启动服务时,用以下两种方式传入真实敏感值,均不需要提前写入任何可提交到版本库的文件:
- 临时环境变量注入:启动服务时通过
--env参数传入,示例命令:hab svc start your_origin/your_rails_app --env="SECRET_KEY_BASE=生产环境签名密钥" --env="DB_PASSWORD=数据库访问密码"
这类环境变量仅对运行的Rails进程可见,不会持久化到磁盘。 - 本地配置文件注入:把敏感信息写入目标服务器上的Habitat用户配置文件,路径为
/hab/user/<你的包名>/config/user.toml,设置文件权限为0600,仅Habitat运行用户和root可读。该文件仅在部署的目标服务器上单独生成,不需要提交到版本库。
4. 适配Rails自带凭证加密功能
如果使用Rails 5.2+自带的credentials加密方案,不要把master.key提交到代码库,将密钥内容作为环境变量RAILS_MASTER_KEY通过上述运行时注入方式传入即可,Rails启动时会自动读取该环境变量解密凭证,不需要把密钥文件上传到服务器。
额外提示:所有存放在服务器上的敏感配置文件,都要纳入服务器安全基线管控,严格限制读写权限,禁止非授权用户访问。
内容的提问来源于stack exchange,提问作者Nikhil bhatt
相关产品推荐
相关产品推荐

