Шифрование базы данных
Шифрование базы данных (англ. 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].
Шифрование на уровне файловой системы
Традиционные методы шифрования баз данных обычно шифруют содержимое самой базы. Базами данных управляют системы управления базами данных (СУБД), работающие поверх операционной системы (ОС)[15]. Здесь возникает потенциальная уязвимость: зашифрованная база данных может быть запущена на доступной и уязвимой ОС. EFS позволяет шифровать данные вне СУБД, расширяя область применения по сравнению с TDE, которое работает только с файлами баз данных. Хотя область применения EFS шире, производительность базы при этом снижается, а администраторы требуют доступ к операционной системе для использования EFS, что усложняет администрирование. В силу этого EFS редко применяют в системах с частыми операциями ввода-вывода — рекомендовано ограничивать его использование малым числом пользователей[16].
Полное шифрование диска
Симметричное и асимметричное шифрование баз данных
Симметричное шифрование в данном контексте означает применение закрытого (секретного) ключа к данным — как при их сохранении, так и при обратном чтении[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].
Опасность при использовании хэшей для паролей состоит в возможности применения радужных таблиц (rainbow table) для конкретного алгоритма[31]. Это позволяет злоумышленнику подобрать исходный пароль и получить доступ к базе[32]. Одним из решений является «соление» — добавление к паролю дополнительных данных (например, e-mail пользователя) до хэширования. Чем больше информации включено, тем сложнее подобрать соответствующую радужную таблицу и тем надёжнее защита пароля[33].
В некоторых системах для увеличения стойкости помимо соли добавляют ещё и так называемый «перец» (pepper). Этот подход дискуссионен, но стоит его описать[31]. Pepper — ещё одно значение, добавляемое ко всем паролям (обычно одно и то же для всего сайта или системы)[34]. Теоретически это ещё больше усложняет взлом методом подбора (радужные таблицы), однако практическая польза approach спорна[35].[34]
Шифрование на уровне приложения
В этой модели шифрование осуществляется приложением, с помощью которого создаются или изменяются данные — то есть данные шифруются до помещения в базу. Такой подход позволяет адаптировать процесс под конкретного пользователя, исходя из тех данных, которые известны приложению (например, роли или права доступа)[35].
По мнению Евгения Пилянкевича, «шифрование на уровне приложения становится хорошей практикой для систем с повышенными требованиями безопасности, особенно при переходе к облачным решениям без ярко выраженного периметра»[36].
Существенное преимущество в том, что в этом случае система становится проще: если приложение само шифрует свои данные, не нужен отдельный инструмент шифрования. Второе преимущество — безопасность: чтобы раскрыть скрытые данные, злоумышленнику требуется получить как содержимое базы, так и сами приложения, которые шифруют и дешифруют данные[37].
Главный недостаток — приложения фирмы должны быть доработаны таким образом, чтобы шифровать данные самостоятельно, что требует затрат времени и ресурсов. Многие компании могут посчитать такие вложения неоправданными из-за высокой альтернативной стоимости. Кроме того, при этом значительно усложняется и управление ключами (несколько приложений должны иметь доступ к ключам и шифровать каждое свои данные), а также ухудшается производительность: если все данные в базе шифруются разными приложениями, невозможен удобный поиск — например, невозможно создать единый глоссарий для книги, написанной на 30 языках[37].
Риски шифрования базы данных
Размышляя о применении шифрования, важно учитывать соответствующие риски. Во-первых, риск связан с управлением ключами: если приватные ключи не изолированы, администраторы с вредоносными намерениями смогут извлечь чувствительную информацию[38]. К тому же, утрата ключей фактически делает невозможным восстановление зашифрованной информации.
Как использовать шифрование для защиты данных в базе данных?
Шифрование повышает защищённость данных, хранящихся в базе, путём превращения информации в нечитаемый для посторонних формат с помощью алгоритма. Доступ к расшифровке возможен только при наличии ключа, что позволяет сохранять конфиденциальность информации даже при компрометации базы.
Шифруя чувствительные данные (пароли, финансовую информацию, персональные сведения), организации снижают риски несанкционированного доступа и нарушения безопасности. Это помогает минимизировать угрозу кражи данных и соблюсти требования по защите информации.
Для реализации шифрования в базе используются соответствующие технологии, например AES или TLS. Ключи шифрования должны храниться безопасно, чтобы злоумышленники не могли получить доступ к ключам и расшифровать данные[39].