在Public Rails应用程序中哪里存储敏感数据?

如何解决在Public Rails应用程序中哪里存储敏感数据?

| 我的个人Rails项目使用了一些API,我将这些API密钥/秘密存储在config / environments / production.yml和development.yml中作为全局变量。我现在想将这个项目推送到github上供其他人使用,但是我不希望他们拥有那些敏感数据。我也不想使用.gitignore文件,因为它是应用程序运行所必需的。我已经考虑过将它们放在数据库中的某个位置,但希望找到更好的解决方案。     

解决方法

TLDR:使用环境变量! 我认为@Bryce的评论提供了一个答案,我将其冲洗掉。 Heroku建议的一种方法是使用环境变量来存储敏感信息(API密钥字符串,数据库密码)。因此,请检查您的代码,看看其中包含敏感数据。然后创建存储敏感数据值的环境变量(例如,在您的.bashrc文件中)。例如对于您的数据库:
export MYAPP_DEV_DB_DATABASE=myapp_dev
export MYAPP_DEV_DB_USER=username
export MYAPP_DEV_DB_PW=secret
现在,在本地框中,只要需要敏感数据,您就只需引用环境变量。例如在database.yml中:
development:
  adapter: mysql2
  encoding: utf8
  reconnect: false
  database: <%= ENV[\"MYAPP_DEV_DB_DATABASE\"] %>
  pool: 5
  username: <%= ENV[\"MYAPP_DEV_DB_USER\"] %>
  password: <%= ENV[\"MYAPP_DEV_DB_PW\"] %>
  socket: /var/run/mysqld/mysqld.sock
我认为database.yml只能在应用程序的初始化或重新启动时进行解析,因此这不会影响性能。因此,这将解决您的本地开发问题,并使您的存储库公开。除去敏感数据后,您现在可以像私下一样使用相同的存储库来公开。如果您使用的是VPS,也可以解决该问题。像在开发框中一样,仅需使用ssh并在生产主机上设置环境变量即可。 同时,如果您的生产设置涉及到无法部署到生产服务器的自动部署(如Heroku那样),则需要研究如何远程设置环境变量。对于Heroku,这是由
heroku config:add
完成的。因此,根据同一篇文章,如果您已将S3集成到您的应用中,并且您有来自环境变量的敏感数据:
AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV[\'S3_KEY\'],:secret_access_key => ENV[\'S3_SECRET\']
)
只需让Heroku为它创建环境变量:
heroku config:add S3_KEY=8N022N81 S3_SECRET=9s83159d3+583493190
该解决方案的另一个优点是它与语言无关,而不仅仅是Rails。由于它们都可以获取环境变量,因此适用于任何应用程序。     ,这个怎么样...   创建一个新项目,并使用production.yml和development.yml文件中的占位符值将其检入GitHub。      更新.gitignore以包含production.yml和development.yml。      用您的秘密替换占位符值。 现在,您可以将代码检入GitHub,而不会破坏您的秘密。 而且任何人都可以克隆您的存储库,而无需执行任何其他步骤来创建丢失的文件(它们将像您一样替换占位符值)。 这符合您的目标吗?     ,他们可能最好放在初始化程序(config / initializers / api.yaml)中,尽管我认为您已经做好了准备。将实际密钥添加到.gitignore文件中,然后运行
git rm config/environments/production.yml
从存储库中删除该敏感数据。一般警告,它也会删除该文件,因此请先备份它。 然后,只需在实际文件旁边创建一个config / environments / production.yml.example文件,其中包含相关的详细信息,但忽略了敏感数据。将其投入生产时,只需复制不带.example的文件,然后替换适当的数据即可。     ,使用环境变量。 在Ruby中,可以这样访问它们:
ENV[\'S3_SECRET\']
两个原因: 这些值不会使其进入源代码管理。 无论如何,“敏感数据”(也称为密码)往往会根据每个环境进行更改。例如您应该对开发和生产使用不同的S3凭据。 这是最佳做法吗? 是:http://12factor.net/config 如何在本地使用它们? 工头和dotenv都很容易。或者,编辑您的外壳。 如何在生产中使用它们? 在很大程度上,这取决于。但是对于Rails而言,dotenv是一个轻松的胜利。 平台即服务呢? 任何PaaS都应为您提供一种设置方式。例如Heroku:https://devcenter.heroku.com/articles/config-vars 这是否会使为该项目设立新的开发人员变得更加复杂? 也许,但是值得。您始终可以将.env.sample文件检入带有某些示例数据的源代码管理中。在项目的自述文件中添加关于它的注释。     ,Rails 4.1现在有一个约定。您可以将这些内容存储在secrets.yml中。因此,您最终不会在您的应用程序中分散一些全局ENV调用。 这个yaml文件就像解析的database.yml erb一样,因此您仍然可以在这里使用ENV调用。在这种情况下,您可以将其置于版本控制下,然后将其用作必须使用ENV vars的文档。但是您也可以将其从版本控制中排除,并在其中存储实际机密。在这种情况下,您可以将一些secrets.yml.default或类似内容放入公共存储库中以用于记录。
development: 
   s3_secret: \'foo\'
production: 
   s3_secret: <%= ENV[\'S3_SECRET\']%>
比您可以在
Rails.application.secrets.s3_secret
在本集开始时对其进行了详细讨论     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-