Как защитить пароли базы данных в PHP?

Когда приложение PHP создает соединение с базой данных, конечно, обычно требуется передать логин и пароль. Если я использую единственный доступ для минимального разрешения для своего приложения, тогда PHP должен знать где-то этот логин и пароль. Каков наилучший способ защитить этот пароль? Похоже, что просто писать его в PHP-код – не очень хорошая идея.

Несколько человек неправильно понимают это как вопрос о том, как хранить пароли в базе данных. Это не правильно. Речь идет о том, как сохранить пароль, который позволяет получить доступ к базе данных.

Обычным решением является переход пароля из исходного кода в файл конфигурации. Затем оставьте администрирование и сохраните файл конфигурации до системных администраторов. Таким образом, разработчикам не нужно ничего знать о производственных паролях, и в вашем источнике-источнике нет записи пароля.

Если вы размещаете на чужом сервере и не имеете доступа к вашему веб-сайту, вы всегда можете поместить свой пароль и / или соединение с базой данных в файл, а затем заблокировать файл с помощью .htaccess:

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

Храните их в файле вне веб-корня.

Самый безопасный способ – не иметь информацию, указанную в вашем 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")); 

Для чрезвычайно безопасных систем мы шифруем пароль базы данных в файле конфигурации (который сам защищен системным администратором). При запуске приложения / сервера приложение затем запрашивает системный администратор для ключа дешифрования. Затем пароль базы данных считывается из файла конфигурации, дешифруется и сохраняется в памяти для будущего использования. Все еще не на 100% безопаснее, так как он хранится в дешифрованной памяти, но вы должны называть его «достаточно безопасным» в какой-то момент!

Это решение является общим, поскольку оно полезно как для открытых, так и для закрытых исходных приложений.

  1. Создайте пользователя ОС для своего приложения. См. http://en.wikipedia.org/wiki/Principle_of_least_privilege
  2. Создайте переменную среды (несезонной) ОС для этого пользователя с паролем
  3. Запуск приложения в качестве этого пользователя

Преимущества:

  1. Вы не будете проверять свои пароли в исходном контроле случайно, потому что вы не можете
  2. Вы случайно не испортите права доступа к файлам. Ну, возможно, но это не повлияет на это.
  3. Может быть прочитан только root или этим пользователем. Root может читать все ваши файлы и ключи шифрования в любом случае.
  4. Если вы используете шифрование, как безопасно хранить ключ?
  5. Работает x-платформа
  6. Обязательно не передавайте envvar ненадежным дочерним процессам

Этот метод предложен Хероку, который очень успешный.

если возможно создать соединение с базой данных в том же файле, где хранятся учетные данные. Ввести учетные данные в инструкции 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); в include("/outside-webroot/db_settings.php"); mysql_connect("localhost", $db_user, $db_pass); unset ($db_user, $db_pass); 

Ваш выбор ограничен, так как вы говорите, что вам нужен пароль для доступа к базе данных. Один общий подход заключается в том, чтобы сохранить имя пользователя и пароль в отдельном файле конфигурации, а не в главном скрипте. Затем обязательно сохраните это за пределами основного веб-дерева. Это было, если есть проблема с веб-конфигурацией, которая оставляет ваши php-файлы просто отображаемыми в виде текста, а не исполняемыми, вы не указали пароль.

Помимо этого вы находитесь на правильных строках с минимальным доступом к используемой учетной записи. Добавьте к этому

  • Не используйте комбинацию имени пользователя и пароля для чего-либо еще
  • Настройте сервер базы данных только для приема соединений с веб-узла для этого пользователя (локальный хост еще лучше, если БД находится на одном компьютере) Таким образом, даже если учетные данные отображаются, они никому не нужны, если у них нет другого доступа к машина.
  • Обфускание пароля (даже ROT13 будет делать), он не будет много защищать, если кто-то получает доступ к файлу, но, по крайней мере, это предотвратит его случайный просмотр.

Питер

Поместите пароль базы данных в файл, сделайте его доступным только для чтения для пользователя, обслуживающего файлы.

Если у вас нет средств, позволяющих процессу php-сервера обращаться к базе данных, это почти все, что вы можете сделать.

Если вы используете PostgreSQL, то он автоматически просматривает ~/.pgpass для паролей. Дополнительную информацию см. В руководстве .

Я думаю, что OP означает пароль базы данных.

Если кто-то не получает доступ к вашему серверу через FTP или SSH (в этом случае вы уже перегружены), я бы не стал беспокоиться о сохранении паролей в открытом тексте в файлах PHP. Большинство приложений PHP, которые я видел, делают так, например phpbb.

Если вы говорите о пароле базы данных, в отличие от пароля, поступающего из браузера, стандартная практика, похоже, заключается в том, чтобы поместить пароль базы данных в файл конфигурации PHP на сервере.

Вы просто должны быть уверены, что файл php, содержащий пароль, имеет соответствующие разрешения на него. Т.е. он должен быть доступен только для веб-сервера и вашей учетной записи пользователя.

Дополнительный трюк заключается в использовании отдельного файла конфигурации PHP, который выглядит следующим образом:

 <?php exit() ?> [...] Plain text data including password 

Это не мешает вам правильно устанавливать правила доступа. Но в случае взлома вашего веб-сайта «требуется» или «включить» просто выйдет из сценария на первой строке, поэтому получить данные еще сложнее.

Тем не менее, никогда не позволяйте конфигурационным файлам в каталоге, доступ к которому можно получить через Интернет. У вас должна быть папка «Веб», содержащая код вашего контроллера, css, картинки и js. Это все. Все остальное идет в автономных папках.

Лучший способ – не хранить пароль вообще!
Например, если вы находитесь в системе Windows и подключаетесь к SQL Server, вы можете использовать встроенную проверку подлинности для подключения к базе данных без пароля, используя идентификатор текущего процесса.

Если вам нужно подключиться к паролю, сначала зашифруйте его, используя сильное шифрование (например, используя AES-256, а затем защитите ключ шифрования или используя асимметричное шифрование и предоставьте ОС защиту сертификата), а затем сохраните его в файл конфигурации (вне веб-каталога) с сильными списками ACL .

Просто поместить его в конфигурационный файл где-то так, как это обычно делается. Просто убедитесь, что вы:

  1. запретить доступ к базе данных с любых серверов за пределами вашей сети,
  2. позаботьтесь о том, чтобы случайно не показывать пароль пользователям (в сообщении об ошибке или через файлы PHP, случайно выполняемые как HTML и т. д.).

Раньше мы сохраняли DB user / pass в файле конфигурации, но с тех пор попадали в параноидальный режим – применяя политику Defence in Depth .

Если ваше приложение скомпрометировано, пользователь получит доступ к вашему конфигурационному файлу и поэтому существует вероятность того, что взломщик сможет прочитать эту информацию. Файлы конфигурации также могут попасть в управление версиями или скопировать серверы.

Мы переключились на сохранение пользовательских / pass в переменных среды, установленных в Apache VirtualHost. Эта конфигурация читается только с помощью root – надеюсь, ваш пользователь Apache не работает как root.

Кон с этим является то, что теперь пароль находится в глобальной переменной PHP.

Чтобы смягчить этот риск, мы имеем следующие меры предосторожности:

  • Пароль зашифрован. Мы расширяем класс PDO, чтобы включить логику для дешифрования пароля. Если кто-то читает код, где мы устанавливаем соединение, не будет очевидно, что соединение устанавливается с зашифрованным паролем, а не с самим паролем.
  • Зашифрованный пароль перемещается из глобальных переменных в закрытую переменную . Приложение делает это немедленно, чтобы уменьшить окно, доступное в глобальном пространстве.
  • phpinfo() отключен. PHPInfo – это легкая цель получить обзор всего, включая переменные среды.

Мы решили это так:

  1. Используйте memcache на сервере, с открытым подключением с другого сервера паролей.
  2. Сохраните в memcache пароль (или даже весь файл password.php, зашифрованный), а также ключ дешифрования.
  3. Веб-сайт вызывает ключ memcache, содержащий парольную фразу парольного файла и дешифрует в памяти все пароли.
  4. Сервер паролей отправляет новый зашифрованный файл паролей каждые 5 минут.
  5. Если вы используете зашифрованный пароль.php в своем проекте, вы отправляете аудит, который проверяет, был ли этот файл тронут внешне – или просмотрен. Когда это произойдет, вы автоматически можете очистить память, а также закрыть сервер для доступа.