Данная статья применима к:

  • Astra Linux

Где хранятся настройки аутентификации

Настройки аутентификации СУБД PostgeSQL хранятся в файле /etc/postgresql/<номер_версии>/<имя_кластера>/pg_hba.conf.
Где:

  • <номер_версии>:
    • 14 — Astra Linux Special Edition x.7 с подключенным расширенным репозиторием;
    • 11 — Astra Linux Special Edition x.7;
    • 9.6  — Astra Linux Special Edition 1.6 или 8.1.
  • <имя_кластера> — по умолчанию main.

Настройка "по умолчанию" после установки postgresql

Часть настроек, рассматриваемая в настоящей статье, после установки выглядит так:

local   all             postgres                                peer
local   all             all                                     peer
host    all             all             0.0.0.0/0            md5

Полное описание параметров аутентификации доступно по ссылке https://postgrespro.ru/docs/postgresql/11/auth-pg-hba-conf.
См. также: PostgreSQL с аутентификацией Kerberos в домене FreeIPA 

Беспарольная аутентификация локальных подключений с помощью собственной базы данных пользователей

Строка в конфигурационном файле /etc/postgresql/<номер_версии>/<имя_кластера>/pg_hba.conf:

local   all             all                                peer

Примеры:

  1. Команда:

    createdb <имя_БД>

    createdb: не удалось подключиться к базе template1: ВАЖНО:  роль <имя_пользователя> не существует
    Пояснение: по умолчанию подключение выполняется к локальной машине (localhost). При выполнении команды автоматически определено имя пользователя (текущий пользователь), и такое имя не найдено в собственной базе данных пользователей (далее - БДП).
    Итог выполнения команды: отказ в подключении.
    Для устранения отказа следует зарегистрировать пользователя в БДП;

  2. Регистрация текущего пользователя (роли) в БДП:

    sudo -u postgres psql -c "CREATE ROLE $USER LOGIN;"
    Пояснение: приведенная команда создает роль с именем, совпадающим с именем текущего пользователя (здесь и далее используется подстановка переменной окружения $USER, содержащей имя текущего пользователя).
    Имя роли, регистрируемое в БДП не обязательно должно совпадать с именем существующего пользователя ОС, но при работе с включенным МРД такие роли не смогут получить авторизацию, см. следующий пункт.
    Далее предполагается, что для текущего пользователя заведена роль с совпадающим именем;

  3. Команда:

    createdb <имя_БД>

    createdb: не удалось подключиться к базе template1: ВАЖНО:  error obtaining MAC configuration for user "<имя_пользователя>"
    Пояснение: аутентификация пользователя выполнена. Возникшая ошибка - не ошибка аутентификации, а ошибка авторизации (назначения мандатных прав доступа) при включенной поддержке МРД в СУБД и ОС. Для устранения ошибки:
        - либо выключить в СУБД использование МРД (см. документацию в части применения параметра ac_ignore_maclabel в файле /etc/postgresql/<номер_версии>/<имя_кластера>/postgresql.conf, а также см. описания уровней защиты ОС для Astra Linux x.7):
        - либо:

    1. Явно назначить классификационную метку пользователю (даже если это нулевая метка):

      sudo pdpl-user -l 0:0 $USER

    2. Предоставить служебному пользователю postgres право на чтение файла, содержащего классификационную метку пользователя. Например, для текущего пользователя:

      sudo setfacl -m u:postgres:r /etc/parsec/macdb/`id -u`

      Данная ошибка авторизации не возникает при отключенном МРД или если у пользователя уже есть явно заданная классификационная метка. Далее предполагается, что ошибка не возникает, т.е. метка существует (создана) и права доступа предоставлены.

      При включенном МРД для прохождения мандатной авторизации имя роли должно совпадать с именем пользователя ОС.
  4. Команда:

    createdb <имя_БД>

    createdb: создать базу данных не удалось: ОШИБКА:  нет прав на создание базы данных
    Пояснение: аутентификация и авторизация пользователя выполнена. Возникающая ошибка - не ошибка аутентификации, и не ошибка авторизации, а результат получения при авторизации недостаточных прав, как и указано в описании ошибки.
    Настройка прав пользователя выходит за рамки вопросов аутентификации и в данной статье не рассматривается.

Парольная аутентификация внешних подключений в БДП

Строка в конфигурационном файле /etc/postgresql/<номер_версии>/<имя_кластера>/pg_hba.conf:

host    all             all             0.0.0.0/0            md5

Пример:

  1. Команда:

    createdb -h <IP-адрес> <имя_БД>

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

  2. Задание пароля в БДП:

    sudo -u postgres psql -c "ALTER USER $USER WITH PASSWORD '<пароль>';"

  3. Команда:

    createdb -h <IP-адрес> <имя_БД>

    Пароль:
    createdb: создать базу данных не удалось: ОШИБКА:  нет прав на создание базы данных
    Пояснение: после ввода пароля, заданного в БДП, аутентификация и авторизация пройдены успешно, но права на создание новой базы данных отсутствуют.

Аутентификация внешних подключений с использованием PAM

Строка в конфигурационном файле /etc/postgresql/<номер_версии>/<имя_кластера>/pg_hba.conf:

host    all             all             0.0.0.0/0            pam
После смены типа аутентификации в конфигурационном файле для актуализации изменений перезапустить СУБД.
  1. В качестве пароля использовать пароль пользователя в ОС:

    createdb -h <IP-адрес> <имя_БД>

    Пароль:
    Пароль:
    Пароль:
    createdb: не удалось подключиться к базе template1: ВАЖНО:  пользователь "<имя_пользователя>" не прошёл проверку подлинности (PAM)
    ВАЖНО:  пользователь "<имя_пользователя>" не прошёл проверку подлинности (PAM)
    Эта ошибка может возникать при неправильно введенном пароле или при ошибках в PAM-стеке, но в рассматриваемом примере причиной ошибки является невозможность проверки введенного пароля из-за отсутствия доступа к файлу /etc/shadow (при этом пароль трактуется как неверный). Для устранения ошибки предоставить служебному пользователю postgresql право чтения файла /etc/shadow:
    sudo setfacl -m u:postgres:r /etc/shadow

  2. После предоставления служебному пользователю postgresql права чтения файла /etc/shadow аутентификация по паролю ОС (паролю из /etc/shadow) и дальнейшая авторизация выполняются успешно:

    createdb -h <IP-адрес> <имя_БД>

    Пароль:
    createdb: создать базу данных не удалось: ОШИБКА:  нет прав на создание базы данных
    После ввода пароля, заданного в ОС (в /etc/shadow) аутентификация и авторизация пройдены успешно, но права на создание БД отсутствуют.


  • No labels