web-dev-qa-db-ja.com

構成ファイルにパスワードを(プレーンテキストではなく)環境変数として保存することは安全ですか?

Railsでいくつかのアプリに取り組んでおり、Django(そして少しのphp)で、そのうちいくつかを始めたのは環境変数としてデータベースや他のパスワードを保存することです特定の設定ファイル(またはsettings.pyでDjangoアプリ)のプレーンテキストではなく)。

私の共同研究者の一人とこれを議論する際に、彼はこれが貧弱なプラクティスであると示唆しました。おそらくこれは、最初に思われるほど完全に安全ではないかもしれません。

だから、私は知りたい-これは安全な習慣ですか?これらのファイルにパスワードをプレーンテキストとして保存する方が安全ですか(もちろん、これらのファイルを公開リポジトリなどに残さないようにしてください)。

82
jay

より理論的なレベルでは、セキュリティのレベルを次のように(強度の順に)考える傾向があります。

  • セキュリティなし。プレーンテキスト。どこを見るべきかを知っている人は誰でもデータにアクセスできます。
  • 難読化によるセキュリティ。データ(プレーンテキスト)は、環境変数のようにトリッキーな場所、または構成ファイルのように見えるファイルに保存します。攻撃者は最終的に何が起こっているのかを把握するか、それを偶然見つけます。
  • 簡単に破れる暗号化によって提供されるセキュリティ(シーザー暗号を考えてください!)。
  • 暗号化によって提供されるセキュリティで、ある程度の努力で破ることができます。
  • 現在のハードウェアを破壊するのは実用的ではない暗号化によって提供されるセキュリティ。
  • 最も安全なシステムは、誰も使用できないものです! :)

環境変数は、揮発性/使い捨てであり、保存されていないため、プレーンテキストファイルよりmore安全です。つまり、「set pwd = whatever」などのローカル環境変数のみを設定し、スクリプトの最後でコマンドシェルを終了するものを使用してスクリプトを実行すると、変数は存在しなくなります。あなたのケースは最初の2つに分類されますが、これはかなり安全ではないと思います。これを行う場合は、直接のイントラネット/ホームネットワークの外部に展開することはお勧めできません。テスト目的でのみ使用してください。

33
John Carter

前述のように、両方の方法は、システムが危険にさらされると、追加の「セキュリティ」のレイヤーを提供しません。 環境変数を優先する最も強力な理由の1つはバージョン管理だと思います:他のすべての開発者が確認できるように、GITなどのバージョン管理システムに誤って格納されているデータベース構成などが多すぎるのを見てきました(そして、おっと!それは私にも起こりました...)。

パスワードをファイルに保存しないと、バージョン管理システムにパスワードを保存できなくなります。

51
emrass

パスワードを保存する必要があるときはいつでも、それは安全ではありません。期間。暗号化されていないパスワードを安全に保存する方法はありません。環境変数と設定ファイルのどちらがより「安全」であるかは、おそらく議論の余地があります。私見、あなたのシステムが危険にさらされている場合、それが保存されている場所は本当に重要ではありません、勤勉なハッカーはそれを追跡することができます。

38
Chris Pratt

コメントするのに十分な担当者がいませんでしたが、注意しないと、シェルがコマンド履歴でもそのパスワードをキャプチャする可能性があることを追加したかったのです。したがって、$ pwd=mypassword my_prog手動では、期待したほど短命ではありません。

23
brianclements

脅威モデルによって異なります。

ユーザーが忘れて誤った取り扱いをされる可能性のあるファイルシステム全体にパスワードを振りかけないようにしていますか?その場合、環境変数はファイルよりも持続性が低いため、はい。

あなたのプログラムを直接標的にしている悪意のあるものから保護しようとしていますか?その場合、環境変数にはファイルと同じレベルのアクセス制御がないため、いいえ。

個人的には、怠慢なユーザーはやる気のある敵よりも一般的だと思うので、環境変数アプローチを採用します。

可能であれば、環境変数としてではなく、gitignoredファイルに資格情報を保存する必要があると思います。

ENV(環境)変数とファイルに資格情報を保存する際に考慮すべきことの1つは、使用するライブラリまたは依存関係によってENV変数を非常に簡単に検査できることです。

これは悪意を持って行われる場合とそうでない場合があります。たとえば、ライブラリ作成者は、デバッグのためにスタックトレースとENV変数を自分自身にメールで送信できます(ベストプラクティスではありませんが、実行することは可能です)。

資格情報がファイル内にある場合、それらにアクセスするのははるかに困難です。

具体的には、ノード内のnpmについて考えます。 ENVにある場合にnpmが資格情報を確認するには、process.ENV。一方、ファイル内にある場合は、さらに多くの作業が必要です。

資格情報ファイルがバージョン管理されているかどうかは、別の質問です。資格情報ファイルをバージョン管理しないと、より少ない人にしか公開されません。すべての開発者が本番資格情報を知る必要はありません。これは最小限の特権の原則に従っているため、資格情報ファイルを無視してgitを使用することをお勧めします。

1
Peter Ajtai