Могу ли я создать пользователей, специфичных для хоста, в Postgres? (например, postgres@localhost)

Вопрос или проблема

Мой вопрос

Могу ли я установить разрешения для пользователя (например, postgres) так, чтобы он мог подключаться только с TCP localhost, но не из Интернета?

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

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

initdb \
            -D "$POSTGRES_DATA_DIR/" \
            --username postgres --pwfile "$PWFILE" \
            --auth-local=trust --auth-host=password

Интранет против Интернета

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

Для локального и интранет-доступа, однако, я предпочел бы иметь имя пользователя и пароль, которые я могу запомнить (и ввести).

Могу ли я сделать это… или мне нужно просто создать по одному пользователю для каждой системы, которая может подключаться, с .pgpass на каждой?
(Я не хочу делиться ключами в виде простых текстовых файлов между компьютерами)

Обновление 2025

Я создал несколько скриптов для управления удаленными пользователями через группы hba:

Основная магия заключается в создании роли sameuser с именем remote_users (или как вам нравится)

CREATE ROLE "remote_users" NOLOGIN;

pg_hba.conf

hostssl sameuser         +remote_users        0.0.0.0/0               scram-sha-256
hostssl sameuser         +remote_users        ::0/0                   scram-sha-256

Затем любая база данных с пользователем с таким же именем в группе “remote_users” может подключаться:

CREATE DATABASE "my-user-prefix-1234";

CREATE ROLE "my-user-prefix-1234" LOGIN INHERIT IN ROLE "remote_users" ENCRYPTED PASSWORD 'supersecret';

GRANT ALL PRIVILEGES ON DATABASE "my-user-prefix-1234" to "my-user-prefix-1234";

Вы не предоставили информацию о вашей версии PostgreSQL, я предполагаю, что вы используете PostgreSQL 12.

Могу ли я установить разрешения для пользователя (например, postgres) так, чтобы он мог подключаться только с TCP localhost, но не из Интернета?

Да, используйте pg_hba.conf. Возможно, вам нужно будет сначала загрузить это через hba_file конфигурацию времени выполнения.

Для локального и интранет-доступа, однако, я предпочел бы иметь имя пользователя и пароль, которые я могу запомнить (и ввести).

Если вы хотите добавить локального пользователя, защищенного паролем, добавьте

local <database_name> <local-only_user_name> scram-sha-256 

в ваш pg_hba.conf.

Вам, вероятно, сначала нужно будет создать пользователя через CREATE ROLE:

CREATE ROLE username LOGIN ENCRYPTED PASSWORD 'insert-your-password-here';

Возможно, вы также захотите проверить записи host и hostssl, чтобы добавить в ваш pg_hba.conf для настройки вашей интранет- и интернет-авторизации.

Обратитесь к прикрепленным документам для получения дополнительной информации.

Ответ или решение

Конечно, вы можете настроить пользователя в PostgreSQL с ограничением доступа только с определённых узлов, таких как localhost. Это достигается с использованием конфигурационного файла pg_hba.conf. Он управляет методами аутентификации для клиентов, подключающихся к серверу базы данных.

Шаги для реализации

  1. Конфигурация pg_hba.conf:

    Чтобы обеспечить доступ к пользователю только с localhost, вы можете добавить строку следующего вида в файл pg_hba.conf:

    host    all    postgres    127.0.0.1/32    scram-sha-256

    Здесь:

    • host означает, что применимо к TCP/IP подключениям.
    • all — имя базы данных, к которой предоставляется доступ. Для всех баз данных используйте all.
    • postgres — имя пользователя, для которого применяется правило.
    • 127.0.0.1/32 — IP-адрес и маска сети, разрешающие подключение только с localhost.
    • scram-sha-256 — метод аутентификации. Вы можете выбрать другой метод, например, md5 или password.
  2. Создание пользователей и ролей:

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

    CREATE ROLE your_local_user LOGIN ENCRYPTED PASSWORD 'ваш_пароль';

    Для пользователей, которым нужен доступ с удалённых узлов, вы можете использовать группы ролей. Например, создать роль remote_users для управления интернет-пользователями:

    CREATE ROLE "remote_users" NOLOGIN;

    И добавить пользователей в эту роль:

    CREATE ROLE "remote_user_1" LOGIN INHERIT IN ROLE "remote_users" ENCRYPTED PASSWORD 'суперсекретныйпароль';
  3. Настройки для интернета и интрасети:

    Для пользователей, которым необходимо подключение с различных IP-адресов, используйте строки, подобные следующим в pg_hba.conf:

    hostssl     sameuser     +remote_users     0.0.0.0/0     scram-sha-256
    hostssl     sameuser     +remote_users     ::0/0         scram-sha-256

    Это позволяет пользователям из группы remote_users подключаться с любых IP-адресов по защищённому соединению (SSL).

Вывод

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

Используя методы и примеры, приведённые выше, вы сможете настроить PostgreSQL для управления доступом на основе специфических требований вашего приложения или организации.

Оцените материал
Добавить комментарий

Капча загружается...