Контроль загрузки модулей с проверкой контрольных сумм
Функциональность предназначена для контроля загрузки модулей, которые должны быть включены в список разрешенных к выполнению. Данный механизм предотвращает выполнение несанкционированного кода. Помимо наличия модуля в списке разрешенных компонентов проверяется контрольная сумма, что гарантирует его целостность.
Алгоритм работы функциональности:
-
Проверка наличия модуля в списке разрешенных к установке (
check_allow_list): определяет, содержится ли загружаемый файл в предварительно заданном перечне доверенного ПО.Проверяемый конфигурационный файл находится в каталоге
$PGDATA/pg_integrity, а сверка происходит только при включенном параметреloading_control.check_allow_list. -
Проверка контрольной суммы (
check_hash): обеспечивает контроль целостности, гарантируя, что загружаемый модуль не был изменен или скомпрометирован. Данная проверка осуществляется только тогда, когда в рамках предыдущего шага модуль был обнаружен в списке разрешенных при включенном параметраloading_control.check_hash.
Более подробно с контролем загрузки модулей можно ознакомиться в документации.
А что происходит, если проверка заканчивается неудачно?
В таком случае расширения или плагины блокируются, а в журнал аудита записываются соответствующие сообщения.
Практика: Включение параметра check_allow_list
-
По умолчанию параметр отключен. Включите его и перезагрузите сервер (
restart):[postgres@ServerName ~]$ vi $PGDATA/postgresql.confloading_control.check_allow_list = 'on'[postgres@ServerName ~]$ exit[student@ServerName ~]$ sudo systemctl restart postgresql[student@ServerName ~]$ sudo su - postgres[postgres@ServerName ~]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)Type "help" for help.А если при запуске psql получено предупреждение
WARNING: Library "<library>.so" is not loaded, no file in list?Если получено предупреждение о том, что библиотека
<library>.soне установлена.- В логе появляются записи:
[postgres@ServerName 06]$ cd /pgerrorlogs/06[postgres@ServerName 06]$ less postgresql-2025-10-09_100600.log...2025-10-09 10:06:00.790 MSK [1377] DEBUG: Will be opened file /pgdata/06/data/pg_integrity/integrity_files.json to control the integrity of objects2025-10-09 10:06:19.895 MSK [1379] DEBUG: Will be opened file /pgdata/06/data/pg_integrity/integrity_files.json to control the integrity of objects2025-10-09 10:06:19.896 MSK [1379] WARNING: Library "<library>.so" is not loaded, no file in list...-
Добавьте библиотеку
<library>.soв список разрешенных:postgres@postgres=# SELECT pg_integrity_add_file('/usr/pangolin-6.7/lib/<library>.so');┌───────────────────────┐│ pg_integrity_add_file │├───────────────────────┤│ t │└───────────────────────┘(1 row)postgres@postgres=# \q -
Перезагрузите сервер:
[UserName@ServerName ~]$ sudo systemctl restart postgresql -
Убедитесь, что библиотека подключена – при запуске не появляется предупреждение о неподключенной библиотеке:
[postgres@ServerName ~]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)Type "help" for help. -
В логе появятся записи:
[postgres@ServerName 06]$ less postgresql-2025-10-09_101138.log...2025-10-09 10:11:39.042 MSK [1412] DEBUG: Will be opened file /pgdata/06/data/pg_integrity/integrity_files.json to control the integrity of objects2025-10-09 10:11:43.281 MSK [1414] DEBUG: Will be opened file /pgdata/06/data/pg_integrity/integrity_files.json to control the integrity of objects2025-10-09 10:11:43.283 MSK [1414] DEBUG: library "<library>" is loaded...
Практика: Включение параметра check_hash
-
Включите параметр:
[postgres@ServerName ~]$ vi $PGDATA/postgresql.confloading_control.check_hash = 'on'[UserName@ServerName lib]$ sudo systemctl restart postgresql -
Добавьте расширение
pg_orphanedв список разрешенных:ПримечаниеДля добавления файлов под контроль используется функция
pg_integrity_add_file.При обновлении конфигурационного файла в директории
$PGDATA/pg_integrityсписок разрешенных модулей считается эталонным, поэтому принудительное обновление контрольных суммы объектов (при необходимости) - обязанность администратора СУБД.postgres@postgres=# SELECT pg_integrity_add_file('/usr/pangolin-6.7/lib/pg_orphaned.so');┌───────────────────────┐│ pg_integrity_add_file │├───────────────────────┤│ t │└───────────────────────┘(1 row)postgres@postgres=# \q -
Измените хеш библиотеки
pg_orphanedв файлеintegrity_files.json, например, добавим в конец хеша символ1:[postgres@ServerName ~]$ cd /pgdata/06/data/pg_integrity[postgres@ServerName pg_integrity]$ vi integrity_files.jsonПосле чего перезагрузите сервер:
[student@ServerName ~]$ sudo systemctl restart pangolin -
Убедитесь, что в логе появилось предупреждение:
[postgres@ServerName lib]$ less /pgerrorlogs/06/postgresql-2025-10-09_102629.log...2025-10-09 10:26:29.872 MSK [1515] WARNING: The hash is different object: /usr/pangolin-6.7/lib/pg_orphaned.so... -
Попробуйте установить расширение:
[postgres@ServerName lib]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)Type "help" for help.postgres@postgres=# CREATE EXTENSION pg_orphaned;ERROR: Library "pg_orphaned.so" is not loaded, file is damagedПолучена ошибка.
-
Верните расширению исходное состояние:
[postgres@ServerName ~]$ cd /pgdata/06/data/pg_integrity[postgres@ServerName pg_integrity]$ vi integrity_files.json -
Проверьте работоспособность:
[postgres@ServerName ~]$ psqlPager is used for long output.Border style is 2.Line style is unicode.psql (15.5)Type "help" for help.postgres@postgres=# CREATE EXTENSION pg_orphaned;CREATE EXTENSIONpostgres@postgres=# \dxList of installed extensions┌─────────────┬─────────┬────────────┬────────────────────────────────────────────┐│ Name │ Version │ Schema │ Description │├─────────────┼─────────┼────────────┼────────────────────────────────────────────┤│ pg_orphaned │ 1.0.c │ public │ deal with orphaned files(pangolin edition) ││ plpgsql │ 1.1 │ pg_catalog │ PL/pgSQL procedural language │└─────────────┴─────────┴────────────┴────────────────────────────────────────────┘(2 rows)Расширение успешно устанавливается.