我已经阅读了一堆其他相关的问题......似乎没有什么能真正回答我的问题。
我的应用程序将与几个不同的第三方站点集成。(ebay、paypal、google、amazon...)它是一个产品管理系统,它将产品推送到各个地方...
当然,由于它与所有这些站点交互,它需要用户名、密码、令牌……等等……现在我认为将这些东西原始存储并不是一个好主意,但我仍然需要能够将它们原始存储,所以我可以将它们嵌入到我发送的 XML 或 HTTP 标头中。
有人对如何存储信息有建议吗?有轨道 GEM 吗?
我已经阅读了一堆其他相关的问题......似乎没有什么能真正回答我的问题。
我的应用程序将与几个不同的第三方站点集成。(ebay、paypal、google、amazon...)它是一个产品管理系统,它将产品推送到各个地方...
当然,由于它与所有这些站点交互,它需要用户名、密码、令牌……等等……现在我认为将这些东西原始存储并不是一个好主意,但我仍然需要能够将它们原始存储,所以我可以将它们嵌入到我发送的 XML 或 HTTP 标头中。
有人对如何存储信息有建议吗?有轨道 GEM 吗?
根据Twelve-Factor App方法,存储在服务器环境变量中是将凭据存储到数据库、第三方凭据等的最佳实践。如何存储它们取决于您使用的内容以及您的设置方式。这有助于使凭据不受源代码控制、数据库和服务器环境本地的影响。要访问环境变量,您可以使用ENV
,例如:
ENV['something']
关于限制和安全性的担忧:
对于那些在 env vars 中存储数千个或更多密码/凭据的人,从可行性和安全性的角度来看,这里有一些事情可以帮助您决定是否使用它们:
如果运行 Web 应用程序或服务的操作系统用户仅对 Rails 应用程序根目录和子目录具有只读访问权限,因此对凭据/机密文件的众所周知(相对或绝对)路径具有读取访问权限,并且开发人员不小心编写了一项服务,该服务使用请求参数作为路径名的一部分,将文件读取到返回给客户端的变量中,然后该应用程序的用户可能会远程转储您的所有凭据。如果您将这些凭据放在运行应用程序的操作系统用户不太容易访问的位置,该路径名不容易猜到,您将降低该漏洞被成功用于转储这些凭据的风险。
您还应该尽您所能,使在服务器环境之外使用这些凭据变得更加困难。这样,如果他们通过应用程序/服务漏洞转储所有凭据,但不能在该环境之外使用这些凭据,那么它们的价值就会大大降低。
环境变量中可以存储多少的限制可能比您想象的要高。例如,在加载了 RVM 的 macOS 中,使用 bash 函数等浪费了大量的环境空间,我能够获得 4278 个 53 字符长度的凭据(例如 bcrypt-ed):
测试.sh
#!/bin/bash
set -ev
for i in `seq 1 4278`;
do
export CRED$i='...........................................'
done
ruby -e 'puts "#{ENV.size} env vars in Ruby. First cred=#{ENV["CRED1"]}"'
输出:
$ time ./test.sh
for i in `seq 1 4278`;
do
export CRED$i='...........................................'
done
seq 1 4278
ruby -e 'puts "#{ENV.size} env vars in Ruby. First cred=#{ENV["CRED1"]}"'
4319 env vars in Ruby. First cred=...........................................
real 0m0.342s
user 0m0.297s
sys 0m0.019s
当我超过那个时,我得到了ruby: Argument list too long
。
如果您的应用程序中有一个可以吐出任何环境变量值的服务,那么您显然不想将凭据存储在 env vars 中,因为它会不太安全,但根据我的经验,我从未遇到过开发故意暴露 ENV 的情况,除了可能吐出所有系统属性和环境变量的 Java 管理控制台之类的东西。
如果您将凭据存储在数据库中,您将面临更大的风险,因为 SQL 注入攻击通常更为常见。这是通常只有密码哈希值存储在数据库中而不是加密其他服务的凭据的原因之一。
如果攻击者登录到服务器本身并可以访问运行 Web 应用程序/服务的用户的环境,或者可以找到并读取包含凭据的文件,那么你就不走运了。