Вопрос или проблема
Мой вопрос
Могу ли я установить разрешения для пользователя (например, 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
. Он управляет методами аутентификации для клиентов, подключающихся к серверу базы данных.
Шаги для реализации
-
Конфигурация
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
.
-
Создание пользователей и ролей:
Для создания пользователя с определёнными настройками используйте следующую команду 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 'суперсекретныйпароль';
-
Настройки для интернета и интрасети:
Для пользователей, которым необходимо подключение с различных 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 для управления доступом на основе специфических требований вашего приложения или организации.