2012-06-27 2 views
2

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

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

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

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

+3

Вы используете php в среде с ограничениями безопасности? С криптографическими ключами? Интересно ... –

+0

Хорошо, что он работает хорошо и передает проверки безопасности, так что смысл в переписывании всего приложения? – DzikiMarian

ответ

0

Как вы уже знаете, независимо от того, что вы делаете, если ключ доступен для приложения, он, безусловно, будет доступен для вредоносного кода, который получил root-доступ на сервере и, скорее всего, для кода, получившего доступ к UID, под которым работает приложение. Это просто вопрос, насколько это просто.

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

Ваша идея - использовать какой-то демон, который держит ключи в ОЗУ и может быть запрошен приложением. Это работает, но вы, вероятно, уже понимаете, что если ваше приложение может запросить его, вредоносный код также может запросить его. Если вы выберете этот вариант в любом случае, подумайте об использовании memcached (зачем изобретать колесо?).

Единственный другой вариант, о котором я могу думать, это написать модуль Apache (в C), который загружает секрет во время запуска системы (после чего постоянная копия тайна размонтируется) и расширение PHP (в C), чтобы получить секрет от модуля Apache, который живет в том же процессе. Предполагается, что вы используете PHP как модуль Apache, а не как внешний процесс. Но для меня это звучит как излишество, потому что оно довольно сложно и на самом деле не снимает риск.

Считаете ли вы, что делать с местом подкачки? Вы можете использовать mlock или аналогичный (на C), чтобы сохранить секрет для записи, если он находится в ограниченном месте, но было бы сложно защитить его таким образом, как только он будет передан интерпретатору PHP. Поэтому вам лучше запустить систему без свопа.

Рассмотрите изменение дизайна, которое ограничит секрет в одном месте в долговременном демоне (возможно, не написанном на PHP) и попросит приложение PHP делегировать криптографические функции, которым нужен доступ к секрету этому демону.

+0

Я действительно подумывал о модуле apache - после прочтения учебника не кажется, что сложный и apache может проверить, имеет ли в настоящее время исполняемый скрипт права на секрет. (Учебное пособие для любопытных: http://www.penguinpowered.org/documentation/apache2_modules.html) С другой стороны, я считаю, что правильная аутентификация между daemon и php не будет намного проще. В любом случае ваше сообщение очень полезно (я еще не думал о проблеме с подкачкой) - спасибо. – DzikiMarian

+0

Что касается передачи переменной от apache к php, я думал о настройке переменной env для скрипта - это намного проще и, похоже, обеспечивает аналогичный уровень безопасности. – DzikiMarian

+1

Будьте осторожны с переменными окружения.Они могут легко протекать в подпроцессы, и в большинстве случаев команда 'ps' может отображать их содержимое (с опцией' e'). – Celada