Чтобы сделать наши курсы по Greenplum еще более полезными для дата-инженеров и администраторов, сегодня познакомимся с pgcrypto – важным расширением этой MPP-СУБД, которое предоставляет криптографические функции, чтобы хранить некоторые столбцы данных в зашифрованном виде. Как установить расширение pgcrypto и использовать его для улучшения безопасности Greenplum.
Шифрование данных в Greenplum
База данных Greenplum устанавливается с дополнительным модулем функций шифрования и дешифрования под названием pgcrypto, который позволяет администраторам баз данных хранить определенные столбцы таблиц в зашифрованном виде. Это добавляет дополнительный уровень защиты конфиденциальных данных, поскольку зашифрованные данные в Greenplum невозможно прочитать без ключа шифрования. Кроме того, их нельзя прочитать непосредственно с дисков. Модуль pgcrypto предоставляет криптографические функции для PostgreSQL, на которой основан Greenplum, о чем мы писали здесь. Изначально расширение требует OpenSSL и не будет установлено, если поддержка OpenSSL не была выбрана при сборке PostgreSQL.
Модуль pgcrypto считается «доверенным», то есть его могут устанавливать пользователи без прав суперпользователя, имеющие привилегию CREATE в текущей базе данных. Чтобы установить расширение pgcrypto в кластер Greenplum, следует подключитесь к базе данных от имени владельца или пользователя, имеющего в базе данных разрешение CREATE, и выполнить команду:
CREATE EXTENSION pgcrypto
Проверить, что расширение установлено, поможет команда
SELECT extname FROM pg_extension;
Функции pgcrypto выполняются внутри сервера базы данных, что означает, что все данные и пароли перемещаются между pgcrypto и клиентским приложением в виде открытого текста. Поэтому для обеспечения безопасности следует использовать SSL-соединения между клиентом и главным сервером Greenplum. Как настроить расширение pgcrypto и использовать его, рассмотрим далее.
Настройка и использование pgcrypto
Хотя модуль pgcrypto устанавливается при установке Greenplum, прежде чем использовать какие-то его функции, надо зарегистрировать расширение pgcrypto в каждой базе данных. Начиная с Greenplum 6.22, о котором мы писали здесь, расширение pgcrypto предоставляет параметр конфигурации модуля pgcrypto.fips. Этот параметр настраивает поддержку Greenplum для ограниченного набора функций шифрования федерального стандарт обработки информации FIPS 140-2 (Federal Information Processing Standard). По умолчанию шифрование FIPS не включено. Чтобы включить этот параметр, надо включить FIPS на всех хостах Greenplum. Для этого следует настроить параметр конфигурации сервера Greenplum shared_preload_libraries для загрузки библиотеки pgcrypto. Например, это можно сделать с помощью утилиты gpconfig, которая обновляет параметр в файлах postgresql.conf Greenplum:
gpconfig -c shared_preload_libraries -v '\$libdir/pgcrypto'
А следующая команда отображает значение shared_preload_libraries:
gpconfig -s shared_preload_libraries
Далее следует перезапустить СУБД с помощью команды
gpstop -ра
Включите параметр конфигурации сервера pgcrypto.fips для каждой базы данных, использующей шифрование FIPS можно, установив значение параметра on для базы данных (testdb):
ALTER DATABASE testdb SET pgcrypto.fips TO on;
При этом нельзя использовать команду SET, которая обновляет параметр для сеанса, или утилиту gpconfig, которая обновляет файлы postgresql.conf. После установки параметра надо повторно подключиться к базе данных, чтобы включить поддержку шифрования для сеанса.
Когда этот параметр pgcrypto.fips включен, происходят следующие изменения:
- режим FIPS инициализируется в библиотеке OpenSSL;
- функции digest() и hmac() разрешают только алгоритм шифрования SHA;
- функции для алгоритмов crypt и gen_salt деактивируются;
- функции шифрования/дешифрования PGP и RAW поддерживают только алгоритмы AES и 3DES.
Чтобы проиллюстрировать, как работает pgcrypto, рассмотрим пример симметричного шифрования. Сперва создадим таблицу из двух столбцов, куда в поле типа varchar запишем логин пользователя (username), что будет первичным ключом, и пароль (passw), куда будем вставлять зашифрованные данные пароля как текст:
CREATE TABLE tbl_sym_crypt (username varchar(100) PRIMARY KEY, passw text);
Затем вставим данные в эту таблицу – логин пользователя укажем явно, а для шифрования пароля будем использовать симметричный ключ !qazSymKeyXsw2:
INSERT INTO tbl_sym_crypt (username, passw) VALUES (kate', pgp_sym_encrypt('kate_paswrd,'!qazSymKeyXsw2')), ('petr', pgp_sym_encrypt('petr_pass','!qazSymKeyXsw2'));
Расшифруем данные, явно указав их тип данных как bytea в функции pgp_sym_decrypt() в SQL-запросе на выборку:
SELECT username, pgp_sym_decrypt(crypttext::bytea, '!qazSymKeyXsw2')FROM tbl_sym_crypt;
Примечательно, что документация PostgreSQL Отмечает недопустимость расшифровки данных типа bytea функцией pgp_sym_decrypt() . Это ограничение введено, чтобы не допустить вывода некорректных символьных данных. А вот расшифровывать изначально текстовые данные с помощью pgp_sym_decrypt_bytea можно без ограничений.
В заключение отметим, как отключить расширение pgcrypto из Greenplum и в каких случаях это надо. Если расширение pgcrypto не используется, его следует удалить из базы данных (testdb):
psql -d testdb -c 'DROP EXTENSION pgcrypto'
Также надо удалить \$libdir/pgcrypto из параметра shared_preload_libraries командами
gpconfig -s shared_preload_libraries gpconfig –r \$libdir/pgcrypto
и перезапустить СУБД командой
gpstop -ра
Освойте администрирование и эксплуатацию Greenplum с Arenadata DB для эффективного хранения и аналитики больших данных на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:
Источники