2013-02-25 70 views
1

我讀過一堆其他相關的問題......沒有什麼真的似乎回答我的問題。存儲第三方憑據的Rails ..任何人都知道最佳實踐?

我的應用程序將與幾個不同的第三方網站集成。 (易趣,貝寶,谷歌,亞馬遜...)這是一個產品管理系統,它推動產品遍佈各地...

當然,因爲它與所有這些網站進行交互,它需要用戶名,密碼,令牌..等等。現在我認爲將這些東西保存爲原始文件並不是一個好主意,但我仍然需要能夠將它們保存爲原始文件,以便將它們嵌入到我發送的XML或HTTP標頭中。

有沒有人有關於如何存儲信息的建議?有軌道創業板嗎?

回答

1

Storing in server environment variables是根據Twelve-Factor App方法將證書存儲到數據庫,第三方證書等的最佳實踐。如何存儲它們取決於您使用的是什麼以及如何設置它們。這可以促使信譽不受源控制,不受數據庫限制,不受本地服務器環境的影響。要訪問一個環境變量,你可以使用ENV,如:

ENV['something'] 

擔憂限制和安全性:

對於那些存儲數千或ENV多個密碼/憑據瓦爾,這裏有一些事情要幫助你決定是否要使用它們,在可行性和安全性方面:

  1. 如果正在運行Web應用程序或服務的OS用戶有隻讀到清萊訪問僅適用於應用程序根目錄和子目錄,因此具有對憑證/祕密文件的衆所周知(相對或絕對)路徑的讀取訪問權限,並且開發人員意外地將使用請求參數的服務作爲路徑名的一部分寫入文件讀入返回給客戶端的變量,那麼應用程序的用戶可能會遠程轉儲所有的信用。如果您將這些信用放入一個難以被猜測的操作系統用戶運行應用程序的地方,那麼您將降低成功使用該漏洞的風險來轉儲這些信用。

  2. 您還應該儘可能地在服務器環境之外使用這些證書。這樣,如果他們通過應用程序/服務漏洞轉儲所有證書,但不能在該環境之外使用這些證書,那麼他們的價值就會低得多。

  3. 可以存儲在env變量中的限制可能高於您可能會想到的。例如,在MACOS與,裝RVM這浪費一噸的環境空間使用bash功能等,我是能夠得到4278個53炭化長度creds(例如bcrypt-ED):

test.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

  • 如果你要在你的應用程序服務,可以吐出任何環境變量的值,那麼你顯然不希望存儲creds在ENV瓦爾因爲這將是不太安全,但根據我的經驗,我從來沒有遇到ENV有意暴露(除之外)的開發情況,因爲Java管理控制檯可能會吐出所有系統屬性和環境變量。

  • 如果您將數據存儲在數據庫中,那麼由於SQL注入攻擊通常更爲常見,所以存在更大的風險。這是通常只有密碼哈希存儲在數據庫中而沒有加密其他服務的信用的原因之一。

  • 如果攻擊者登錄到服務器本身並訪問運行Web應用程序/服務的用戶環境,或者可以找到並讀取包含該信用的文件,那麼您運氣不好。

  • +0

    聽起來像你想要的只是一種加密機制:https://www.ruby-toolbox.com/categories/encryption但是,儘可能避免將數據存儲在數據庫中。 SQL注入等比應用程序服務器越來越受到攻擊,從而泄露了信用點,並且在從數據庫向攻擊者提供所有信用之後,他們可能會花費盡可能多的時間和資源需要破解它們。 – 2013-02-25 23:07:01

    +0

    是的..我看不到我自己在應用服務器空間中存儲2500個密碼......感謝加密鏈接.. – baash05 2013-02-25 23:17:47

    +0

    如果您希望能夠像API證書一樣動態更改這些密碼,並且此API需要密碼重置每x天,所以你需要用你的舊密碼來呼叫和終端,獲​​取新密碼並用你擁有的任何密碼/證書進行更新。 Redis的? – Shakes 2015-03-20 10:42:18