Перейти к основному содержимому

Контроль загрузки модулей с проверкой контрольных сумм

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

Алгоритм работы функциональности:

  1. Проверка наличия модуля в списке разрешенных к установке (check_allow_list): определяет, содержится ли загружаемый файл в предварительно заданном перечне доверенного ПО.

    Проверяемый конфигурационный файл находится в каталоге $PGDATA/pg_integrity, а сверка происходит только при включенном параметре loading_control.check_allow_list.

  2. Проверка контрольной суммы (check_hash): обеспечивает контроль целостности, гарантируя, что загружаемый модуль не был изменен или скомпрометирован. Данная проверка осуществляется только тогда, когда в рамках предыдущего шага модуль был обнаружен в списке разрешенных при включенном параметра loading_control.check_hash.

Более подробно с контролем загрузки модулей можно ознакомиться в документации.

А что происходит, если проверка заканчивается неудачно?

В таком случае расширения или плагины блокируются, а в журнал аудита записываются соответствующие сообщения.

Практика: Включение параметра check_allow_list​

  1. По умолчанию параметр отключен. Включите его и перезагрузите сервер (restart):

    [postgres@ServerName ~]$ vi $PGDATA/postgresql.conf
    loading_control.check_allow_list = 'on'
    [postgres@ServerName ~]$ exit
    [student@ServerName ~]$ sudo systemctl restart postgresql
    [student@ServerName ~]$ sudo su - postgres
    [postgres@ServerName ~]$ psql
    Pager 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 не установлена.

    1. В логе появляются записи:
    [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 objects
    2025-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 objects
    2025-10-09 10:06:19.896 MSK [1379] WARNING: Library "<library>.so" is not loaded, no file in list
    ...
    1. Добавьте библиотеку <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
    2. Перезагрузите сервер:

      [UserName@ServerName ~]$ sudo systemctl restart postgresql
    3. Убедитесь, что библиотека подключена – при запуске не появляется предупреждение о неподключенной библиотеке:

      [postgres@ServerName ~]$ psql
      Pager is used for long output.
      Border style is 2.
      Line style is unicode.
      psql (15.5)
      Type "help" for help.
    4. В логе появятся записи:

      [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 objects
      2025-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 objects
      2025-10-09 10:11:43.283 MSK [1414] DEBUG: library "<library>" is loaded
      ...

Практика: Включение параметра check_hash​

  1. Включите параметр:

    [postgres@ServerName ~]$ vi $PGDATA/postgresql.conf
    loading_control.check_hash = 'on'
    [UserName@ServerName lib]$ sudo systemctl restart postgresql
  2. Добавьте расширение 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
  3. Измените хеш библиотеки 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
  4. Убедитесь, что в логе появилось предупреждение:

    [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
    ...
  5. Попробуйте установить расширение:

    [postgres@ServerName lib]$ psql
    Pager 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

    Получена ошибка.

  6. Верните расширению исходное состояние:

    [postgres@ServerName ~]$ cd /pgdata/06/data/pg_integrity
    [postgres@ServerName pg_integrity]$ vi integrity_files.json
  7. Проверьте работоспособность:

    [postgres@ServerName ~]$ psql
    Pager 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 EXTENSION
    postgres@postgres=# \dx
    List 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)

    Расширение успешно устанавливается.

Подведем итоги​

Вопрос 1

Вопрос 1: Для чего предназначена функциональность контроля загрузки модулей?

Вопрос 2

Вопрос 2: Для чего используется функция pg_integrity_add_file()?