Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление


Информация
titleДанная статья применима к:
  • Astra Linux Special Edition РУСБ.10015-01 и РУСБ.10015-10 (очередное обновление 1.78)
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)Astra Linux Special Edition 01 и РУСБ.1015210015-02 10 (очередное обновление 41.7)
  • Astra Linux Special Edition РУСБ.10015-01 37 (очередное обновление 17.67)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1 и исп. 2Astra Linux Special Edition РУСБ.10265-01 10152-02 (очередное обновление 84.17)
  • Astra Linux Common Edition 2.12


Тестовый пример

При написании статьи использовалась Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) с установленной СУБД PostgreSQL 11 (далее - СУБД). Установка СУБД выполнялась для использования с системой 1С (см. по инструкции из статьи Установка и настройка сервера 1С v8.3.xx на ОС Astra Linux). Особенностью установки СУБД в данном случае является назначение пароляслужебному пользователю postgresql, создаваемому при установке СУБД служебному пользователю postgresql. Команда для установки пароля:

Command

sudo -iu postgres psql -c "ALTER ROLE postgres WITH PASSWORD '<пароль>';"

Подробнее про использование паролей см.  в статье Аутентификация в СУБД PostgreSQL.

В качестве базы данных (БД) далее используется предоставляемая разработчиками СУБД  стандартная тестовая БД dvdrental, описанная в статье PostgreSQL Sample ..Database. Особенностью этой БД является то, что она принадлежит пользователю postgresql, поэтому примеры далее приведены с использованием привилегий этого пользователя. Отдельно приводятся рекомендации по созданию и настройке прав выделенного пользователя для выполнения операций резервного копирования и восстановления.

Список реально использующихся баз данных можно получить запустив командную оболочку postgresql и выполнив команду \l, например:

Command
Titlesudo -iu postgres psql

psql (15.4 (Debian 15.4-astra.se2+ci1))
Введите "help", чтобы получить справку.

postgres=# \l
                                                         Список баз данных
      Имя      |     Владелец      | Кодировка | LC_COLLATE  |  LC_CTYPE   | локаль ICU | Провайдер локали |     Права доступа     
---------------+-------------------+-----------+-------------+-------------+------------+------------------+-----------------------
 postgres      | postgres          | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |            | libc             | 
 template0     | postgres          | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |            | libc             | =c/postgres          +
               |                   |           |             |             |            |                  | postgres=CTc/postgres
 template1     | postgres          | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |            | libc             | =c/postgres          +
               |                   |           |             |             |            |                  | postgres=CTc/postgres
 template_rbac | pg_database_admin | UTF8      | ru_RU.UTF-8 | ru_RU.UTF-8 |            | libc             | 
(4 строки)


Для создания тестовой БД в PostgreSQL:

  1. Загрузить архив с тестовой БД командой:

    Command
    wget https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip

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

  2. Распаковать архив:

    Command

    unzip dvdrental.zip

    В результате распаковки в текущем рабочем каталоге будет создан файл dvdrental.tar;.

  3. Для удобства работы, чтобы не вводить каждый раз пароль, настроить права доступа, для чего создать :

    1. Создать файл .pgpass,

    содержащий сроки, задающие
    1. задающий пароли доступа. Каждая строка файла имеет вид:

      Блок кода
      <имя_или_IP-адрес_хоста>:<IP-порт>:<имя_БД>:<имя_пользователя>:<пароль_пользователя>

      Например:

      Блок кода
      localhost:5432:dvdrental:postgres:пароль

      Файл должен иметь маску прав доступа 600, иначе он будет игнорироваться. Создать файл можно с помощью любого текстового редактора, или, например, командами:

      Command

      touch ~/.pgpass
      chmod 600 ~/.pgpass
      echo "localhost:5432:*:postgres:12345678" > ~/.pgpass

      Для примера использован пароль 12345678. Допускается использование метасимвола "*" для обозначения любого значения;

  4. Создать базу данных с именем dvdrental:

    Command

    psql -U postgres -h localhost -c 'CREATE DATABASE dvdrental;'


  5. Предоставить пользователю postgresql доступ к распакованному файлу с дампом БД:

    Command
    setfacl -m u:postgres:rx "$HOME"

    Команда предоставляется доступ на поиск файлов в домашнем каталоге, в котором находится распакованный файл. Предполагается, что это домашней каталог. Это действие может не требоваться в ранних обновлениях Astra Linux.

  6. Загрузить дамп тестовой БД в СУБД. Команда:

    Command
    pg_restore -U postgres -h localhost -d dvdrental dvdrental.tar

    Указанная команда фактически является командой восстановления БД из архива.

Создание резервной копии базы данных

Для сохранения резервных копий БД в основном используются две команды:

  • pg_dump - выгрузка указанной БД;
  • pg_dumpall - выгрузка всех БД и метаданных.

Сохранение может выполняться в текстовом формате или в формате архива (опция -F).

При работе с несколькими кластерами (группами баз данных), расположенными на одной машине, для выбора кластера используется номер порта (опция -p).

Создание резервной копии базы данных от имени служебного пользователя postgresql

В простейшем случае создание резервных копий можно создавать от имени создаваемого при установке СУБД служебного пользователя postgresql. Более правильным вариантом является создание специального пользователя с правом только чтения (см. далее).
Примеры команд, выполняемых от имени пользователя postgresql:

  1. Сохранение всех БД в текстовом формате:

    Command

    pg_dumpall -h localhost -U postgres -f postgresql_dump


    Информация

    При работе с защищенной версией СУБД PostgreSQL (в Astra Linux Special Edition) при выгрузке БД могут выдаваться сообщения вида:

    Блок кода
    pg_dump: obtained maximum maclabel {0,0} of data in table "actor"

    Эти сообщения не являются сообщениями об ошибках, и являются информацией о найденной максимальной классификационной метке сохраняемых записей.


  2. Сохранения только тестовой БД dvdrental в формате архива (последний аргумен указывает имя сохраняемой БД):

    Command
    pg_dump -h localhost -U postgres -f dvdrental_dump.tar -F tar dvdrental


Создание специального пользователя для выгрузки резервных копий базы данных

Для примера в качестве специального пользователя используется текущий пользователь (во время работы в пользовательской сессии имя текущего пользователя находится в переменной окружения USER, и в командной строке подставляется вместо лексемы $USER). 

  1. Зарегистрировать пользователя в БД:

    Command
    sudo -u postgres psql -c "CREATE ROLE $USER LOGIN CREATEDB;"


  2. При работе с защищенной СУБД в Astra Linux Special Edition:
    1. Предоставить служебному пользователю postgresql права доступа к базе данных классификационных меток пользователей (подробнее см. Списки управления доступом к файловым объектам (ACL) в Astra Linux):

      Command
      sudo setfacl -d -m u:postgres:r /etc/parsec/macdb
      sudo setfacl    -m u:postgres:r /etc/parsec/macdb/*


    2. Создать классификационную метку пользователя, даже если она нулевая, если она не была создана ранее. Это действие требуется выполнить даже если метка пользователя нулевая. Пример создания нулевой метки:

      Command
      sudo pdpl-user -l 0:0 $USER


  3. Предоставить пользователю права на чтение баз данных (таблиц и индексов). Далее в примере предполагается, что в базе данных используется только одна схема public. Если это не так, то права доступа нужно предоставить ко всем используемым схемам. Получить список схем базы данных можно командой:

    Command

    sudo -u postgres psql -d <имя_базы_данных> -c "select schema_name from information_schema.schemata;"

    Пример вывода команды:


    Command
    Titlesudo -u postgres psql -d test_database -c "select schema_name from information_schema.schemata;"

        schema_name     
    --------------------
     test_schema
     pg_toast
     information_schema
     pg_catalog
     public
     pg_toast_temp_1
     pg_temp_1
    (7 строк)

    Схемы, названия которых начинаются с префикса pg_ и схема information_schema являются служебными, и доступ к ним предоставлять не требуется.
    Предоставление всех прав доступа к схеме public базы данных dvdrental:

    Command
    sudo -u postgres psql -d dvdrental -c "GRANT SELECT  ON ALL TABLES    IN SCHEMA public TO $USER;"
    sudo -u postgres psql -d dvdrental -c "GRANT SELECT  ON ALL SEQUENCES IN SCHEMA public TO $USER;"


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

    Command
    sudo -u postgres psql -d dvdrental -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO $USER;"
    sudo -u postgres psql -d dvdrental -c "ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON SEQUENCES TO $USER;"


  5. Далее выгрузка баз данных должна выполняться от имени текущего пользователя без использования sudo и служебного пользователя postgres:

    Command
    pg_dump -d dvdrental -f out -F tar dbrental


Загрузка резервной копии базы данных

Перед загрузкой резервной копии содержимое БД должно быть очищено. Сделать это можно удалив и заново создав БД:

Command
psql -U postgres -h localhost -c 'DROP DATABASE dvdrental;'
psql -U postgres -h localhost -c 'CREATE DATABASE dvdrental;'

Загрузка БД, сохраненной в текстовом формате:

Command
psql -U postgres -h localhost dvdrental < dvdrental_dump

Загрузка БД, сохраненной в формате архива:

Command
pg_restore -U postgres -h localhost -d dvdrental dvdrental_dump

Подробная справка по всем командам доступна в справочной системе MAN.

Особенности

работы с данными, имеющими

выгрузки данных, имеющих ненулевые классификационные метки

Защищенная СУБД PostgreSQL, применяемая в Astra Linux Special Edition, поддерживает управление доступом к записям БД с учетом классификационных меток записей (см. соответствующую документацию на изделия, например, Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7). Эксплуатационная и дополнительная документация).

При выгрузке данных, хранящихся в защищенной БД настройках СУБД принятых по умолчанию для выгрузки базы данных должны  быть выполнены следующие условия:

  • Каталог, в котором будет размещен файл выгрузки, должен иметь классификационную метку не меньшую, чем максимальная классификационная метка выгружаемых данных. Если в каталоге предполагается хранить резервные копии с разными классификационными метками, то в метке безопасности каталога должен быть включен флаг ccnr. Уровень целостности файла выгрузки наследуется либо от клиента (команды командной строки pg_dump, pg_dumpall,
команда psql
  • \copy в psql), либо от сервера (команда ЗСУБД COPY TO ФАЙЛ)
, выполняется процедура аккумулирования классификационной метки. При этом классификационная метка для создаваемого файла резервной копии определяется как максимальная классификационная метка всех выгружаемых объектов данных. По завершении выгрузки данных выполняется попытка установки полученной классификационной метки на файл с выгруженными данными. Для назначения метки:
  • .
  • Если выгрузка выполняется не от имени суперпользователя (от имени непривилегированного пользователя), то: команд выгрузки
    • выгрузка,
    должна
    • должен иметь
    PARSEC-
    • действующую мандатную привилегию PARSEC_CAP
    _CHMAC, позволяющую изменять классификационные метки файловых объектов ;
  • В соответствии с общими правилами МРД (см. Метка безопасности: структура и состав) каталог, содержащий файл выгрузки, должен иметь классификационную метку не меньшую, чем  максимальная классификационная метка выгружаемых данных. Если в каталоге предполагается хранить резервные копии с разными классификационными метками, то в метке безопасности каталога должны использоваться флаги ccnr и irelax.

Если после выгрузки всех записей классификационную метку не удалось установить, то файл выгрузки удаляется. Команда psql COPY TO работает аналогично в случаях, когда указывается файл вывода, за исключением того, что запись данных осуществляется в файл на сервере, а не на клиенте. Метка на файле так же требуется не строго, и если метку не удалось установить, то она наследуется от процесса - в данном случае от процесса postgres. Т.е. классификационная метка в таком случае зависит от метки процесса PostgreSQL (задается параметром PDPLabel в юните systemd службы postgresql). Отдельно обрабатывается команда psql TO SDOUT. При выполнении этой команды (аналог команды \copy из psql) установка классификационной метки не выполняется.

Уровень целостности выгружаемых данных наследуется либо от клиента (команды pg_dump, pg_dumpall, \copy в psql), либо от сервера (команда COPY TO ФАЙЛ).
    • .
    • Пользователь, осуществляющий выгрузку данных, должен иметь:
      • Право открывать сессии с классификационной меткой не ниже максимальной метки выгружаемых данных. Определяется максимальной классификационной меткой пользователя.
      • Право выполнять запись в каталог, предназначенный для выгрузки. Определяется дискреционным и мандатными масками доступа, установленными для каталога, и меткой безопасности текущей сессии пользователя.
      • Мандатную привилегию PARSEC — привилегию PARSEC_CAP_CHMAC.
    • Выгрузка данных должна выполняться из пользовательской сессии с классификационной меткой не ниже максимальной классификационной метки выгружаемых данных.

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

  1. параметру СУБД присвоить значение true:
    Command
    sudo pg_conftool <версия_кластера> <имя_кластера> set ac_ignore_socket_maclabel false
    где <версия_кластера> — 11 для postgresql-11 и 15 для postgresql-15, <имя_кластера> - по умолчанию main.
  2. Перезапустить СУБД:
    Command

    sudo pg_ctlcluster <версия_кластера> <имя_кластера> restart


Создание каталога с максимальной меткой безопасности

Создать каталог с нужной меткой безопасности для хранения файлов выгрузки можно следующими командами:

  1. Создать сам каталог, например:

    Command
    sudo mkdir /var/backups-psql


  2. Присвоить созданному каталогу максимальную метку безопасности , напримери флаги ccn (см. Метка безопасности: структура и состав). Например:

    Command
    sudo pdpl-file 3:63:-1:ccnr ,irelax /var/backups-psql


Присвоение пользователю мандатных привилегий

Присвоить нужные мандатные привилегии пользователю можно командой usercapsПри этом для того, чтобы обеспечить достаточные права для назначения классификационной метки файлу с резервной копией команды выгрузки можно выполнять от sudo, или назначить PARSEC-привилегию PARSEC_CAP_CHMAC пользователю-администратору СУБД. Например:

Command
sudo usercaps -m 0x8 postgres

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

Command
exec su - $USER