Прежде чем принимать решение по таким вопросам безопасности, вы должны оценить модель угрозы. Без представления о том, от чего вы защищаетесь, любые принимаемые вами меры, скорее всего, будут бесполезны.
Теперь есть несколько вещей, которые вы можете беспокоиться в этом контексте:
- Злоумышленники получают физический доступ к вашим данным (например, взломывают центр обработки данных, крадут ленты с резервными копиями и т. Д.)
- Злоумышленники получают доступ на чтение к вашей необработанной базе данных
- Злоумышленники скомпрометировали ваше приложение, например, путем внедрения SQL-кода, переполнения буфера и т. Д.
Для первого сценария хранение базы данных и всех резервных копий на зашифрованных томах должно работать при условии, что сервер не работает - кража сервера или лент может потребовать нарушения шифрования на уровне диска.
Для второго сценария шифрование данных базы данных помогает, но только если вы нигде не храните необходимые ключи или парольные фразы.
В третьем сценарии все зависит от контекста, в котором происходит атака: если это, например, атака XSS или CSRF, то злоумышленник может сделать все, что может законный пользователь, и шифрование ваших данных совсем не помогает ,
Таким образом, модель угрозы - это злоумышленник, который получает доступ для чтения к необработанной базе данных, либо находя учетные данные для входа в систему и управляя входом на сервер базы данных извне, либо получая root-доступ к серверу базы данных. Типичный путь - сначала получить доступ к оболочке на веб-сервере; оттуда злоумышленник может затем прочитать учетные данные доступа из файла конфигурации и подключиться к базе данных.
Дополнительным соображением является то, где вы храните ключи и парольные фразы, особенно если вы используете платформу с моделью выполнения без сохранения состояния, такой как PHP. В идеале клиент должен вводить свою фразу-пароль при необходимости и хранить ее только в памяти или, что еще лучше, выполнять расшифровку на стороне клиента (но это не всегда возможно). На платформе без состояний состояние обычно передается с использованием сеансов, memcache, баз данных или плоских файлов; но все это гораздо более уязвимо, чем сохранение состояния в собственной памяти веб-приложения с отслеживанием состояния. Предотвращение этого - проблема с куриным яйцом, потому что если вы шифруете состояние перед сохранением его, вы просто создаете еще один секрет, который вы должны помнить безопасно. Запоминание парольной фразы на клиенте и отправка ее вместе с каждым запросом, который нуждается в этом, может оказаться наименее ужасным решением;