Роли и пользователи

Рейтинг: 56.5% · 9 голосов
Подробный курс по PostgreSQL: SQL по демобазе, типы данных и JSONB, индексы, транзакции и MVCC, VACUUM, EXPLAIN и планировщик, роли и привилегии, репликация, бэкап, настройка под нагрузку и под 1С. Актуально на 2026.
Ответить
Аватара пользователя
Egor_DBA
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Роли и пользователи

Сообщение Egor_DBA »

Оглавление курса (47)
  1. Что такое PostgreSQL: история, философия, где применяется
  2. Урок 1. Что нового в PostgreSQL 15 и далее (15 -> 16 -> 17)
  3. Установка и первый запуск: Linux, Windows, Docker
  4. psql детально: метакоманды и работа в консоли
  5. Демобаза Авиаперевозки Postgres Pro: структура и развёртывание
  6. SELECT: проекция, фильтрация, сортировка
  7. Транзакции и ACID
  8. Уровни изоляции транзакций: Read Committed, Repeatable Read, Serializable
  9. Соединения таблиц (JOIN)
  10. Агрегация: GROUP BY, HAVING, GROUPING SETS
  11. Подзапросы и CTE (WITH), рекурсия
  12. Оконные функции
  13. Изменение данных: INSERT/UPDATE/DELETE, UPSERT, MERGE
  14. Числовые и булевы типы, NULL и трёхзначная логика
  15. Строки, текст, дата и время, таймзоны
  16. Массивы, диапазоны, enum, составные типы
  17. JSON и JSONB: операторы и индексация
  18. DDL: CREATE TABLE, схемы, ALTER
  19. Ограничения целостности
  20. Представления и материализованные представления
  21. Последовательности, IDENTITY, генерируемые столбцы
  22. Индексы: B-tree и когда индекс не используется
  23. Типы индексов: Hash, GiST, SP-GiST, GIN, BRIN
  24. Продвинутые индексы: частичные, по выражению, покрывающие
  25. Обслуживание индексов и таблиц: bloat, REINDEX, CONCURRENTLY
  26. Полнотекстовый поиск
  27. Роли и пользователи (вы здесь)
  28. Привилегии: GRANT/REVOKE
  29. Row-Level Security и безопасность данных
  30. Подключение приложения: pg_hba.conf, SSL, пулы соединений
  31. Серверное программирование: функции и процедуры
  32. Триггеры и события
  33. Архитектура PostgreSQL: процессы и память
  34. MVCC: версии строк и видимость
  35. VACUUM, autovacuum, freeze и wraparound
  36. WAL, контрольные точки и долговечность
  37. Блокировки и взаимоблокировки
  38. Планировщик запросов
  39. EXPLAIN и EXPLAIN ANALYZE: чтение планов
  40. Конфигурация сервера: ключевые параметры
  41. Настройка под нагрузку и под 1С
  42. Параллельные запросы и партиционирование
  43. Резервное копирование и восстановление
  44. Репликация: потоковая и hot standby
  45. Логическая репликация и кластерные решения
  46. Внешние данные, расширения и сертификация
  47. Разбор планов запросов на explain.tensor.ru: глубокое чтение EXPLAIN ANALYZE
Урок 26. Роли и пользователи

В postgresql нет отдельной сущности "пользователь" и отдельной "группа" на уровне реализации - есть одна универсальная сущность под названием роль. Роль может входить под именем в систему, владеть таблицами, выдавать права другим ролям и одновременно сама быть контейнером для других ролей. Этот урок про то, как создавать учётки, какими атрибутами они управляются, чем CREATE USER отличается от CREATE ROLE, как устроено членство и групповые роли, как хранятся пароли с алгоритмом SCRAM и что за магическая роль PUBLIC раздаёт права всем подряд. Разберёмся, как навести порядок в учётках так, чтобы потом не было мучительно больно при аудите доступа.

Изображение

Как это работает

Роль - это запись в общем для всего кластера каталоге pg_authid (видна через представление pg_roles). Общий значит, что роли живут не внутри базы, а на уровне всего экземпляра сервера, и одна и та же роль работает во всех базах кластера. Поэтому удалить базу можно, а роли при этом останутся.

Разница между ролью и пользователем чисто косметическая. Команда CREATE USER - это просто CREATE ROLE с неявно добавленным атрибутом LOGIN, то есть с правом подключаться к серверу. CREATE ROLE без LOGIN создаёт роль, под которой войти нельзя, но которую удобно использовать как групповую: накидать на неё прав и раздать членство реальным учёткам.

Поведение роли определяется набором атрибутов. LOGIN разрешает вход. SUPERUSER снимает вообще все проверки прав - суперпользователь может всё, включая обход политик безопасности строк, поэтому раздавать его направо и налево опасно. CREATEDB разрешает создавать базы. CREATEROLE разрешает создавать и менять другие роли (но в pg 15 без права раздавать суперпользователя). Ещё есть REPLICATION для подключений потоковой репликации, CONNECTION LIMIT для ограничения числа сессий и VALID UNTIL для срока годности пароля.

Членство - это отдельный механизм. Когда роль A сделана членом роли B, она получает доступ к привилегиям B. Дальше важна тонкость: если у групповой роли стоит атрибут INHERIT (он по умолчанию), член автоматически пользуется правами группы без лишних действий. Если же стоит NOINHERIT, права группы надо явно "надеть" командой SET ROLE. Это даёт модель, похожую на sudo: обычно ты под своими правами, а к мощным переключаешься осознанно.

Пароли в современном postgresql хранятся не в открытом виде и не примитивным md5, а по схеме SCRAM-SHA-256. При проверке пароль не передаётся по сети как есть, стороны обмениваются доказательствами знания пароля. За выбор алгоритма отвечает параметр password_encryption, а кто и как подключается - конфиг pg_hba.conf, где для метода аутентификации указывают scram-sha-256.

SQL и примеры

Создаём групповую роль (без входа) и обычную учётку с входом и паролем:

Код: Выделить всё

-- групповая роль: только контейнер прав, войти под ней нельзя
CREATE ROLE bookings_ro NOLOGIN;

-- учётка приложения: вход, пароль, лимит соединений, срок годности
CREATE ROLE app_reader LOGIN
    PASSWORD 'StrongPass#2026'
    CONNECTION LIMIT 20
    VALID UNTIL '2026-12-31';
Выдаём групповой роли права на чтение схемы bookings из демобазы "Авиаперевозки" и включаем учётку в группу:

Код: Выделить всё

GRANT USAGE ON SCHEMA bookings TO bookings_ro;
GRANT SELECT ON ALL TABLES IN SCHEMA bookings TO bookings_ro;
-- чтобы будущие таблицы тоже были доступны
ALTER DEFAULT PRIVILEGES IN SCHEMA bookings
    GRANT SELECT ON TABLES TO bookings_ro;

-- делаем app_reader членом группы: права придут по наследованию
GRANT bookings_ro TO app_reader;
Проверяем, что учётка реально видит данные. Под app_reader выполняем простой отчёт по аэропортам вылета:

Код: Выделить всё

SELECT f.departure_airport, count(*) AS flights
FROM bookings.flights f
GROUP BY f.departure_airport
ORDER BY flights DESC
LIMIT 5;
Меняем атрибуты существующей учётки и сбрасываем пароль (пароль будет автоматически захеширован SCRAM, если password_encryption выставлен правильно):

Код: Выделить всё

ALTER ROLE app_reader CONNECTION LIMIT 50;
ALTER ROLE app_reader PASSWORD 'NewStrongPass#2026';
ALTER ROLE app_reader VALID UNTIL 'infinity';   -- снять срок
Смотрим атрибуты и членство. В psql удобны команды backslash-du (роли) и backslash-drg (членство, появилась в pg 16):

Код: Выделить всё

-- список ролей с атрибутами
\du

-- то же через каталог
SELECT rolname, rolsuper, rolcreatedb, rolcanlogin, rolconnlimit
FROM pg_roles
WHERE rolname IN ('app_reader', 'bookings_ro');

-- кто в какой группе состоит
SELECT r.rolname AS member, g.rolname AS group_role
FROM pg_auth_members m
JOIN pg_roles r ON r.oid = m.member
JOIN pg_roles g ON g.oid = m.roleid;
Про PUBLIC. Это псевдороль, означающая "все роли сразу". По умолчанию PUBLIC имеет право CONNECT к базам и USAGE на схему. Исторически до pg 15 PUBLIC ещё имел CREATE на схему public, из-за чего любой мог насоздавать там объектов. В pg 15 это убрали - заметное изменение безопасности. Если хотите закрутить гайки на старых базах:

Код: Выделить всё

REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE bookings FROM PUBLIC;
Удаление учётки. Нельзя удалить роль, пока ей принадлежат объекты или у неё есть выданные права - сначала их надо переназначить или снять:

Код: Выделить всё

REASSIGN OWNED BY app_reader TO bookings_ro;  -- передать владение
DROP OWNED BY app_reader;                     -- снять оставшиеся права
DROP ROLE app_reader;
Частые грабли
  • Думают, что USER и ROLE - разные сущности. Нет, USER это ROLE с LOGIN. Путаница приводит к попыткам "сделать из группы пользователя".
  • Создали групповую роль, выдали ей SELECT, а член группы всё равно не видит таблицы - забыли, что NOINHERIT требует явного SET ROLE, либо у самой группы нет USAGE на схему.
  • GRANT SELECT ON ALL TABLES выдаёт права только на существующие на момент команды таблицы. Новые таблицы прав не получат - нужен ALTER DEFAULT PRIVILEGES.
  • Раздают SUPERUSER приложению "чтобы не возиться с правами". Это дыра: суперпользователь обходит RLS и любые ограничения.
  • В pg 16 поведение CREATEROLE и членства поменяли: появились опции WITH ADMIN/INHERIT/SET при GRANT роли, а член-создатель больше не получает автоматически полный контроль над чужими ролями. Скрипты с pg 15 могут вести себя иначе.
  • Оставили в pg_hba.conf метод md5 или trust. md5 устарел, trust пускает без пароля. Для postgresql для 1с и любых боевых систем - только scram-sha-256.
  • Пытаются DROP ROLE, а он падает с ошибкой о зависимостях - не сделали REASSIGN OWNED / DROP OWNED.
Мини-лаба
  • Шаг 1. Создайте групповую роль analytics_ro с NOLOGIN и учётку analyst1 с LOGIN, паролем и CONNECTION LIMIT 5.
  • Шаг 2. Выдайте analytics_ro права USAGE на схему bookings и SELECT на все её таблицы, добавьте ALTER DEFAULT PRIVILEGES.
  • Шаг 3. Сделайте analyst1 членом analytics_ro через GRANT.
  • Шаг 4. Подключитесь как analyst1 (psql -U analyst1) и выполните SELECT count(*) FROM bookings.tickets - убедитесь, что чтение работает, а INSERT в любую таблицу падает с отказом в доступе.
  • Шаг 5. Через \du и pg_auth_members посмотрите атрибуты и членство analyst1.
  • Шаг 6. Снимите у PUBLIC лишние права на базе и проверьте, что analyst1 по-прежнему подключается (если членство даёт CONNECT) или нет.
  • Шаг 7. Переназначьте владение через REASSIGN OWNED и удалите analyst1 командой DROP ROLE.
Контрольные вопросы
  • Чем CREATE USER отличается от CREATE ROLE и почему в каталоге они неразличимы?
  • Что произойдёт с правами члена группы при NOINHERIT и как ими воспользоваться?
  • Зачем нужен ALTER DEFAULT PRIVILEGES, если уже выдан GRANT ON ALL TABLES?
  • Почему scram-sha-256 безопаснее md5 при аутентификации?
  • Что такое PUBLIC и какое важное изменение про схему public произошло в pg 15?
  • Какие команды нужны, чтобы корректно удалить роль, владеющую объектами?
👍2 ❤️2 🔥 😄 🤔
Аватара пользователя
go2025
Сообщения: 1
Зарегистрирован: 22 май 2026, 02:40

Re: Роли и пользователи

Сообщение go2025 »

А правда что в pg16 если я создал роль через CREATEROLE то я ей больше не полный хозяин? у меня скрипт с 15 на 16 переехал и часть ALTER ROLE вдруг стала падать с отказом, теперь понятно почему
👍1 ❤️ 🔥 😄 🤔1
Аватара пользователя
pyan23
Сообщения: 2
Зарегистрирован: 29 май 2026, 20:31

Re: Роли и пользователи

Сообщение pyan23 »

Совет из практики: не выдавайте пароль прямо в CREATE ROLE текстом, он же светится в логах и в истории psql. Лучше \password имя_роли - psql сам захеширует и пошлёт уже SCRAM, чистый пароль никуда не попадает
👍3 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Полнотекстовый поиск
Следующая глава →
Привилегии: GRANT/REVOKE

Все главы курса «PostgreSQL: от первого запроса до продакшена»

Поделиться темой: ✈ Telegram VK

Вернуться в «PostgreSQL: от первого запроса до продакшена»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя