Шифрование базы данных

Шифрование базы данных (англ. database encryption) — процесс, при котором с помощью алгоритма данные, хранящиеся в базе данных, преобразуются в «шифротекст», непонятный без предварительного дешифрования[1]. Основная задача шифрования базы данных — защитить хранящиеся в ней данные от доступа лиц с потенциально вредоносными намерениями[2]. Само наличие шифрования снижает мотивацию для взлома базы данных, поскольку получение «бессмысленных» зашифрованных данных вынуждает злоумышленников предпринимать дополнительные шаги для их извлечения[3]. В настоящее время существует множество технологий шифрования баз данных, наиболее важные из которых рассмотрены ниже.

Прозрачное и внешнее шифрование базы данных

Прозрачное шифрование данных (англ. transparent data encryption, TDE) применяется для шифрования всей базы данных[2], то есть включает шифрование так называемых данных в состоянии покоя[4]. Данные «на покое» — это обычно неактивные данные, которые в данный момент не редактируются и не передаются по сети[5]. Например, текстовый файл, сохраняемый на компьютере, считается «на покое» до тех пор, пока его не откроют и не изменят. Такие данные хранятся на физических носителях данных, таких как ленты или жёсткие диски[6]. Хранение большого объёма чувствительной информации на физических носителях вызывает опасения по поводу безопасности и возможной кражи. TDE обеспечивает невозможность прочитать такие данные при несанкционированном получении доступа[7]. Данные, которые невозможно прочитать, теряют ценность, снижая мотивацию к краже. Главная особенность TDE в её прозрачности: поскольку шифруются все данные, не требуется внесения изменений в приложения для нормальной работы TDE[8]. TDE шифрует всю базу, включая резервные копии. Прозрачность достигается тем, что шифрование происходит на уровне страниц: данные шифруются при сохранении и расшифровываются при загрузке в память системы[9]. Для шифрования используется симметричный ключ, часто называемый «ключ шифрования базы данных»[2].

Шифрование на уровне столбцов

Для понимания шифрования на уровне столбцов важно знать устройство типовой реляционной базы данных. Она делится на таблицы, которые, в свою очередь, делятся на столбцы, каждый из которых содержит строки данных[10]. В отличие от TDE, шифрующей всю базу, шифрование на уровне столбцов позволяет зашифровать отдельные столбцы внутри базы[11]. Эта детализация (гранулярность) влечёт свои плюсы и минусы. Во-первых, возможность выбора конкретных столбцов делает такую схему гораздо более гибкой по сравнению с TDE. Во-вторых, для каждого столбца может быть использован уникальный ключ шифрования, что затрудняет применение радужных таблиц (rainbow table) и тем самым снижает вероятность компрометации данных в отдельных столбцах. Главный недостаток — потеря производительности: шифрование разных столбцов разными ключами может замедлять работу базы, а также снижать скорость индексации и поиска данных[12].

Шифрование на уровне поля

Ведутся экспериментальные работы по обеспечению операций с зашифрованными полями базы (например, поиск или арифметические операции) без необходимости их расшифровки[13]. Для этого требуется использовать сильные, рандомизированные методы шифрования — каждый раз должен получаться разный результат (такое шифрование известно как probabilistic encryption). Шифрование на уровне поля слабее (уступает) рандомизированному шифрованию, но позволяет проверять равенство значений без их расшифровки[14].

Шифрование на уровне файловой системы

Encrypting File System (EFS)

Традиционные методы шифрования баз данных обычно шифруют содержимое самой базы. Базами данных управляют системы управления базами данных (СУБД), работающие поверх операционной системы (ОС)[15]. Здесь возникает потенциальная уязвимость: зашифрованная база данных может быть запущена на доступной и уязвимой ОС. EFS позволяет шифровать данные вне СУБД, расширяя область применения по сравнению с TDE, которое работает только с файлами баз данных. Хотя область применения EFS шире, производительность базы при этом снижается, а администраторы требуют доступ к операционной системе для использования EFS, что усложняет администрирование. В силу этого EFS редко применяют в системах с частыми операциями ввода-вывода — рекомендовано ограничивать его использование малым числом пользователей[16].

Полное шифрование диска

В отличие от EFS, BitLocker не вызывает подобных проблем с производительностью[16].

Симметричное и асимметричное шифрование баз данных

undefined

Симметричное шифрование базы данных

Симметричное шифрование в данном контексте означает применение закрытого (секретного) ключа к данным — как при их сохранении, так и при обратном чтении[17]. При этом данных нельзя прочитать иным способом, кроме как с помощью этого ключа. Для обмена зашифрованными данными через базу получатель должен обладать копией этого секретного ключа[18]. Главный риск симметричного метода — компрометация ключа лицам, не допускаемым к данным[17]. Однако преимущество этого подхода — высокая скорость, поскольку задействован лишь один ключ[19].

Асимметричное шифрование базы данных

Асимметричный подход предполагает наличие двух видов ключей: публичного и приватного[20]. Открытый ключ доступен всем и уникален для пользователя, закрытый ключ — известен только владельцу[21]. Обычно публичный ключ служит для шифрования, приватный — для расшифровки. Например, если пользователь А хочет отправить сообщение пользователю B, он шифрует его открытым ключом B. Расшифровать сможет только сам B, поскольку только у него есть соответствующий закрытый ключ. Третий пользователь С не сможет расшифровать сообщение для B. Асимметричное шифрование считается более безопасным, поскольку приватные ключи не передаются между участниками[22]. Тем не менее, из-за сравнительно низкой производительности асимметричное шифрование чаще применяют для управления ключами, а сами данные шифруются симметричным методом[23].

Управление ключами

В рассмотренных выше разделах отмечалось, что для обмена зашифрованными данными необходим обмен ключами. В случае большого количества пользователей самостоятельный обмен становится логистически невыгодным, поэтому управление и хранение ключей осуществляет система. Этот процесс получил название «управление ключами». Некорректно организованная система хранения ключей может привести к компрометации или потере ключей, а значит, и к безвозвратной потере самих данных. С увеличением числа приложений в организации растёт количество ключей, усложняется администрирование, требует создание централизованной системы управления, иногда называемой «корпоративное управление ключами» (enterprise key management)[24]. Решения по корпоративному управлению ключами предлагают многие поставщики технологий. Они позволяют администраторам управлять всеми ключами системы из единого центра[25]. Внедрение таких систем уменьшает риски, связанные с человеческим фактором в процессе управления ключами шифрования баз данных[24].

Хэширование

Хэширование используется в базах данных для защиты чувствительных данных (например, паролей), а также для повышения эффективности поиска[26]. Вводимые данные преобразуются хэш-алгоритмом в строку фиксированной длины, которая затем сохраняется в базе. Важнейшие свойства хэширования: уникальность и повторяемость — например, слово «кот» всегда будет иметь при хэшировании определённый результат, и почти невозможно подобрать другой ввод, дающий тот же хэш[27]. Второе свойство — необратимость: почти невозможно восстановить исходные данные из хэш-значения[28]. Обычно хэширование применяют в системах управления паролями в базе. Когда пользователь создаёт пароль, он хэшируется и сохраняется в этом виде; при последующем входе вновь введённый пароль хэшируется и сравнивается со значением в базе[29]. Если хэши совпадают, пароль считается верным. Одной из часто используемых хэш-функций считается SHA-256[30].

Соль (salting)

Опасность при использовании хэшей для паролей состоит в возможности применения радужных таблиц (rainbow table) для конкретного алгоритма[31]. Это позволяет злоумышленнику подобрать исходный пароль и получить доступ к базе[32]. Одним из решений является «соление» — добавление к паролю дополнительных данных (например, e-mail пользователя) до хэширования. Чем больше информации включено, тем сложнее подобрать соответствующую радужную таблицу и тем надёжнее защита пароля[33].

Pepper (перец)

В некоторых системах для увеличения стойкости помимо соли добавляют ещё и так называемый «перец» (pepper). Этот подход дискуссионен, но стоит его описать[31]. Pepper — ещё одно значение, добавляемое ко всем паролям (обычно одно и то же для всего сайта или системы)[34]. Теоретически это ещё больше усложняет взлом методом подбора (радужные таблицы), однако практическая польза approach спорна[35].[34]

Шифрование на уровне приложения

В этой модели шифрование осуществляется приложением, с помощью которого создаются или изменяются данные — то есть данные шифруются до помещения в базу. Такой подход позволяет адаптировать процесс под конкретного пользователя, исходя из тех данных, которые известны приложению (например, роли или права доступа)[35].

По мнению Евгения Пилянкевича, «шифрование на уровне приложения становится хорошей практикой для систем с повышенными требованиями безопасности, особенно при переходе к облачным решениям без ярко выраженного периметра»[36].

Преимущества шифрования на уровне приложения

Существенное преимущество в том, что в этом случае система становится проще: если приложение само шифрует свои данные, не нужен отдельный инструмент шифрования. Второе преимущество — безопасность: чтобы раскрыть скрытые данные, злоумышленнику требуется получить как содержимое базы, так и сами приложения, которые шифруют и дешифруют данные[37].

Недостатки шифрования на уровне приложения

Главный недостаток — приложения фирмы должны быть доработаны таким образом, чтобы шифровать данные самостоятельно, что требует затрат времени и ресурсов. Многие компании могут посчитать такие вложения неоправданными из-за высокой альтернативной стоимости. Кроме того, при этом значительно усложняется и управление ключами (несколько приложений должны иметь доступ к ключам и шифровать каждое свои данные), а также ухудшается производительность: если все данные в базе шифруются разными приложениями, невозможен удобный поиск — например, невозможно создать единый глоссарий для книги, написанной на 30 языках[37].

Риски шифрования базы данных

Размышляя о применении шифрования, важно учитывать соответствующие риски. Во-первых, риск связан с управлением ключами: если приватные ключи не изолированы, администраторы с вредоносными намерениями смогут извлечь чувствительную информацию[38]. К тому же, утрата ключей фактически делает невозможным восстановление зашифрованной информации.

Как использовать шифрование для защиты данных в базе данных?

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

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

Для реализации шифрования в базе используются соответствующие технологии, например AES или TLS. Ключи шифрования должны храниться безопасно, чтобы злоумышленники не могли получить доступ к ключам и расшифровать данные[39].

Примечания