Как не выставлять производственные учетные данные БД другим разработчикам? - PullRequest
0 голосов
/ 22 ноября 2018

В PHP-приложении, которое я пишу, я не хотел бы предоставлять учетные данные рабочей БД другим разработчикам.

Я прочитал несколько вопросов и ответов здесь, на SO, например, в следующей ветке есть много интересных мыслей относительнотема:

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

Я решил, что хочу переместить учетные данные в файл за пределы корня приложения.Предположим, что я использую PDO и что в своем контейнере приложения я создаю свой экземпляр PDO:

<?php

// ...
require_once __DIR__ . '/../db_pdo_outside_document_root.php';

$containerConfig = [
   'db_connection' => function() {
      return new PDO(DB_PDO_DSN, DB_PDO_USER, DB_PDO_PASSWD, DB_PDO_OPTIONS);
   }
];
$appContainer = new ApplicationContainer($containerConfig);

// Use the container and handle the request...

Константы DB_PDO_*, передаваемые конструктору PDO, все берутся из файла db_pdo_outside_document_root.php, который находится вне документаroot:

<?php
// db_pdo_outside_document_root.php
define('DB_PDO_DSN', 'mysql:host=localhost;dbname=app_database');
define('DB_PDO_USER', 'db_user');
define('DB_PDO_PASSWD', 'db_fancy_passwd');
define('DB_PDO_OPTIONS', [
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);

Пока все хорошо.Тем не менее, это не очень помогает, потому что если кто-то хочет повторить содержимое констант, он может легко сделать это:

<?php

// In some PHP file used by the application... 

echo DB_PDO_PASSWD; // echoes the DB password.
//mail('developer@mail.com', 'Subject', DB_PDO_PASSWD); // Or send it by email

Теперь, конечно, вы должны доверять коллегам, с которыми вы работаете,но кто знает, иногда случается, что сотрудник уходит, может быть, его увольняют и так далее.И мы не хотим, чтобы у них была возможность каким-то образом хранить производственные учетные данные БД на своих компьютерах.

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

<?php

// ...

var_dump($appContainer->get('db_connection'))

Выводит что-то вроде:

/path/to/htdocs/file.php:4:
object(PDO)[13]

Так что я бы закончил что-то вроде этого вКод начальной загрузки моего приложения:

<?php

// ...    

$containerConfig = [
   'db_connection' => function() {
      return require_once __DIR__ . '/../db_pdo_outside_document_root.php';
   }
];
$appContainer = new ApplicationContainer($containerConfig);

// Use the container and handle the request...

А внутри внешнего файла:

<?php
// db_pdo_outside_document_root.php
return new PDO('mysql:host=localhost;dbname=app_database', 
'db_user', 'db_fancy_passwd', [
    PDO::ATTR_PERSISTENT => false,
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
]);;

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

Как вы думаете, смогут ли другие разработчики каким-либо образом считывать учетные данные из возвращаемого значения $appContainer->get('db_connection') (предполагая, что он возвращает PDO?объект выше)?

Я также пытался с ReflectionClass и не вижу никакого свойства для этого объекта:

<?php

//...

$ref = new ReflectionClass($appContainer->get('db_connection'));
var_dump($ref->getProperties());

Выходы:

/path/to/htdocs/file.php:4:
array (size=0)
  empty

Что вы думаете об этомподход?Не изобретение века, но кажется, что оно делает свою работу.Или, может быть, есть еще способ получить доступ к учетным данным в коде приложения, о котором я не знаю.

Я хотел бы узнать ваше мнение.

Спасибо за внимание.

EDI: как указал @IsThisJavascript, код приложения, конечно, все еще может получить содержимое файла и, следовательно, получить доступ к учетным данным, поэтому все мои рассуждения были неверны, поскольку он не рассматривал этот очень простой случай.Думаю, мне нужно найти другую стратегию, если она существует ...

Ответы [ 3 ]

0 голосов
/ 23 ноября 2018

Наиболее распространенным решением является использование файла .env для хранения учетных данных, необходимых для кодовой базы.

Разработчики получают (/ make / customize) файл .env с учетными данными разработки, производственные учетные данныедоступно только в производственной среде.

Этот .env файл хранится в корне документа, но не распространяется с кодом: он не добавляется в хранилище (git / svn)

Обычнофайл .env.example включен в базовые переменные разработки, такие как пути к тестовым средам для внешних API и примеры учетных данных базы данных для их локальных баз данных.В отличие от .env, .env.example добавляется в репозиторий управления исходным кодом.

С точки зрения кода вы можете использовать такую ​​библиотеку, как dotenv дляпрочитайте значения файла .env.

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

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

Когда вы следуете такому протоколу, для отдельного разработчика практически невозможно получить доступ к рабочим учетным данным.

0 голосов
/ 23 ноября 2018

Вы можете комбинировать 2 тактики:

1.Разделите среду разработки и производственную среду

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

-> таким образом, разработчики вообще не узнают чувствительных частей производственной стороны.

2.предоставьте пользователям индивидуальные учетные записи

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

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

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

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

0 голосов
/ 22 ноября 2018

Вашим разработчикам не нужно знать пароль рабочей БД, если у вас есть сервер разработки и рабочий сервер.Если ваши разработчики работают прямо на производственном сервере, то на самом деле нет способа предотвратить вашу проблему.Обычно только системный администратор / devops знает пароль БД, и он устанавливает его на рабочем сервере.Ваши разработчики должны иметь 0 доступа к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...