172 похожих чатов

>> ролевая модель и правда доступа на объекты именно на уровне

СУБД? Мб в своё приложение добавить поддержку casbin / прикрутить ory.Kratos?

15 ответов

13 просмотров

именно на уровне субд. Задача простая: нужно разделить доступы в рамках одного сервера между разными пользователями. И в рамках бд (что можно через hba.conf) и в рамках схем, объектов итд. Гугление дает лишь примеры уровня "раздай на все таблицы", "добавь правило на раздачу права Х пользователю Y при добавлении таблицы" и прочее подобное. А хотелось бы понимать как оно там внутри работает и как правильно в той или иной ситуации сделать.

Oleg
именно на уровне субд. Задача простая: нужно разде...

можно примерно как тут: https://t.me/pgsql/246213 вы не сможете найти готового решения, т.к. оно зависит полностю от ваших особенностей. в целом, доступ делиться на следующие компоненты (3 уровня): - доступ к объектам в базе даётся группам доступа (в примере выше группы очень общие), например: ro/rw доступ к клиентским данным, к настройкам сервиса, к тарификации и т.д. - создаются целевые группы (ACL) по роду деятельности: операционисты, поддержка, админы, финансы и т.д., каждой целевой группе присваиваются нужные ей группы доступа - доступ целевым группам прописывается в pg_hba.conf - пользователей включают в нужные целевые группы

Oleg
именно на уровне субд. Задача простая: нужно разде...

Права доступа вполне себе доступно и понятно описаны в документации. Глобальные привилегии ролей, пользователей - по команде CREATE ROLE: https://postgrespro.ru/docs/postgresql/11/sql-createrole из этой доки ведут ссылки на описание ролевой модели ПГ и способов аутентификации. Права доступа к объектам - по команде GRANT: https://postgrespro.ru/docs/postgresql/11/sql-grant Необходимо помнить, что командой GRANT вы выдаёте права только для УЖЕ СУЩЕСТВУЮЩИХ объектов! Для назначения прав по-умолчанию, используется команда ALTER DEFAULT PRIVILEGES: https://postgrespro.ru/docs/postgresql/11/sql-alterdefaultprivileges По транзакциям: https://postgrespro.ru/docs/postgresql/12/mvcc лучше прочитать всю главу, я думаю.

Виктор Егоров
можно примерно как тут: https://t.me/pgsql/246213 ...

А жаль, что примеров так мало (и нет примеров типичных схем раздачи прав), IMHO. Потому что если пытаться этим заниматься всерьёз, а не просто "да мы всё в приложении спрячем и проконтролируем", можно неожиданно (а если нужно RLS — вообще запросто, мне кажется) "влететь", и это из документации не очевидно (и информация, к тому же, разбросана по разным разделам). В общем, Вы видели где-то хорошее описание принципов схем раздачи прав на примерах?

Yaroslav Schekin
А жаль, что примеров так мало (и нет примеров типи...

на примерах — нет. всё основано на опыте, как в Oracle, так и в Postgres. справедливости ради, хороших систем доступа встречал мало, и они в целом были похожи между собой (как я описал выше). с RLS проявляются косяки в планировании запросов, но пока получалось обходить незначительными изменениями самих запросов

Виктор Егоров
на примерах — нет. всё основано на опыте, как в Or...

Жаль. > и они в целом были похожи между собой Мне кажется, что если при этом подходе "ляпнуть" в какой-то мелочи, можно запросто открыть (и даже для изменений) то, что совсем не планировалось. > с RLS проявляются косяки в планировании запросов Да я же не об этом. У меня ощущение, что на самом деле многие из т.н. RLS (особенно, если они не основаны на встроенных механизмах) — это "решето". ;) Т.е. тот, кому это нужно и кто в этом разбирается, "вытащит" кучу той информации, которая ему совсем не предназначалась. :(

Yaroslav Schekin
А жаль, что примеров так мало (и нет примеров типи...

Почему нет типичных примеров - потому что пока не вот уж есть инсталляций в достаточном количестве, где права доступа разруливаются на уровне СУБД. Обычно на уровне приложения, а в БД ходит приклад под одной учётной записью. И второе - в каждой избушке свои погремушки. Надеюсь, этот факт не надо разъяснять. Ну и я считаю, как выше написал, что в документации достаточно информации, чтобы грамотно рулить правами доступа. Другое дело, что к этому рулению надо подходить аккуратно и вдумчиво, особенно при использовании функций для доступа к данным. И процедура эта - отнюдь не пятиминутная.

Михаил Шурутов
Почему нет типичных примеров - потому что пока не ...

> пока не вот уж есть ... где права доступа разруливаются на уровне СУБД > Обычно на уровне приложения, а в БД ходит приклад под одной учётной записью. Что значит, что в этих случаях документация, фактически, не имеет отношения к делу, и это вариант "да мы всё в приложении спрячем и проконтролируем", нет? Или же, если это типичная схема, было бы неплохо, если бы принцип раздачи прав под неё был описан (с примерами и особенно её ограничениями / "врождёнными дефектами"), мне кажется. > в документации достаточно информации, чтобы грамотно рулить правами доступа. Формально-то да... Но (в качестве аналогии) и в стандарте SQL, например, "достаточно информации" для реализации conforming SQL implementation, но что-то все fail-ят (причём, по-разному) во многих случаях (включая PostgreSQL), хотя и стараются. ;) > Другое дело, что к этому рулению надо подходить аккуратно и вдумчиво Ну и было бы неплохо, если бы "типичные" подходы, решения и ошибки были описаны, чтобы не было, как с ISO SQL. А так описываются почти исключительно инструменты, а не то, как ими работать и что делать, я вот о чём. И я не имею в виду, что это должно быть в документации — книга, wiki или статья тут даже больше подходят.

Yaroslav Schekin
Жаль. > и они в целом были похожи между собой М...

> У меня ощущение, что на самом деле многие из т.н. RLS (особенно, если они не основаны на встроенных механизмах) — это "решето". 😉 вот это не понял. я под RLS подразумеваю только то, что база в этой области предоставляет. реализации по типу “у нас за всё приложение отвечает” встречал неоднократно, там всё печально с целостностью… исключений не было.

Виктор Егоров
> У меня ощущение, что на самом деле многие из т.н...

> вот это не понял. Я имел в виду в основном "самопальные" RLS, вместо того, что предоставляет PostgreSQL, т.е. "реализации по типу “у нас за всё приложение отвечает”", да. Но и даже на основе "настоящего" RLS не так уж сложно "накосить", как мне кажется.

Виктор Егоров
на примерах — нет. всё основано на опыте, как в Or...

В RLS проблема планировщика в том что операторы = и тд объявлены не как LEAKPROOF, не проверял в правда в последних версиях

Виктор Егоров
какая конкретно проблема?

Политика с предикатом employer.idDepartment = .. В запросе select * from employer where Id = :pid не будет проталкиваться внутрь предиката

Konstantin Zaitsev
Политика с предикатом employer.idDepartment = .. ...

сделайте политику USING (idDepartment IS NOT DISTINCT FROM … )

Виктор Егоров
сделайте политику USING (idDepartment IS NOT DISTI...

id PK, id = :pid всегда будет выполнятся после любой политики Что крайне не эффективно

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Карта сайта