Представь, что твоя PostgreSQL база — это многоэтажное здание с ценными данными. Пользователи — это ключи от разных комнат. Без правильной настройки кто угодно может попасть куда угодно. Давай разберем, как грамотно настроить пользователей в PostgreSQL, чтобы обеспечить безопасность и эффективное управление доступом.
Основные концепции: пользователи и роли
В PostgreSQL понятия "пользователь" и "роль" практически идентичны. С версии 8.1 роль может быть как пользователем (с возможностью входа), так и группой. Это дает гибкость в управлении правами.
Создание нового пользователя
Давай начнем с базовых команд. Создадим пользователя для веб-приложения:
-- Создание пользователя с паролем
CREATE USER webapp_user WITH PASSWORD 'StrongPassword123!';
-- Альтернативный синтаксис (CREATE ROLE с LOGIN)
CREATE ROLE api_user WITH LOGIN PASSWORD 'AnotherStrongPass!';
-- Создание пользователя с дополнительными параметрами
CREATE USER analyst WITH
PASSWORD 'AnalystPass2024'
VALID UNTIL '2025-12-31'
CONNECTION LIMIT 10;
Просмотр существующих пользователей
-- Просмотр всех ролей/пользователей
SELECT rolname, rolcanlogin, rolconnlimit, rolvaliduntil
FROM pg_roles
WHERE rolcanlogin = true;
-- Детальная информация
\du
\du+
Управление правами и привилегиями
Права доступа — сердце настройки пользователей. PostgreSQL использует систему привилегий GRANT/REVOKE.
Базовые привилегии на уровне базы данных
-- Дать права на подключение к базе
GRANT CONNECT ON DATABASE mydb TO webapp_user;
-- Дать права на создание схем в базе
GRANT CREATE ON DATABASE mydb TO developer_role;
-- Запретить подключение
REVOKE CONNECT ON DATABASE sensitive_db FROM public;
Привилегии на уровне таблиц
-- Дать SELECT, INSERT, UPDATE на конкретную таблицу
GRANT SELECT, INSERT, UPDATE ON users TO api_user;
-- Дать все права на таблицу
GRANT ALL PRIVILEGES ON orders TO manager_role;
-- Дать права на все таблицы в схеме
GRANT SELECT ON ALL TABLES IN SCHEMA public TO report_user;
-- Настроить права по умолчанию для будущих таблиц
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO webapp_user;
Работа с ролями и группами
Групповые роли упрощают управление правами для категорий пользователей.
-- Создание роли-группы (без LOGIN)
CREATE ROLE developers NOLOGIN;
CREATE ROLE analysts NOLOGIN;
-- Назначение привилегий группе
GRANT SELECT ON ALL TABLES IN SCHEMA analytics TO analysts;
GRANT USAGE ON SCHEMA analytics TO analysts;
-- Добавление пользователей в группы
GRANT developers TO john_doe;
GRANT analysts TO jane_smith;
-- Наследование прав (по умолчанию INHERIT = true)
ALTER ROLE john_doe NOINHERIT; -- пользователь не наследует права группы
Иерархия ролей
| Уровень | Роль | Права | Пример пользователей |
|---|---|---|---|
| Суперпользователь | postgres | Все права | Администраторы БД |
| Группа | developers | CREATE, USAGE | Разработчики приложений |
| Пользователь | webapp_user | SELECT, INSERT, UPDATE | Веб-приложение |
| Read-only | report_user | SELECT | Аналитики, BI-системы |
Безопасность и аутентификация
Настройка методов аутентификации через pg_hba.conf — критически важный этап.
Конфигурация pg_hba.conf
# TYPE DATABASE USER ADDRESS METHOD
# Локальные подключения (Unix socket)
local all postgres peer
local mydb webapp_user md5
# IPv4 подключения
host all all 127.0.0.1/32 md5
host mydb api_user 192.168.1.0/24 scram-sha-256
# SSL подключения
hostssl analytics analysts 0.0.0.0/0 cert
# Репликация
host replication replica_user 10.0.0.0/8 md5
Методы аутентификации:
- trust — без пароля (опасно для production)
- md5 — хэш пароля (устаревший, но поддерживается)
- scram-sha-256 — современный безопасный метод (рекомендуется)
- peer — аутентификация через ОС (только local)
- cert — SSL сертификаты клиента
Политики паролей
-- Установка срока действия пароля
ALTER USER webapp_user VALID UNTIL '2024-12-31';
-- Принудительная смена пароля при следующем входе
ALTER USER john_doe PASSWORD 'TempPass123' VALID UNTIL '2024-01-15';
-- Проверка просроченных паролей
SELECT usename, valuntil
FROM pg_user
WHERE valuntil < CURRENT_TIMESTAMP;
Практический пример: настройка окружения
Давай настроим полное окружение для веб-приложения с разделением прав:
-- 1. Создаем базу данных
CREATE DATABASE ecommerce;
-- 2. Создаем роли-группы
CREATE ROLE app_developers NOLOGIN;
CREATE ROLE app_users NOLOGIN;
CREATE ROLE app_admins NOLOGIN;
-- 3. Создаем конкретных пользователей
CREATE USER frontend_app WITH PASSWORD 'FrontendPass!2024';
CREATE USER backend_service WITH PASSWORD 'BackendPass!2024';
CREATE USER admin_user WITH PASSWORD 'AdminSuperPass!2024';
-- 4. Назначаем пользователей в группы
GRANT app_users TO frontend_app, backend_service;
GRANT app_admins TO admin_user;
-- 5. Даем права группам
GRANT CONNECT ON DATABASE ecommerce TO app_users, app_admins;
GRANT CREATE ON DATABASE ecommerce TO app_developers;
-- 6. Настраиваем права в схеме public
GRANT USAGE ON SCHEMA public TO app_users;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_users;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO app_admins;
-- 7. Настройка прав по умолчанию
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE ON TABLES TO app_users;
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT ALL PRIVILEGES ON TABLES TO app_admins;
Мониторинг и обслуживание
Полезные запросы для администрирования
-- Активные подключения пользователя
SELECT pid, usename, application_name, client_addr, state
FROM pg_stat_activity
WHERE usename = 'webapp_user';
-- Права пользователя на таблицы
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.table_privileges
WHERE grantee = 'api_user';
-- Просмотр наследования ролей
SELECT rolname, memberof
FROM pg_roles
WHERE rolname = 'john_doe';
-- Поиск пользователей с истекающим паролем
SELECT usename, valuntil
FROM pg_user
WHERE valuntil IS NOT NULL
ORDER BY valuntil ASC;
Управление пользователями через psql
# Подключение под конкретным пользователем
psql -U webapp_user -d mydb -h localhost
# Смена пароля из командной строки
psql -c "ALTER USER api_user WITH PASSWORD 'NewPass2024!';"
# Экспорт списка пользователей
pg_dumpall --roles-only > roles_backup.sql
Частые вопросы (FAQ)
Как сбросить забытый пароль суперпользователя?
Остановите PostgreSQL, запустите в single-user mode и выполните:
# Остановка PostgreSQL
sudo systemctl stop postgresql
# Запуск в single-user mode
sudo -u postgres postgres --single -D /var/lib/postgresql/data
# В интерактивном режиме:
ALTER USER postgres WITH PASSWORD 'NewSuperSecretPass';
В чем разница между CREATE USER и CREATE ROLE?
CREATE USER — это CREATE ROLE WITH LOGIN. Для создания роли без возможности входа используйте CREATE ROLE NOLOGIN.
Как ограничить ресурсы для пользователя?
Используйте connection_limit и настройки на уровне ОС. Для более тонкого контроля рассмотрите использование расширений вроде pg_qualstats или настройку resource groups.
Почему пользователь не видит таблицы после выдачи прав?
Проверьте:
- Права USAGE на схему:
GRANT USAGE ON SCHEMA schema_name TO user; - Права на конкретные таблицы
- Наследование прав (NOINHERIT)
- Права на последовательности для INSERT
Как безопасно удалить пользователя?
-- Проверить активные сессии
SELECT pid, query FROM pg_stat_activity WHERE usename = 'user_to_delete';
-- Завершить сессии (если нужно)
SELECT pg_terminate_backend(pid) FROM pg_stat_activity
WHERE usename = 'user_to_delete';
-- Передать объекты другому пользователю
REASSIGN OWNED BY old_user TO new_user;
-- Удалить привилегии
DROP OWNED BY old_user;
-- Удалить пользователя
DROP USER old_user;
Заключение
Грамотная настройка пользователей в PostgreSQL — это баланс между безопасностью и удобством. Начните с принципа минимальных привилегий, используйте групповые роли для упрощения управления, регулярно проводите аудит и обновляйте политики паролей. Помните, что хорошо настроенная система прав — это фундамент стабильной и безопасной работы вашей базы данных.
- Всегда используйте сложные пароли и scram-sha-256 аутентификацию
- Ограничивайте права роли PUBLIC
- Ведите документацию по ролям и правам
- Тестируйте настройки прав в staging-окружении
- Настройте мониторинг подозрительной активности