Оглавление |
---|
Информация | ||
---|---|---|
| ||
|
Тестовый пример
При написании статьи использовалась Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7) с установленной СУБД PostgreSQL 11 (далее - СУБД). Установка СУБД выполнялась при установке 1С в соответствии с инструкцией для использования с системой 1С (см. Установка и настройка сервера 1С v8.3.xx на ОС Astra Linux). Особенностью установки СУБД в данном случае является назначение пароля создаваемому при установке СУБД служебному пользователю postgresql. Команда для установки пароля:
Command |
---|
sudo -iu postgres psql -c "ALTER ROLE postgres WITH PASSWORD '<пароль>';" |
Подробнее см. Аутентификация в СУБД PostgreSQL.
В качестве базы данных (БД) использовалась далее используется предоставляемая разработчиками СУБД стандартная тестовая БД dvdrental, описанная в статье PostgreSQL Sample ..Database. Особенностью этой БД является то, что она принадлежит пользователю postgresql, поэтому примеры далее приведены с использованием привилегий этого пользователя.
Особенностью установки СУБД в данном случае является назначение пароля создаваемому при установке СУБД служебному пользователю postgresql. Команда для установки пароля:
Command |
---|
sudo -iu postgres psql -c "ALTER ROLE postgres WITH PASSWORD '12345678';" |
Отдельно приводятся рекомендации по созданию и настройке прав выделенного пользователя для выполнения операций резервного копирования и восстановления.
Для создания тестовой БД в PostgreSQL:
Загрузить архив с тестовой БД командой:
Command wget https://www.postgresqltutorial.com/wp-content/uploads/2019/05/dvdrental.zip Далее предполагается, что архив загружен в домашний текущий рабочий каталог текущего пользователя.
Распаковать архив:
Command unzip dvdrental.zip
В результате распаковки в текущем рабочем каталоге будет создан файл dvdrental.tar;
Для удобства работы, чтобы не вводить каждый раз пароль, настроить права доступа, для чего создать файл .pgpass, содержащий сроки, задающие пароли доступа. Каждая строка имеет вид:
Блок кода <имя_или_IP-адрес_хоста>:<IP-порт>:<имя_БД>:<имя_пользователя>:<пароль_пользователя>
Например:
Блок кода localhost:5432:dvdrental:postgres:пароль
Файл должен иметь маску прав доступа 600, иначе он будет игнорироваться. Создать файл можно с помощью любого текстового редактора, или, например, командами:
Command touch ~/.pgpass
chmod 600 ~/.pgpass
echo "localhost:5432:*:postgres:12345678" > ~/.pgpassДля примера использован пароль 12345678. Допускается использование метасимвола "*" для обозначения любого значения;
Создать базу данных с именем dvdrental:
Command psql -U postgres -h localhost -c 'CREATE DATABASE dvdrental;'
Предоставить пользователю postgresql доступ к распакованной распакованному файлу с дампом БД:
Command setfacl -m u:postgres:rx "$HOME" В данном случае Команда предоставляется доступ на поиск файлов в домашнем каталоге. Это действие может не требоваться в ранних обновлениях Astra Linux.
Загрузить архив дамп тестовой БД в БД PostgreSQLСУБД. Команда:
Command pg_restore -U postgres -h localhost -d dvdrental dvdrental.tar Указанная команда фактически является командой восстановления БД из архива.
Создание резервной копии базы данных
Для сохранения резервных копий БД в основном используются две команды:
- pg_dump - выгрузка указанной БД;
- pg_dumpall - выгрузка всех БД и метаданных.
Сохранение может выполняться в текстовом формате или в формате архива (опция -F).
При работе с несколькими кластерами (группами баз данных), расположенными на одной машине, для выбора кластера используется номер порта (опция -p).
Создание резервной копии базы данных от имени служебного пользователя postgresql
В простейшем случае создание резервных копий можно создавать от имени создаваемого при установке СУБД служебного пользователя postgresql. Более правильным вариантом является создание специального пользователя с правом только чтения (см. далее).
Примеры команд, выполняемых от имени пользователя postgresql:
Сохранение всех БД в текстовом формате:
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"
Эти сообщения не являются сообщениями об ошибках, и являются информацией о найденной максимальной классификационной метке сохраняемых записей.
Сохранения тестовой БД dvdrental в формате архива:
Command pg_dump -h localhost -U postgres -f dvdrental_dump.tar -F tar
Создание специального пользователя для
созданиявыгрузки резервных копий базы данных
Для примера в качестве специального пользователя используется текущий пользователь (во время работы в пользовательской сессии имя текущего пользователя находится в переменной окружения USER, и в командной строке подставляется вместо лексемы $USER).
Зарегистрировать пользователя в БД:
Command sudo -u postgres psql -c "CREATE ROLE $USER LOGIN CREATEDB;" - При работе с защищенной СУБД в Astra Linux Special Edition:
Предоставить служебному пользователю postgresql права доступа к базе данных классификационных меток пользователей (подробнее см. Списки управления доступом к файловым объектам (ACL) в Astra Linux):
Command sudo setfacl -d -m u:postgres:r /etc/parsec/macdb
sudo setfacl -m u:postgres:r /etc/parsec/macdb/*Создать классификационную метку пользователя, даже если она нулевая, если она не была создана ранее:
Command sudo pdpl-user -l 0:0 $USER
Предоставить пользователю права на чтение баз данных (таблиц и индексов):
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;"Если предполагается, что в будущем в базу данных будут добавляться новые таблицы, то можно сразу определить права доступа, разрешающие читать новые таблицы и индексы:
GRANT EXECUTE ON ALL FUNCTIONSCommand 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;"Далее выгрузка баз данных должна выполняться от имени текущего пользователя без использования sudo и служебного пользователя postgres:
Command pg_dump -d dvdrental -f out
pg_dump: [архиватор (БД)] ошибка при выполнении запроса: ОШИБКА: нет доступа к таблице customer
pg_dump: [архиватор (БД)] запрос: LOCK TABLE public.customer IN ACCESS SHARE MODE-F tar
Загрузка резервной копии базы данных
Перед загрузкой резервной копии содержимое БД должно быть очищено. Сделать это можно удалив и заново создав БД:
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). Эксплуатационная и дополнительная документация).
При выгрузке копий данных, хранящихся в защищенной БД (команды командной строки pg_dump, pg_dumpall, команда psql COPY TO), выполняется процедура аккумулирования классификационной метки. При этом классификационная метка для создаваемого файла резервной копии определяется как максимальная классификационная метка всех выгружаемых объектов данных, и по . По завершении выгрузки , данных выполняется попытка установки полученной классификационной метки на файл с выгруженными данными. Для назначения метки у пользователя, выполняющего команду pg_dump, должно иметься PARSEC-привилегия :
- пользователь, от имени которого выполняется команд выгрузки, должна иметь PARSEC-привилегию PARSEC_CAP_CHMAC,
- позволяющую изменять классификационные метки файловых объектов (см. Привилегии PARSEC);
- В соответствии с общими правилами МРД (см. Метка безопасности: структура и состав) каталог, содержащий файл выгрузки, должен иметь классификационную метку не меньшую, чем максимальная классификационная метка выгружаемых данных. Если в каталоге предполагается хранить резервные копии с разными классификационными метками, то в метке безопасности каталога должны использоваться флаги ccnr и irelax.
Если после выгрузки всех записей классификационную , а также каталог, в котором сохраняется файл должен иметь возможность содержать файлы с такой классификационной меткой. Установка классификационной метки на файлы, создающиеся при выгрузке данных с помощью команд pg_dump и pg_dumpall, требуется не строго, т.е. если метку не удалось установить, то файл остается с классификационной меткой, унаследованной от пользователя, запустившего командувыгрузки удаляется. Команда psql COPY TO ФАЙЛ работает аналогично в случаях, когда указывается файл вывода, за исключением того, что запись данных осуществляется в файл на сервере, а не на клиенте. Метка на файле так же требуется не строго, и если метку не удалось установить, то она наследуется от процесса - в данном случае от процесса postgres. Т.е. классификационная метка в таком случае зависит от метки процесса PostgreSQL (задается параметром PDPLabel в юните systemd службы postgresql). Отдельно обрабатывается команда psql TO SDOUT. При выполнении этой команды (аналог команды \copy из psql) установка классификационной метки не выполняется.
Уровень целостности выгружаемых данных наследуется либо от клиента (команды pg_dump, pg_dumpall, \copy в psql), либо от сервера (команда COPY TO ФАЙЛ).В соответствии с общими правилями МРД (см. Метка безопасности: структура и состав) каталог для хранения резервных копий должен иметь классификационную метку не меньшую, чем максимальная классификационная метка выгружаемых данных, а если в каталоге предполагается хранить резервные копии с разными классификационными метками - то в метке безопасности каталога дожен использоваться флаг ccnr. Как пример, создать каталог с нужной меткой безопасности Создать каталог с нужной меткой безопасности для хранения файлов выгрузки можно следующими командами:
Создать сам каталог, например:
Command sudo mkdir /var/backups-psql Присвоить созданному каталогу нужную максимальную метку безопасности, например:
Command sudo pdpl-file 3:63:-1:ccnr ,irelax /var/backups-psql
При этом для того, чтобы обеспечить достаточные права для назначения классификационной метки файлу с резервной копией команды выгрузки можно выполнять от sudo, или назначить PARSEC-привилегию PARSEC_CAP_CHMAC пользователю-администратору СУБД. Например:
Command |
---|
sudo usercaps -m 0x8 postgres |
Назначение привилегии пользователю полностью начнет действовать после следующего входа этого пользователя в пользовательскую сессию. Для того, чтобы оперативно включить действие назначенной привилегии в консоли можно перезапустить консоль следующей командой (потребуется ввести пароль пользователя):
Command |
---|
exec su - $USER |