web-dev-qa-db-ja.com

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

私はまだGitの動作に慣れていません(そして、Linus以外の誰かが;)と思います)。

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

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

このユースケースでの作業方法

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

50
Jonas

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

(以下の例と私の全体の答えはRails apps)に関連しています)

$ 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ファイル

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

また、独自のアプリケーションを実行していて、それを非公開のままにしたい場合は、githubに代わる優れた方法が bitbucket で、無料の非公開リポジトリを提供します。

30
Mike Vormwald

いくつかのアイデア...公開鍵暗号は最も柔軟な答えです。

難読化(コードのみ)

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

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

public gitリポジトリである必要がありますか?

サーバーストレージ

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

対称暗号化(ちょうどあなたのために)

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

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

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

ツール

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

終わりに

「サーバー」がhttpsを使用するWebサーバーである場合、サーバーに秘密鍵を保存するための何らかの安全なキーストアがすでにあるはずです。ホスティング会社は、この。多分彼らは他の人があなたが直面している課題をどのように解決するかについていくつかのヒントを持っていますか?

17
GlenPeterson

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

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

7
Richard Nichols

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

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

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

以下も参照してください。

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

6
D.W.