В этой статье:
Создание пользователя базы данных
Создание пользовательской схемы в текущей базе данных
Процедура подготовки сервера PostgreSQL производится администратором СУБД.
Важно. Для обеспечения безопасности системы перед подготовкой сервера PostgreSQL проверьте настройки доступа к серверу в конфигурационном файле pg_hba.conf и настройки параметра lc_messages в конфигурационном файле postgresql.conf. Язык сообщений PostgreSQL должен совпадать с языковыми настройками операционной системы. Также параметр standard_conforming_strings должен иметь значение «on».
Для подготовки сервера PostgreSQL выполните скрипты любым из доступных способов, например, с помощью приложения pgAdmin или консоли psql. При выполнении скриптов учитывайте следующие особенности:
параметры USER_NAME, DATABASE_NAME и SCHEMA_NAME должны быть прописаны в верхнем регистре;
наименования параметров регистрозависимые и должны быть указаны в кавычках. Если кавычки пропущены, то при выполнении скрипта в СУБД наименования параметров будут преобразованы к нижнему регистру;
выполнение скриптов должно производиться администратором СУБД с привилегией SUPERUSER, если при подготовке сервера PostgreSQL используется консоль psql.
Совет. Для подготовки сервера PostgreSQL в ОС Linux используйте готовый скрипт. После выполнения скрипта будет создан пользователь базы данных NEW_USER с паролем NEW_USER, база данных NEW_DATABASE, репозиторий с идентификатором NEW_DATABASE и служебный пользователь SERVICE_USER с паролем SERVICE_USER.
Для создания пользователя базы данных выполните скрипт:
CREATE ROLE "USER_NAME" LOGIN ENCRYPTED PASSWORD 'USER_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
Где:
USER_NAME. Имя создаваемого пользователя;
Важно. Имя пользователя ADMIN недопустимо для использования.
USER_PASSWORD. Пароль создаваемого пользователя.
Для создания базы данных выполните скрипт:
CREATE DATABASE "DATABASE_NAME" WITH OWNER = "USER_NAME" ENCODING = 'UTF8' TABLESPACE = pg_default LC_COLLATE = default LC_CTYPE = default CONNECTION LIMIT = -1;
GRANT ALL ON DATABASE "DATABASE_NAME" TO "USER_NAME";
Где:
USER_NAME. Имя пользователя, созданного ранее;
DATABASE_NAME. Имя создаваемой базы данных.
При создании базы данных используется единственная поддерживаемая кодировка - UTF-8.
Важно. Создание базы данных выполняется через служебную базу данных postgres по умолчанию. Для дальнейшей подготовки сервера СУБД подключитесь к созданной базе данных.
По умолчанию используется схема public.
Если в текущей базе данных предполагается использование пользовательской схемы, то для её создания выполните скрипт:
CREATE SCHEMA "SCHEMA_NAME" AUTHORIZATION "USER_NAME";
Где:
USER_NAME. Имя пользователя, созданного ранее;
SCHEMA_NAME. Идентификатор пользовательской схемы.
После выполнения действий будет создана пользовательская схема. Созданный на первом этапе пользователь будет являться владельцем схемы.
Для получения подробной информации о работе с пользовательскими схемами обратитесь к документации PostgreSQL.
При добавлении доменных групп в менеджере безопасности подготовьте сервер PostgreSQL для их поддержки.
Примечание. Поддержка доменных групп в PostgreSQL доступна, если на уровне СУБД содержатся группы в виде ролей и пользователи, входящие в эти роли.
Для поддержки доменных групп в PostgreSQL:
Соберите скрипт синхронизации пользователей и групп из Active Directory или Astra Linux Directory с помощью системы управления версиями Git.
В ОС Linux убедитесь, что установлен язык программирования Ruby версии 3.2 и ниже, который используется при сборке скрипта.
Запустите командную строку и выполните команды:
Debian-подобные дистрибутивы:
apt-get install
ruby libpq-dev git make gcc libffi-dev ruby-dev
git clone https://github.com/afsight/pg-ldap-sync.git
cd pg-ldap-sync
gem install bundler -v 1.16
bundle _1.16_ install
bundle install
bundle exec rake install
RedHat-подобные дистрибутивы:
dnf install
ruby libpq-devel git make gcc libffi-devel ruby-devel redhat-rpm-config
git clone https://github.com/afsight/pg-ldap-sync.git
cd pg-ldap-sync
gem install bundler -v 1.16
bundle _1.16_ install
bundle install
bundle exec rake install
ALT Linux:
apt-get install
ruby libpq-devel git make gcc5 libffi-devel ruby-tools postgresql-devel
libruby-devel
git clone https://github.com/afsight/pg-ldap-sync.git
cd pg-ldap-sync
gem install bundler -v 1.16
bundle _1.16_ install
bundle install
bundle exec rake install
В ОС Windows предварительно установите RubyInstaller версии 3.2 и ниже для работы с языком программирования Ruby, который используется при сборке скрипта.
Запустите командную строку Git CMD и выполните команды:
git clone https://github.com/afsight/pg-ldap-sync.git
cd pg-ldap-sync
gem install bundler -v 1.16
bundle _1.16_ install
bundle install
bundle exec rake install
После выполнения действий будет добавлена папка pg-ldap-sync с последними исходными файлами скрипта из Git и выполнена сборка скрипта.
Создайте файл конфигурации lsync.yml вручную. Пример файла lsync.yml при использовании Active Directory:
# With this sample
config the distinction between LDAP-synchronized
# groups/users from is done by the membership to ldap_user and
# ldap_group. These two roles has to be defined manually before
# pg_ldap_sync can run.
# Параметры соединения с сервером LDAP на примере AD. В username пользователь,
у которого есть права на подключение (практически любой доменный пользователь
и пароль)
# see also: http://net-ldap.rubyforge.org/Net/LDAP.html#method-c-new
ldap_connection:
host: domain-controller.domain.com
port: 389
auth:
method: :simple
username: username@domain.com
password: password
# encryption:
# method: :simple_tls
# Настройки поиска пользователей, в данном случае пользователи берутся
из раздела OU=Users, DC=domain, DC=com
ldap_users:
base: OU=users,DC=domain,DC=com
# LDAP filter (according to RFC 2254)
# defines to users in LDAP to be synchronized
# далее идет фильтр вхождений в раздел, ищутся только
собственно пользователи по классам объектов, также можно указать выборку
по другим атрибутам
filter: (&(objectClass=person)(objectClass=organizationalPerson)(givenName=*)(sn=*)(sAMAccountName=*))
# this attribute is used as PG role name
# задается атрибут из которого будет формироваться
имя пользователя в СУБД
name_attribute: sAMAccountName
# lowercase name for use as PG role name
# настройка перевода имени пользователя в нижний
регистр
lowercase_name: false
# uppercase name for use as PG role name
# настройка перевода имени пользователя в верхний
регистр (предпочтительно для работы с платформой)
uppercase_name: false
# Search parameters for LDAP groups which should be synchronized
# Всё то же самое для групп
ldap_groups:
base: OU=users,DC=domain,DC=com
filter: (cn=domain.*)
# this attribute is used as PG role name
name_attribute: cn
# lowercase name for use as PG role name
lowercase_name: false
# uppercase name for use as PG role name
uppercase_name: false
# this attribute must reference to all member
DN's of the given group
member_attribute: member
# True if use Astra Linux Domain
ald_domain: false
# Connection parameters to PostgreSQL server
# Параметры подключения к серверу PostgreSQL
# see also: http://rubydoc.info/gems/pg/PG/Connection#initialize-instance_method
pg_connection:
host: database_host
dbname: postgres
user: postgres
password: postgres
pg_users:
# Filter for identifying LDAP generated users
in the database.
# Фильтр пользователей для создания и проверки,
нужна отдельная роль, в данном случае ldap_users,пользователи в ней
будут сравниваться с тем что пришло поиском и удаляться или добавляться
в случае различий
# It's the WHERE-condition to "SELECT
rolname, oid FROM pg_roles"
filter: oid IN (SELECT pam.member FROM pg_auth_members
pam JOIN pg_roles pr ON pr.oid=pam.roleid WHERE pr.rolname='ldap_users')
# Options for CREATE RULE statements
create_options: LOGIN IN ROLE ldap_users
pg_groups:
# Filter for identifying LDAP generated groups
in the database.
# То же самое для групп
# It's the WHERE-condition to "SELECT
rolname, oid FROM pg_roles"
filter: oid IN (SELECT pam.member FROM pg_auth_members
pam JOIN pg_roles pr ON pr.oid=pam.roleid WHERE pr.rolname='ldap_groups')
# Options for CREATE RULE statements
create_options: NOLOGIN IN ROLE ldap_groups
grant_options:
Примечание. При создании файла lsync.yml в Astra Linux Directory используйте значение «cn» вместо «sAMAccountName» и задайте значение true в параметре ald_domain. Параметр ald_domain используется для поддержки доменных групп в Astra Linux Directory.
Проверьте валидность созданного файла lsync.yml.
Выполните скрипт:
для одноразовой синхронизации пользователей и групп запустите скрипт с помощью команды:
/usr/local/bin/pg_ldap_sync -c <полный путь до файла конфигурации>/lsync.yml
После выполнения действия скрипт будет запущен и синхронизация выполнится один раз.
для периодической синхронизации пользователей и групп:
В ОС Linux настройте автоматический запуск скрипта с помощью утилиты Cron (Command Run ON) - система для автоматического запуска программ и скриптов на сервере в определённое время:
Выполните команду для открытия и редактирования текстового редактора, в котором содержится список выполняемых команд:
crontab -e
Выполните команду для добавления строки в текстовый редактор, при выполнении которой будет загружаться файл конфигурации lsync.yml:
*/<количество минут> * * * * /usr/local/bin/pg_ldap_sync -c <полный путь до файла конфигурации>/lsync.yml
Дополнительно добавьте пустую строку.
Сохраните изменения в текстовом редакторе.
После выполнения действий скрипт будет запускаться с указанной периодичностью, например, каждые 5 минут.
В ОС Windows настройте автоматический запуск скрипта с помощью планировщика заданий Windows.
Распределите привилегии между доменными группами в менеджере безопасности. После чего для пользователей соответствующих групп будут раздаваться гранты на таблицы репозитория.
После выполнения действий для пользователей, входящих в добавленные доменные группы, будет доступно подключение и работа с репозиторием.
В «Форсайт. Аналитическая платформа» версии 10.9 и ниже для хранения двоичных данных в СУБД используется тип данных Lo. Начиная с версии 10.10, в качестве замены типа данных Lo при создании новых репозиториев используется тип данных bytea по умолчанию.
Репозитории, созданные в предыдущих версиях продукта и использующие тип данных Lo, поддерживаются без ограничений. При необходимости можно перевести репозиторий на работу с типом данных bytea вместо Lo за счёт преобразования системных и пользовательских таблиц, заменив поля с типом данных Lo на поля с типом данных bytea. Системные таблицы преобразовываются автоматически в процессе обновления версии репозитория средствами менеджера репозитория, пользовательские таблицы преобразовываются вручную.
Примечание. Одновременное использование типа данных Lo и bytea в рамках одного репозитория недоступно.
Для преобразования пользовательских таблиц, содержащих поля с типом данных Lo, в таблицы, содержащие поля с типом данных bytea:
Убедитесь, что версия СУБД PostgreSQL соответствует одной из поддерживаемых версий. Для получения используемой версии СУБД выполните команду:
SELECT version();
Если версия не поддерживается, то обновите её.
Убедитесь, что выполнено резервное копирование целевого репозитория и базы данных.
Выполните скрипт от имени пользователя postgres или администратора СУБД с привилегией SUPERUSER для преобразования таблиц:
begin;
do $$
declare
r record;
col_name varchar;
begin
for r in select a.table_name, a.column_name from
information_schema.columns a,
information_schema.tables b
where a.table_schema = 'public' and -- вместо схемы 'public' укажите
пользовательскую схему при необходимости
a.table_name = b.table_name and
a.table_schema = b.table_schema and
a.udt_name='lo' and
b.table_type='BASE TABLE' and a.table_name not like 'b_%'
loop
col_name = r.column_name || '_tmp';
execute format('alter table %I add column %I bytea', r.table_name,
col_name);
execute format('update %I as a set %I = lo_get(b.oid) from pg_largeobject_metadata
b where a.%I = b.oid', r.table_name, col_name, r.column_name);
execute format('select lo_unlink(oid) from pg_largeobject_metadata
a, %I b where b.%I = a.oid', r.table_name, r.column_name);
execute format('alter table %I drop column %I', r.table_name, r.column_name);
execute format('alter table %I rename column %I to %I', r.table_name,
col_name, r.column_name);
end loop;
end $$;
commit;
Если скрипт выполнен без ошибок, то перейдите к следующему шагу.
При возникновении ошибок, связанных с преобразованием таблиц, например, если на основе указанной таблицы создано представление, выполните команду для сброса изменений:
ROLLBACK
После чего пересоздайте представление и повторно выполните скрипт.
Обновите версию репозитория метаданных в менеджере репозитория: в ОС Linux, Windows.
Удалите лишние данные на сервере СУБД:
VACUUM FULL
Обновите права пользователей и групп пользователей в менеджере безопасности.
После выполнения действий пользовательские таблицы, содержащие поля с типом данных Lo, будут преобразованы в таблицы, содержащие поля с типом данных bytea. При преобразовании таблиц сохраняются исходные данные.
Конфигурация по умолчанию для серверов PostgreSQL включает в себя функцию автоочистки - освобождение пространства, занимаемого удалёнными из таблиц данными, с помощью SQL-команды VACUUM. Также производится обновление статистики, которая используется планировщиком для выбора способа выполнения запросов. Если предполагается интенсивная работа по изменению данных в таблицах, то рекомендуется настроить конфигурацию таким образом, чтобы автоочистка производилась в периоды малых нагрузок на сервер (ночью, в выходные). Настройку можно производить в соответствии с документацией, доступной на сайте разработчика.
В примере содержатся все части выделенных скриптов для СУБД PostgreSQL:
скачайте и распакуйте архив Script_example_public.zip, если используется схема public;
скачайте и распакуйте архив Script_example_custom_scheme.zip, если используется пользовательская схема.
См. также: