web-dev-qa-db-ja.com

env変数に保存された安全なデータベースパスワード

DBにアクセスするには、本番環境のどこかに自分のDBパスワードを保存する必要があります。現在、prodシステムはクラウドにデプロイされており、DBも同様です。パスワード、ユーザー名、その他の機密情報は、環境変数としてプレーンテキストで本番マシンに保存されます。

少し見回すと、ほとんどの解決策は、これらの種類の機密データ(システムの管理者にのみ許可されたアクセス権を持つファイルに保存すること)へのアクセスと、DB自体へのアクセスを制限することです。 (固定IPのみにアクセスを制限することにより)。
残念ながら、この場合、いくつかの理由でこれらのいずれも実行できません。システムをホストするサービスでは、IPを使用できません(そのため、DBを1つのIPからのみアクセスできるように設定できません)。配備上の理由から、DB資格情報は環境変数に残しておく必要があります。

一方、DBには実際には機密データが含まれておらず、より一般的には、現時点では、外部のハッカーによる攻撃ではなく、内部の人が本番DBを通過してダメージを与えないことがほとんどの場合心配されています。

だから私の質問は、この場合の「かなり安全な解決策」は何でしょうか?

DBのパスワードを暗号化してから、復号化キーをGitHubにアップロードされた設定ファイルに この手順 で暗号化して保存することは安全なソリューションでしょうか(少し古く見えますが)?

これは非常に簡単で人気のあるトピックだと思いましたが、「TODOリスト」のような回答があまりないようで、明らかに間違っていました。

15
bncc

Webサーバーを独自のユーザーとして実行すると仮定すると、rootとそのユーザーのみがOS環境変数を読み取ることができます†。 30年前のAIXか何かを使っているのでなければ。 Windowsでも環境変数を保護します。

値を暗号化する場合、どのようにキーを保護しますか?キーは、ユーザーまたはrootも読み取ることができます。

値をファイルに保存する場合、envvarよりも安全ですか?そうではありません。 envvarは、誤ってパスワードをソース管理に入れないという点でより安全です。

†これはコマンドラインオプションには適用されません。
‡あなたはHSMを購入するつもりです。 HSMは引き続きrootまたはユーザーがsedにすることができます

7
Neil McGuigan

安全な方法で秘密情報を保存および配布する方法が必要です。考えられる解決策の1つはVaultです: http://vaultproject.io/

「デプロイメントの理由でDB資格情報を環境変数に残しておく必要がある」とはどういう意味かわかりませんが、その前提を再考する必要があるかもしれません。実際にそうであることが判明した場合でも、実行時にVaultのようなものを使用してDBパスワードを環境変数にロードし、暗号化されずにディスク上に存在しないようにすることができます。しかし、それを環境変数にまったく保存しないか、少なくともグローバル変数には保存しないことを検討してください。

4
Nathan