2014-01-20 2 views
1

Например, в Django есть репо для этого: https://sourcegraph.com/github.com/dcwatson/django-pgcrypto.Как должно выполняться шифрование PostgresSQL на уровне столбцов, реализованное в SQLAlchemy с использованием pgcrypt?

Существует некоторая дискуссия в руководстве SQLAlchemy, но я использую не-байтовые столбцы: http://docs.sqlalchemy.org/en/rel_0_9/core/types.html

Я бег колбы на Heroku, используя SQLAlchemy.

Пример кода и/или некоторые обсуждения были бы наиболее ценными.

+0

Всякий раз, когда вы рассматриваете криптографию, вы не можете отделить «как» от «почему». Какова ваша цель? Что вы пытаетесь защитить и * от кого? –

+0

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

ответ

4

Есть куча этапов такого рода решений, это не просто «сунуть плагин в стек и что шифрование вещь позаботилась о»

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

Рассмотрит, кто вы пытаетесь защитить против:

    (отверстий, например, SQL-инъекции, используемых для удаленных копий таблиц)
  • Повседневного взломщика
  • Украденных резервной копии базы данных (подсказка: зашифровать это тоже)
  • Украдены/просочились файлы журнала, возможно включая запросы и параметры
  • Атакующий с прямым доступом не на суперпользователя на уровне SQL
  • Атакующие с прямым доступом суперпользователь SQL уровня
  • Атакующих, который получает прямой доступ к пользователю ОС «Postgres», так что они могут изменить конфигурацию, копировать/редактировать журналы, установить вредоносные расширения, изменять определение функций и т.д.
  • Attacker который получает корень на сервере БД

конечно, есть также сервер приложений, перед компромиссом доверенных источников для языков программирования и инструментальных средств и т.д. в конце концов вы достигнете точки, где вы должны сказать: «Я не могу реалистично защищаться от этого ». Вы не можете защитить кого-то, входящего, говоря: «Я из правительства, и я сделаю x/y/z вам, если вы не разрешите мне установить руткит на сервере этого клиента». Дело в том, что вам нужно решить, что вам нужно сделать, чтобы вы защищали и делали свои решения безопасности на основе этого.

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

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

Это также означает, что два человека с тем же открытым текстом для столбца SecretValue имеют совершенно разные значения для SecretValueSalt, SecretValueHashedBytes в базе данных. Таким образом, вы не можете присоединиться к нему, использовать его в статье WHERE, полезно проиндексировать его и т. Д.

По этой причине вы часто ставите под угрозу безопасность. Вы можете сделать несостоявшийся хэш части данных, так что вы получите частичное совпадение, затем принесите все результаты в свое приложение и отфильтруйте их на стороне приложения, где у вас есть полная информация. Таким образом, ваше хранилище для SecretValue теперь выглядит как SecretValueFirst10DigitsUnsaltedHash, SecretValueHashSalt, SecretValueHashBytes. Но с лучшими именами столбцов.

Если вы сомневаетесь, просто не отправляйте открытый текст ничего чувствительного к базе данных. Это означает, что pgcrypto вам не очень-то нравится, и вы будете делать в основном криптографию на стороне приложения. Причина №1 заключается в том, что если вы отправляете открытый текст (или, что еще хуже, ключевой материал) в БД, он может быть открыт в файлах журналов, pg_stat_activity и т. Д.

Вы почти всегда хотите хранить зашифрованные данные в столбцах bytea. Если вы действительно настаиваете на том, что вы можете закодировать hex или base64 и засунуть его в столбец text, но разработчики и администраторы баз данных, которым позже придется использовать вашу систему, будут плакать.

+0

Спасибо за ваш продуманный ответ. Я убежден в вашем аргументе, что журналы и т. Д. Означают, что криптона, вероятно, принадлежит в приложении. Это может означать, что в моем случае это перенос всех важных текстовых столбцов в байтовый тип и шифрование в приложении (но сохранение неинформативных ключей численного соединения и идентификаторов строк нетронутым). Если вы идете по дороге, которую вы набросали (шифрование приложением, а не dbase), существуют ли стандартные подходы к предотвращению скремблирования данных с помощью ошибки в процессе шифрования (например, непреднамеренное временное использование неправильного ключа)? – Soferio

+0

@ user1642561 Для этого могут быть прикладные структуры, но я не знаю ничего, что интегрируется в инструменты, которые вы используете. Сожалею. Может быть стоит опубликовать отдельный вопрос об этом. –

+0

Могу ли я попросить вас уточнить, почему следует использовать bytea, а не тип столбца или текстового столбца? – Soferio