В этой статье:

Создание пользователя базы данных

Создание базы данных

Создание пользовательской схемы в текущей базе данных

Поддержка типа данных Lo

Поддержка доменных групп

Обновление репозитория

Особенности работы с СУБД PostgreSQL

Подготовка сервера PostgreSQL

Процедура подготовки сервера PostgreSQL производится администратором СУБД.

Важно. Для обеспечения безопасности системы перед подготовкой сервера PostgreSQL проверьте настройки параметра lc_messages в конфигурационном файле postgresql.conf. Язык сообщений PostgreSQL должен совпадать с языковыми настройками операционной системы.

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

Создание пользователя базы данных

Для создания пользователя базы данных выполните скрипт:

CREATE ROLE "USER_NAME" LOGIN ENCRYPTED PASSWORD 'USER_PASSWORD' NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

Где:

Создание базы данных

Для создания базы данных выполните скрипт:

CREATE DATABASE "DATABASE_NAME" WITH OWNER = "USER_NAME" ENCODING = 'UTF8' TABLESPACE = pg_default  LC_COLLATE = default LC_CTYPE = default CONNECTION LIMIT = -1;

ALTER DATABASE "DATABASE_NAME" SET lo_compat_privileges = 'on';

GRANT ALL ON DATABASE "DATABASE_NAME" TO "USER_NAME";

Где:

Создание пользовательской схемы в текущей базе данных

По умолчанию используется схема public. При работе со схемой public учитывайте особенности, приведенные в разделе «Особенности работы с СУБД PostgreSQL».

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

CREATE SCHEMA "SCHEMA_NAME" AUTHORIZATION "USER_NAME";

Где:

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

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

SET search_path TO "SCHEMA_NAME";

После выполнения действий вместо схемы public по умолчанию будет использоваться пользовательская схема.

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

Поддержка типа данных Lo

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

CREATE FUNCTION loin (cstring) RETURNS lo AS 'oidin' LANGUAGE internal IMMUTABLE STRICT;

CREATE FUNCTION loout (lo) RETURNS cstring AS 'oidout' LANGUAGE internal IMMUTABLE STRICT;

CREATE FUNCTION lorecv (internal) RETURNS lo AS 'oidrecv' LANGUAGE internal IMMUTABLE STRICT;

CREATE FUNCTION losend (lo) RETURNS bytea AS 'oidsend' LANGUAGE internal IMMUTABLE STRICT;

CREATE TYPE lo (INPUT = loin, OUTPUT = loout, RECEIVE = lorecv, SEND = losend, INTERNALLENGTH = 4, PASSEDBYVALUE);

CREATE CAST (lo AS oid) WITHOUT FUNCTION AS IMPLICIT;

CREATE CAST (oid AS lo) WITHOUT FUNCTION AS IMPLICIT;

CREATE OR REPLACE FUNCTION lo_manage() RETURNS pg_catalog.trigger AS '$libdir/lo' LANGUAGE C;

После того как все шаги выполнены успешно можно перейти к созданию репозитория.

Поддержка доменных групп

При добавлении доменных групп в менеджере безопасности подготовьте сервер PostgreSQL для их поддержки.

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

Для поддержки доменных групп в PostgreSQL:

  1. Соберите скрипт синхронизации пользователей и групп из Active Directory или Astra Linux Directory с помощью системы управления версиями Git.

Предварительно установите RubyInstaller последней версии для работы с языком программирования 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

Запустите командную строку и выполните команды:

  • Debian-подобные дистрибутивы:

apt-get install ruby libpq-dev git make gcc libffi-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

После выполнения действий будет добавлена папка pg-ldap-sync с последними исходными файлами скрипта из Git и выполнена сборка скрипта.

  1. Создайте файл конфигурации lsync.yml с настройками, указанными в примере:

  2. # 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
       # задается атрибут из которого будет формироваться имя пользователя в Postgres обычно sAMAccountName
       name_attribute: sn
       # 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:

Примечание. Параметр ald_domain используется для поддержки доменных групп в Astra Linux Directory.

  1. Проверьте валидность созданного файла lsync.yml.

  2. Выполните скрипт:

Настройте автоматический запуск скрипта с помощью планировщика заданий Windows.

Настройте автоматический запуск скрипта с помощью утилиты Cron (Command Run ON) - система для автоматического запуска программ и скриптов на сервере в определённое время:

  1. Выполните команду для открытия и редактирования текстового редактора, в котором содержится список выполняемых команд:

crontab -e
  1. Выполните команду для добавления строки в текстовый редактор, при выполнении которой будет загружаться файл конфигурации lsync.yml:

*/<количество минут> * * * * /usr/local/bin/pg_ldap_sync -c <полный путь до файла конфигурации>/lsync.yml
  1. Дополнительно добавьте пустую строку.

  2. Сохраните изменения в текстовом редакторе.

После выполнения действий скрипт будет запускаться с указанной периодичностью, например, каждые 5 минут.

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

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

Обновление репозитория

В Prognoz Platform версии 8.1 был исправлен скрипт, связанный с регистрацией типа lo. Если репозиторий на базе СУБД PostgreSQL (версии 9.3 или выше) был создан в более ранних версиях Prognoz Platform, то его необходимо обновить, выполнив следующий скрипт:

CREATE OR REPLACE FUNCTION losend (lo) RETURNS bytea AS 'oidsend' LANGUAGE internal IMMUTABLE STRICT;

Особенности работы с СУБД PostgreSQL

Если при работе используется схема по умолчанию public, то у всех пользователей репозитория будет возможность создания таблиц. Это может привести к проблемам обновления пользователей и разграничению прав доступа у пользователей, которые являются администраторами репозитория. Для избежания возможных ошибок необходимо создавать все объекты только под пользователем, который создан на первом шаге и является владельцем и администратором схемы - ADMIN.

Конфигурация по умолчанию для серверов PostgreSQL включает в себя функцию автоочистки - освобождение пространства, занимаемого удалёнными из таблиц данными, с помощью SQL-команды VACUUM. Также производится обновление статистики, которая используется планировщиком для выбора способа выполнения запросов. Если предполагается интенсивная работа по изменению данных в таблицах, то рекомендуется настроить конфигурацию таким образом, чтобы автоочистка производилась в периоды малых нагрузок на сервер (ночью, в выходные). Настройку можно производить в соответствии с документацией, доступной на сайте разработчика.

См. также:

Подготовка серверной части СУБД