GithubとHerokuを使用する場合、機密データはどのように処理されますか?


49

私はまだGitの動作に慣れていません(Linus以外の誰かが;)かどうか疑問に思っています)。

Herokuを使用してアプリケーションをホストする場合、Gitリポジトリでコードをチェックする必要があります。オープンソースプロジェクトで作業している場合、このリポジトリをGithubまたは他のGitホストで共有する可能性が高くなります。

パブリックリポジトリで確認すべきでないものもあります。データベースパスワード、APIキー、証明書など。ただし、これらをコードをHerokuにプッシュするために使用するため、Gitリポジトリの一部である必要があります。

このユースケースの使用方法

注:HerokuまたはPHPFogはサーバー変数を使用してこの問題を回避できることを知っています。私の質問は、コードの一部を「隠す」方法についてです。


3
プライベートリポジトリの使用から始めます。次に、どれだけ信頼しているかに応じて、機密データを含む設定ファイルを.gitignoreし、ローカルでのみバージョン管理します。(ローカルは、社内サーバーであるか、または知っている外部の中央以外の場所である)
リグ

回答:


30

パスワード/ APIキーをherokuで秘密にする好ましい方法は、herokuコマンドラインアプリケーションを使用して設定値を設定することです。Heroku開発センターの記事から抜粋次の例

(以下の例、および私の答えはすべてRailsアプリに関連しています)

$ cd myapp
$ heroku config:add S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190
Adding config vars and restarting myapp... done, v14
S3_KEY:     8N029N81
S3_SECRET:  9s83109d3+583493190

次に、ENV []変数を使用して、コードでこれらの構成値を参照します

AWS::S3::Base.establish_connection!(
  :access_key_id     => ENV['S3_KEY'],
  :secret_access_key => ENV['S3_SECRET']
)

このように、機密パスワードはgitリポジトリに保存されません。(注:アプリをローカルで実行する場合、これらの値を.bashrcファイルに設定します

また、実行しているアプリケーションのタイプはわかりませんが、Railsでは、herokuはdatabase.ymlファイルを使用せず、単にアプリケーションの設定に従ってデータベースのユーザー名/パスワードを設定します。したがって、これらの資格情報をgitに保存することを避けることができます

また、独自のアプリケーションを実行していて、それをプライベートに保ちたい場合、githubに代わる優れた選択肢は、無料のプライベートリポジトリを提供するbitbucketです。


17

いくつかのアイデア...公開キー暗号化が最も柔軟な答えです。

難読化(コードのみ)

非表示にするコードの部分については、それらを別のプロジェクトに配置してコンパイルし、ソースではなくコンパイルされたコードのみをチェックインできますか?これは暗号化ではなく、パスワードまたはキーの暗号化に適していません。コンパイルされたコードをリバースエンジニアリングすることはできますが、ソースを取得することはできません。

プライベートGITリポジトリ

パブリック gitリポジトリである必要がありますか?

サーバーストレージ

この情報を、アプリケーションが実行されるユーザーアカウントのホームディレクトリの保護されたファイルに保存できますか?〜/ .ssh / id_rsaと600のchmodでsshがこれを行う方法をコピーします。それが失敗すると、環境変数を使用できます。何らかの種類のキーを保存するためにサーバー上のどこかが必要です。そうしないと、何も保護できません。

対称暗号化(あなただけに)

あなたが唯一の開発者であれば、サーバーにキーを置き、同じキーをマシンに持ち、対称暗号化スキームを使用してパスワードや証明書などのデータを保護できます。対称キーを友人と共有するのは面倒です。

非対称暗号化(複数の開発者向け)

他の開発者が秘密のことを公開gitリポジトリにチェックインする必要がある場合、この種のことのために公開鍵/秘密鍵(非対称)暗号化が行われました。サーバーに秘密鍵をインストールし(ソース管理にチェックインしないでください!)、そこから公開鍵を生成します。サーバーの公開鍵を使用して秘密データを暗号化します。サーバーのみが、秘密鍵を使用してそのデータを復号化できます。公開キーをソース管理にチェックインして、他の人が同じ公開キーを使用してデータを暗号化し、サーバーのみがそれを解読できるようにすることもできます。

ツール

Opensslは、おそらくあなたが必要とする唯一の暗号化ツールです。独自の暗号化アルゴリズムや公開されたアルゴリズムの独自の実装を作成しないでください。

おわりに

「サーバー」がhttpsを使用するWebサーバーである場合は、秘密キーを保存するための何らかの安全なキーストアがサーバー上にすでに存在している必要があります。この。たぶん、彼らはあなたが直面している課題を他の人がどのように解決するかについてのヒントを持っていますか?


サーバーサイドストレージにWRTを追加するには-Herokuでこれを行うことができるかどうかはわかりませんが、ポスト受信フックや展開サーバー上のCapistranoのようなものからスクリプトが起動されるセットアップを見てきました展開データベースファイルを正しい場所にコピーします。これにより、データベースファイルをレポジトリから完全に排除し、そのような情報がまだ適切であることを保証する自動メカニズムを使用できます。
シャウナ

プライベートGITリポジトリでも、機密データを保護する必要があります。偶然に偶然公開された場合に備えて。また、対称暗号ではなく、非対称暗号を常に使用する必要があると思います。欠点はありませんが、これだけの利点があります。APIをどこかに置いておくと、ハードコーディングされる新しい機密データの暗号化が容易になります。
ティベリウイオヌスタン

7

Herokuでコードを実行する場合は、コードを提供する必要があります。ホスティングプロバイダーから「秘密」に保つことはできません。

パブリックgitリポジトリに関する限り、プロジェクトがオープンソースであるがホスティングの詳細を共有したくない場合は、デプロイメントのためにプロジェクトのプライベートフォークを維持する必要があります。


1
ありがとう、しかしこれのワークフローは何ですか?
ジョナス

6

コードの一部を非表示にしないでください。システムのセキュリティは、コードの機密性に依存すべきではありません。これは「あいまいさによるセキュリティ」として知られていますが、機能が非常に悪いため、セキュリティの専門家に嫌われています。

代わりに、パスワード、暗号キーなどをコードとは別に保管する必要があります。コードによって読み取られる個別の構成ファイルまたは構成値に保存します。それらをgitに保存する必要はありません。

重要:暗号化キー、パスワード、またはその他の秘密をソースコードにハードコーディングしないでください! それは非常に悪い習慣です。

こちらもご覧ください:

プラグ:IT Security.SEは、セキュリティに関する質問をするのに最適な場所です!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.