2011-05-24 93 views
38

我的個人欄目項目使用了一些API,我將API密鑰/祕密存儲在config/environments/production.yml和development.yml中作爲全局變量。我現在想把這個項目推到github上供其他人使用,但我不希望他們擁有那些敏感數據。我也不希望這個文件在.gitignore中,因爲它是運行應用程序所必需的。我曾考慮將它們放在數據庫中,但希望找到更好的解決方案。在公共欄應用程序中存儲敏感數據的位置?

回答

48

TLDR:使用環境變量!

我覺得@布萊斯的comment提供了一個答案,這我就衝出。看起來Heroku recommends的一種方法是使用環境變量來存儲敏感信息(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到它,並設置環境變量的生產主機上,你在你的開發盒子一樣。同時,如果您的生產設置涉及到無法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。適用於任何應用程序,因爲它們都可以獲取環境變量。

+1

這是迄今爲止這裏介紹的最佳解決方案。安全,簡單,有效的跨平臺和高性能。無法要求更多。 – piersadrian 2013-03-18 15:55:14

+2

@yuvilio我有一個後續問題:如何使用Apache2/Phusion Passenger使所述環境變量可訪問在Ubuntu上運行的Ruby on Rails? – 2013-03-20 17:39:51

+1

@YoLudke對於通過Apache引導的應用程序,我會在我的Apache主機文件中使用[SetEnv](http://httpd.apache.org/docs/2.4/mod/mod_env.html#setenv)指令應用程序。例如:'''SetEnv S3_KEY THESECRETKEY''''。環境變量也可以通過ENV全局變量作爲ENV ['S3_KEY']使用。 – yuvilio 2013-03-21 18:29:51

1

他們可能是最好的初始化器(配置/初始化/ api.yaml),雖然我認爲你煮熟了很好。將實際的密鑰添加到.gitignore文件並運行git rm config/environments/production.yml以從您的存儲庫中刪除敏感數據。公平的警告,它會刪除該文件,所以先備份它。

然後,只需在您的實際文件旁邊創建一個config/environments/production.yml.example文件,並附帶相關詳細信息,但省略敏感數據。當你把它拉出來生產時,只需複製沒有.example的文件並替換適當的數據即可。

+0

是的,我聽你的,但是說,我試圖找到一個解決方案不涉及從存儲庫中刪除這些文件。 – tybro0103 2011-05-24 16:03:09

+0

出於興趣,爲什麼?你是在部署到heroku還是類似的地方,它不會輕易讓你直接將文件複製到服務器上? – 2011-05-24 16:34:53

+0

是的。那個,我希望其他人能夠儘可能簡單地讓我的代碼運行。 – tybro0103 2011-05-24 16:49:40

3

這個怎麼樣...

創建一個新項目,並在production.yml和development.yml文件佔位符值檢查到GitHub上。

更新.gitignore以包含production.yml和development.yml。

用你的祕密替換佔位符值。

現在你可以檢查你的代碼到GitHub中而不會影響你的祕密。

而且任何人都可以克隆你的回購沒有任何額外的步驟來創建丟失的文件(象你那樣他們就會替換佔位符值)。

這是否符合您的目標?

+0

不是真的,因爲那麼當我向需要的那些文件添加東西時會發生什麼向其他存儲庫發展? – tybro0103 2011-05-24 20:12:30

+0

如果這不會經常發生,只需恢復佔位符值,從.gitignore中刪除該行,使用更改提交給GitHub,編輯文件以恢復您的祕密並編輯.gitignore以再次隱藏您的祕密。可能有更聰明的解決方案,但這種方法很簡單。 – 2011-05-24 20:59:13

1

使用環境變量。

在Ruby中,他們訪問像這樣:

ENV['S3_SECRET'] 

兩個原因:

  1. 值將不進源控制。
  2. 無論如何,「敏感數據」aka密碼往往會根據環境變化。例如您應該使用不同的S3憑證進行開發與生產。

這是最佳做法嗎?
是:http://12factor.net/config

如何使用他們在本地?
foremandotenv都很容易。或者,編輯您的shell

如何在生產中使用它們?
很大程度上,這取決於。但對於Rails,dotenv是一個簡單的勝利。

平臺即服務呢?
任何PaaS應該給你一個方法來設置它們。 Heroku例如:https://devcenter.heroku.com/articles/config-vars

這不會讓這個項目的新開發人員變得更加複雜嗎?
也許,但它是值得的。您可以隨時使用一些示例數據將.env.sample文件檢入到源代碼控制中。將關於它的註釋添加到項目的自述文件中。

1

Rails 4.1現在有一個約定。你將這些東西存儲在secrets.yml中。所以你最終不會在你的應用程序中散佈一些全局的ENV調用。

這個yaml文件就像database.yml erb解析過的,所以你仍然可以在這裏使用ENV調用。在這種情況下,您可以將其置於版本控制之下,然後將其用作ENV變量必須使用的文檔。但是你也可以將它從版本控制中解放出來並將實際的祕密存儲在那裏。在這種情況下,您會將一些secrets.yml.default或類似的東西放入公共回購站中以用於文檔目的。

development: 
    s3_secret: 'foo' 
production: 
    s3_secret: <%= ENV['S3_SECRET']%> 

比你能this情節初下了詳細的討論

Rails.application.secrets.s3_secret 

其訪問這個東西

+0

是的,這是最好的方法....因此是最好的答案。 :) – 2014-12-27 11:16:04