Шифрование данных в Greenplum с расширением pgcrypto

Шифрование данных в Greenplum с расширением pgcrypto

    Чтобы сделать наши курсы по 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 в Москве:

    Источники

    1. https://docs.vmware.com/en/VMware-Tanzu-Greenplum/6/greenplum-database/GUID-ref_guide-modules-pgcrypto/
    2. https://cloud.yandex.ru/docs/managed-greenplum/operations/extensions/pgcrypto
    3. https://www.postgresql.org/docs/current/pgcrypto.html