Как зашифровать базу данных в Symfony - PullRequest
1 голос
/ 24 августа 2009

Я работаю с Symfony Framework и Propel, и я бродил, какой самый простой способ для шифрования базы данных. Я говорю не о паролях, а о всей базе данных. Я создал небольшое веб-приложение для клиента, которое управляет некоторой информацией (учетными записями пользователей, паролями и т. Д.), И я не хочу, чтобы оно было видно, например, если у кого-то есть доступ к phpmyadmin.

Ответы [ 3 ]

2 голосов
/ 24 августа 2009

Как правило, вы бы справились со встроенными разрешениями MySQL.

Единственный способ, которым кто-то может использовать phpMyAdmin, - это если он установлен и настроен на сервере - самый простой способ исправить это - просто удалить его, или если вы не можете сделать это, используя соединение SSL и надежные пароли.

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

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

1 голос
/ 28 августа 2009

Ну, это может быть немного наивно, но как насчет простого шифрования на стороне сервера [php, я полагаю] перед записью в БД, а затем расшифровывания его обратно при чтении? Похоже, ваша проблема в том, что вы не хотите, чтобы администратор сервера легко считывал ваши данные. Если вы используете Symfony, вы, вероятно, можете сделать это достаточно глубоко в модели, чтобы ваш код не изменился.


После некоторых раскопок, вот как бы я это сделал, если бы чувствовал себя особенно смелым.

Отредактируйте buildParams () в xxx / symfony / vendor / propel / util / BasePeer.php, на 860 вы найдете

$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => $crit->getValue());

изменить на

$params[] = array('column' => $crit->getColumn(), 'table' => $crit->getTable(), 'value' => your_encryption_method($crit->getValue()));

(если я что-то пропустил) все записи symfony / propel в базу данных в конечном итоге вызовут эту функцию, поэтому все, что вы пишете в базу данных, шифруется с помощью your_encryption_method ().

Попробуйте, и если это работает, и вы все еще чувствуете себя смелым, измените функцию addHydrate () в xxx / symfony / vendor / propel-generator / classes / propel / engine / builder / om /php5/PHP5BasicObjectBuilder.php (строка 668), поэтому код propel hydrate () генерируется для вас при вызове symfony propel-build-model или symfony-propel-build-all автоматически расшифрует все из базы данных.

в настоящее время оно должно выглядеть как

                                    case PropelTypes::DATE:
                        case PropelTypes::TIME:
                        case PropelTypes::TIMESTAMP:
                            $script .= "
            \$this->$clo = \$rs->get$affix(\$startcol + $n, null);
";
                            break;
                        default:
                            $script .= "
            \$this->$clo = \$rs->get$affix(\$startcol + $n);
";

вы хотите изменить его на что-то вроде

case PropelTypes::DATE:
                        case PropelTypes::TIME:
                        case PropelTypes::TIMESTAMP:
                            $script .= "
            \$this->$clo = \$rs->get$affix(\$startcol + $n, null);
";
                            break;

                        default:
                            $script .= "
            \$this->$clo = \my_decryption_function($rs->get$affix(\$startcol + $n));
";

После того, как вы сделаете это изменение, запустите symfony propel-build-model и дайте мне знать, сработало ли это :-). Удачи, и вы, вероятно, уже знаете это, но сделайте резервные копии этих файлов, прежде чем изменять их ... о, и так как вы модифицируете ядро ​​Symfony, у ваших других проектов будут проблемы, если вы не хотите, чтобы все они записывали зашифрованные данные в дб

0 голосов
/ 24 августа 2009

Это вопрос 3 уровня. Вы должны защитить несколько вещей:

  1. Данные ввода / вывода, поэтому они не могут быть перехваченным.
  2. Права администратора, поэтому к вашей системе не может получить доступ не тот человек во время работы.
  3. Жесткий диск сам по себе, так что если кто-то имеет прямой доступ к компьютер, он не сможет получить доступ это даже путем извлечения оборудования.

Для 1 вы можете использовать SSL и HTTPS.

Для 2 следуйте рекомендациям sysadmin по настройке паролей, прав и обновлений (ваш друг - serverfault.com). Это включает в себя администратора БД.

Для 3 вы должны зашифровать все оборудование. Использование шифрования только для БД снизит производительность вашего сервера. Использование шифрования в любом случае замедлит работу вашей системы, но делает это на уровне выше файловой системы, если это тупик для веб-приложений. Кроме того, инструменты для запуска всей системы Linux на зашифрованном жестком диске достаточно развиты (в Ubuntu LVM позволяет делать это почти прозрачно).

Как вы заметили, это не имеет ничего общего с Symfony, как всегда.

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