web-dev-qa-db-ja.com

PHPでデータベースパスワードを保護するにはどうすればいいですか?

PHPアプリケーションがデータベース接続を確立するとき、もちろん一般にログインとパスワードを渡す必要があります。自分のアプリケーションに最低限必要なログインを1つだけ使用している場合、PHPはそのログインとパスワードをどこかに知っている必要があります。そのパスワードを保護するための最善の方法は何ですか? PHPコードで記述するだけではお勧めできません。

383
user18359

何人かの人々はこれをデータベースにstoreパスワードにする方法についての質問として誤解しています。それは間違いです。それはあなたがデータベースを得ることを可能にするパスワードを保存する方法についてです。

通常の解決策は、パスワードをソースコードから設定ファイルに移動することです。それから管理を任せ、その設定ファイルのセキュリティをシステム管理者に任せます。そのため開発者は本番用パスワードについて何も知る必要がなく、ソース管理にパスワードの記録もありません。

225
user11318

あなたが他の誰かのサーバーでホストしていて、あなたのウェブルートの外にアクセスできない場合は、あなたはいつでもあなたのパスワードやデータベース接続をファイルに入れて、それから.htaccessを使ってファイルをロックすることができます:

<files mypasswdfile>
order allow,deny
deny from all
</files>
99
kellen

最も安全な方法は、PHPコードで指定されている情報をまったく使用しないことです。

Apacheを使用している場合は、httpd.confまたは仮想ホストファイルファイルに接続詳細を設定することを意味します。そうしておけば、パラメータなしでmysql_connect()を呼び出すことができます。つまり、PHPは自分の情報を出力しません。

これらのファイルでこれらの値を指定する方法は次のとおりです。

php_value mysql.default.user      myusername
php_value mysql.default.password  mypassword
php_value mysql.default.Host      server

それから、次のようにMySQL接続を開きます。

<?php
$db = mysqli_connect();

またはこのように:

<?php
$db = mysqli_connect(ini_get("mysql.default.user"),
                     ini_get("mysql.default.password"),
                     ini_get("mysql.default.Host"));
41
Lars Nyström

Webルート以外のファイルに保存してください。

39
da5id

非常に安全なシステムでは、データベースパスワードを設定ファイルで暗号化します(これ自体はシステム管理者によって保護されています)。アプリケーション/サーバーの起動時に、アプリケーションはシステム管理者に復号化キーを要求します。その後、データベースパスワードは設定ファイルから読み取られ、復号化されて、将来の使用に備えてメモリに保存されます。復号化されたメモリに保存されているので、まだ100%安全というわけではありませんが、ある時点で「十分に安全」と呼ぶ必要があります。

34
pdavis

この解決策は、オープンソースアプリケーションとクローズドソースアプリケーションの両方に役立つという点で一般的です。

  1. アプリケーション用のOSユーザーを作成します。 http://en.wikipedia.org/wiki/Principle_of_least_privilege を参照してください。
  2. パスワードを使用して、そのユーザー用の(セッション以外の)OS環境変数を作成します。
  3. そのユーザーとしてアプリケーションを実行します。

利点:

  1. パスワードを誤ってソース管理にチェックインすることはありません。
  2. あなたが誤ってファイル許可を台無しにすることはありません。そうかもしれませんが、影響はありません。
  3. Rootまたはそのユーザーだけが読むことができます。とにかくルートはあなたのすべてのファイルと暗号化キーを読むことができます。
  4. 暗号化を使用している場合、キーを安全に保管していますか?
  5. Works x-platform
  6. Envvarを信頼できない子プロセスに渡さないでください。

この方法はHerokuによって提案されています。

14
Neil McGuigan

資格情報が格納されているのと同じファイルにデータベース接続を作成できる場合。 connectステートメントで資格情報をインライン化します。

mysql_connect("localhost", "me", "mypass");

それ以外の場合は、connectステートメントの後に信任状を設定解除するのが最善です。なぜなら、メモリー内にない信任状は メモリーからの読み取り ;)にはなれないからです。

include("/outside-webroot/db_settings.php");  
mysql_connect("localhost", $db_user, $db_pass);  
unset ($db_user, $db_pass);  
10
Bob Fanger

データベースにアクセスするにはパスワードが必要だと言うので、選択肢は限られています。一般的な方法の1つは、メインスクリプトではなく、ユーザー名とパスワードを別々の設定ファイルに保存することです。それからそれをメインのWebツリーの外に保存してください。あなたのphpファイルが実行されるのではなく単にテキストとして表示されたままになるというWeb設定の問題があるなら、それはあなたがパスワードを露出していないということでした。

それ以外のあなたは使用されているアカウントへの最小限のアクセスで正しい行にいます。それに追加

  • ユーザー名とパスワードの組み合わせを他の目的に使用しないでください。
  • そのユーザーのWebホストからの接続のみを受け入れるようにデータベースサーバーを構成します(localhostはDBが同じマシン上にある場合はさらに優れています)。機械。
  • パスワードを難読化すると(ROT13でも可能ですが)、ファイルにアクセスしたとしてもそれほど多くの防御は行われませんが、少なくともそれを不用意に表示することはできません。

ピーター

7
Vagnerr

PostgreSQLを使用している場合は、~/.pgpass内でパスワードを自動的に検索します。詳しくは マニュアル を参照してください。

7
Jim

以前はDB user/passを設定ファイルに保存していましたが、それ以来、偏執的モードを打ちました - Defense in Depthの方針を採用しました。

あなたのアプリケーションが危険にさらされている場合、ユーザはあなたの設定ファイルへの読み取りアクセス権を持つことになるので、この情報を読むクラッカーの可能性があります。設定ファイルはバージョン管理に巻き込まれたり、サーバーにコピーされたりすることもあります。

Apache VirtualHostで設定された環境変数にuser/passを格納するように切り替えました。この設定はrootだけが読むことができます - おそらくあなたのApacheユーザーはrootとして実行されていません。

これとの矛盾は、パスワードがGlobal PHP変数に入っていることです。

このリスクを軽減するために、以下の予防策があります。

  • パスワードは暗号化されています。パスワードを復号化するためのロジックを含むようにPDOクラスを拡張します。誰かが接続を確立したコードを読んだとしても、パスワード自体ではなく暗号化されたパスワードで接続が確立されていることは明らかではありません。
  • 暗号化されたパスワードはグローバル変数からプライベート変数に移動されますアプリケーションは値がグローバルスペースで利用可能であるというウィンドウを減らすために直ちにこれを行います。
  • phpinfo()は無効になっています。 PHPInfoは、環境変数を含むすべての概要を把握するための簡単なターゲットです。
5
Courtney Miles

データベースのパスワードをファイルに入れ、ファイルを提供するユーザーには読み取り専用にします。

Phpサーバープロセスがデータベースにアクセスすることだけを許可する何らかの手段がない限り、これはあなたができるほとんどすべてです。

5
Chris

ブラウザからのパスワードではなく、データベースのパスワードについて話しているのであれば、標準的なやり方ではデータベースのパスワードをサーバ上のPHP configファイルに入れることです。

パスワードを含むphpファイルに適切な権限があることを確認する必要があります。すなわちWebサーバーとあなたのユーザーアカウントからしか読めないはずです。

4
Jason Wadsworth

このようにして解決しました。

  1. 他のパスワードサーバーからのオープン接続で、サーバー上でmemcacheを使用します。
  2. パスワード(または暗号化されたすべてのpassword.phpファイル)と復号化キーをmemcacheに保存します。
  3. Webサイトは、パスワードファイルのパスフレーズを保持しているmemcacheキーを呼び出し、メモリ内のすべてのパスワードを復号化します。
  4. パスワードサーバは5分ごとに新しい暗号化パスワードファイルを送信します。
  5. あなたのプロジェクトで暗号化されたpassword.phpを使っているなら、あなたは監査をして、このファイルが外部から触れられたのか、あるいは見られたのかをチェックします。これが起こると、あなたは自動的にメモリをきれいにすることができるだけでなく、アクセスのためにサーバを閉じることができます。
3
Asi Azulay

追加のトリックは、次のようなPHP個別の設定ファイルを使用することです。

<?php exit() ?>

[...]

Plain text data including password

これはアクセス規則を適切に設定することを妨げません。しかし、あなたのWebサイトがハッキングされた場合、 "require"または "include"は最初の行でスクリプトを終了するだけなので、データを取得することはさらに困難です。

それにもかかわらず、Web経由でアクセスできるディレクトリに設定ファイルを置かないでください。あなたはあなたのコントロールコード、css、写真そしてjsを含む "Web"フォルダを持つべきです。それで全部です。それ以外はオフラインフォルダに入ります。

3
e-satis

最善の方法は、パスワードをまったく保存しないことです。
たとえば、Windowsシステムを使用していてSQL Serverに接続している場合は、現在のプロセスのIDを使用して、統合認証を使用してパスワードなしでデータベースに接続できます。

パスワードで接続する必要がある場合は、まずencryptそれを使用して、強力な暗号化(AES-256を使用してから暗号化キーを保護する、または非対称暗号化を使用してOSに証明書を保護させる)を使用します。その後、強いACLを使用して(Webディレクトリの外側の)構成ファイルに保存します。

3
AviD

それを設定ファイルのどこかに置くだけで、普通に行われます。ちょうどあなたを確認してください:

  1. ネットワーク外のサーバーからのデータベースアクセスを禁止する
  2. 誤ってパスワードをユーザーに表示しないように注意してください(エラーメッセージ、または誤ってHTMLとして扱われているPHPファイルなどを介して)。
3
Marijn