如何在ruby客户端脚本中安全地存储身份验证凭据?

时间:2019-01-20 05:10:44

标签: ruby encryption passwords centos7

如果这与其他许多问题过于相似,我深表歉意。我搜索并查看了建议的多种解决方案,但似乎没有针对此类问题的通用解决方案-根据回答的问题判断,在不同环境中的同一问题似乎需要非常不同的解决方案。

我构建了几个Ruby客户端脚本,这些脚本从网络中的各种服务器收集信息,并将这些信息注入MySQL数据库。 Ruby脚本必须以用户身份验证这些服务器,因此它们需要身份验证凭据才能连接。有问题的连接是从Ruby客户端到接收服务器,并分别通过:

SOAP(通过savon gem):

soap_client = Savon.client(wsdl: '[URL]')
login_response = soap_client.call(:login, message: { 'userName' => [SOAP CLIENT USERNAME], 'password' => [SOAP CLIENT PASSWORD] })

MySQL(通过mysql2 gem):

@mysql_client = Mysql2::Client.new(:host => [DATABASE HOSTNAME], :username => [DATABASE USERNAME], :password => [DATABASE PASSWORD], :database => [DATABASE NAME])

HTTPS(通过net / https gem):

OpenSSL::PKey::RSA.new(pem,"[KEY DECRYPTION PASSWORD]")

HTTPS客户端不需要用户名/密码即可验证HTTPS服务器。它需要带有密钥的证书,并且解密密钥需要存储在源代码中的密码。我可以将密钥存储在明文中,从而从源代码中删除此密码,但是安全问题就变成了如何保护明文密钥文件。

我要解决的问题是我的源代码中存储了明文密码。我可以将密码存储在一个加密的文本文件中,然后在运行时对该文件进行解密,但是又回到了类似的问题-如何安全地存储解密密钥?

环境是:

  • CentOS Linux 7.6.1810
  • 红宝石2.4.2

感谢您阅读,如果我的问题需要进一步澄清,请告诉我!

1 个答案:

答案 0 :(得分:1)

这是我们如何处理脚本所需的机密信息:

源代码控制:

  1. 我们从不在源代码中存储敏感信息。

发展:

  1. 任何脚本所需的所有敏感信息都来自环境变量(因此,在Ruby中:public Graphics Graphic { get; set; } //Element to draw on SomeMethod() { Symbol = new Bitmap("C:/Test.JPG"); Position = new Point(100, 300); Graphic.DrawImage(Symbol, Position); //Here I want to somehow add the ToolTip to the image }
  2. 所有开发人员都安装了direnv,并且每个人在项目文件夹中都有一个some_password = ENV['SOME_PASSWORD']文件,用于设置其个人密码和其他机密。
  3. 我们通过向.envrc添加全局gitignore(全局=不是每个项目,而是每个环境)来确保.envrc从未致力于源代码控制。

测试/ CI:

  1. 所有CI系统都支持输入环境变量,因此这是解决此用例的方法

生产:

  1. 取决于您的生产基础结构,这些环境变量和机密也会在部署时输入。