powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разграничение прав в postgresql
20 сообщений из 20, страница 1 из 1
Разграничение прав в postgresql
    #38540330
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте! Изучаю PostgreSQL 9.3.
Как настраивать доступ пользователей на добавление, изменение, удаление данных из таблиц, из записей, из столбцов конкретно? Например есть база, а в ней 120 таблиц и есть пользователи примерно 300.
1 вопрос (ограничение по записям): в одной таблице данные компании в целом. Надо, чтобы конкретный сотрудник "видел" только то, что ему можно, например, данные только своего филиала и только то, на какой он должности работает
2 вопрос: как делать ограничение по столбцам?
3 вопрос: как разграничивать целую таблицу?

Как правильно это всё делать?
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38540345
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Iceberg1985Здравствуйте! Изучаю PostgreSQL 9.3.
Как настраивать доступ пользователей на добавление, изменение, удаление данных из таблиц, из записей, из столбцов конкретно? Например есть база, а в ней 120 таблиц и есть пользователи примерно 300.
1 вопрос (ограничение по записям): в одной таблице данные компании в целом. Надо, чтобы конкретный сотрудник "видел" только то, что ему можно, например, данные только своего филиала и только то, на какой он должности работает
2 вопрос: как делать ограничение по столбцам?
3 вопрос: как разграничивать целую таблицу?

Как правильно это всё делать?

эти вещи на уровне grants не решаются...
делайте свой уровень управления доступом...
и весь доступ к данным переделывайте на хранимки с учетом ваших требования к доступу...
а прямого доступ к таблице не давайте вообще никому... так как ни 1 ни 2 ни 3 сделать через штатную систему управления правами не возможно... (хотя 3. может и можно смотря что вы имеете в виду там).
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38540368
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukэти вещи на уровне grants не решаются...
делайте свой уровень управления доступом...
и весь доступ к данным переделывайте на хранимки с учетом ваших требования к доступу...
а прямого доступ к таблице не давайте вообще никому... так как ни 1 ни 2 ни 3 сделать через штатную систему управления правами не возможно... (хотя 3. может и можно смотря что вы имеете в виду там).
Спасибо, Максим!
А как делать свой уровень управления доступом?
Весь доступ переделывать на хранимки - это имеется в виду на хранимых процедурах?
В данное время в голову ничего не приходит.
Приходит только одна идея добавлять по два столбца в каждую таблицу: одна для определённой учётной записи, одна для группы, то есть для роли. И таким образом фильтровать при входе в базу для каждого пользователя при входе.
Но кажется это совсем не правильно.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38541309
Sergei.Agalakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Максим правильно говорит. Не дело ДБА отвечать за тонко настраиваемый доступ к данным. Должен быть назначен администратор приложения, который и будет раздавать уровни доступа. Для этого лучше дать ему простенькое приложение.
На физическом уровне права на чтение можно организовать с view, но модификации все же лучше делать с хранимками.
Добавьте в основную таблицу колонку security_group. Заведите таблицу user_security_group с колонками userid, security_group. Администратор приложения назначит каждому пользователю одну или несколько групп доступа. Группы часто организуют иерархически, т.е. группы 12, 23, 31 принадлежат группе B, а группы B, C, D принадлежат группе 'Главбух'.
Ну вот примерно такая идея, тонкости сами под свой бизнес добавите.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38541368
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://www.postgresql.org/message-id/4AE02DF0.40101@enterprisedb.com]http://www.postgresql.org/message-id/4AE02DF0.40101@enterprisedb.com - всегда, когда ввязываетесь в эти гонки, будте готовы проиграть)

а вообще щас очень эта тема в комунити развивается. скоро как-то можно будет права внутри раздавать. там еще есть проблемы и дыры, но их патчат. можете по архиву рассылок пробежаться за последние пол года
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38541376
Фотография Misha Tyurin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
оффтоп.
так же, например, популярен теоритический способ обходить всякие тривиальные рулы и админ триггеры - не коммитить транзакцию.

хаккеры не дремлют!

админ баз должен точно postgres'а отобрать у всех (и проследить за дырой дблинка, хихи))

а остальное - там всё на приложениях в основном
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38541502
Misha Tyurin http://www.postgresql.org/message-id/4AE02DF0.40101@enterprisedb.com]http://www.postgresql.org/message-id/4AE02DF0.40101@enterprisedb.com - всегда, когда ввязываетесь в эти гонки, будте готовы проиграть)
Для этого есть security_barrier
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38547000
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит, как я понял, всё-таки самым оптимальным вариантом остаётся ограничение на уровне приложения, а не самой БД?
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38548478
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Капитан очевидность:
Реализуете ТОЛЬКО на уровне приложения и оставите полные права на уровне БД - готовьтесь огрести по-полной за утечку бизнес-информации.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38548642
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть такая ОС Astra Linux, в этой ОС есть допиленный postgreSQL, как раз для решения нужных вам задач, т.е. разграничение доступа по записям и колонкам штатными средствами, вот только по полям не уверен насчет наличия этой возможности. То что вы хотите называется мандатным механизмом разграничения доступа.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38549618
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
big-trotЕсть такая ОС Astra Linux, в этой ОС есть допиленный postgreSQL, как раз для решения нужных вам задач, т.е. разграничение доступа по записям и колонкам штатными средствами, вот только по полям не уверен насчет наличия этой возможности. То что вы хотите называется мандатным механизмом разграничения доступа.
Извините, но в ссылке: http://werwolf-lg.livejournal.com/230582.html не рекомендуют его использовать
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38549619
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HawkmoonКапитан очевидность:
Реализуете ТОЛЬКО на уровне приложения и оставите полные права на уровне БД - готовьтесь огрести по-полной за утечку бизнес-информации.
Я не имею в виду открыть полный доступ на уровне БД. Я имею в виду, что буду ограничивать на уровне БД доступ к таблицам в целом, а на уровне приложения буду ограничивать по записям. В таком случае не грозит ли утечка информации?
Спасибо!
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38550240
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Iceberg1985HawkmoonКапитан очевидность:
Реализуете ТОЛЬКО на уровне приложения и оставите полные права на уровне БД - готовьтесь огрести по-полной за утечку бизнес-информации.
Я не имею в виду открыть полный доступ на уровне БД. Я имею в виду, что буду ограничивать на уровне БД доступ к таблицам в целом, а на уровне приложения буду ограничивать по записям. В таком случае не грозит ли утечка информации?
Спасибо!

Ну вот это вроде как лучше. Хотя я бы все равно отобрал бы права на таблицы, создал бы хранимые функции, и только на эти функции давал бы права на доступ.
Функции Security definer

Тогда:
1. пользователь лезет не туда - прав нету, опа.
2. пользователь не может напрямую обратиться к табличкам.
3. пользователь лезет туда - получает выборку через хранимку (которая, ага, выполняется уже из-под прав того, кто имеет доступ к таблицам - но уже на уровне движка СУБД)
4. таким образом, написав хранимку, не подверженную SQL-инъекциям , получим более-менее защиту по правам.

Здесь жирный текст критичен, но он не так сложен к исполнению.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38550254
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если оставите же полный доступ к таблицам на уровне пользователя, и выборку в приложении, то система юзабельная, но нехакероустойчивая:

хакер ловит коннекшн-стринг, подключается с ним, и получает полный доступ к таблицам. В случае вышерассматриваемого сценария хакеру нужен будет логин/пароль не роли для приложения, а роли owner'а/суперпользователя.

Что рубится корректной настройкой PostgreSQL.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38550925
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
HawkmoonЕсли оставите же полный доступ к таблицам на уровне пользователя, и выборку в приложении, то система юзабельная, но нехакероустойчивая:

хакер ловит коннекшн-стринг, подключается с ним, и получает полный доступ к таблицам. В случае вышерассматриваемого сценария хакеру нужен будет логин/пароль не роли для приложения, а роли owner'а/суперпользователя.

Что рубится корректной настройкой PostgreSQL.
Спасибо вам, Hawkmoon! Только вот выходят несколько вопросов:
1. корректная настройка - это:
а) удаление или ограничение прав пользователя postgres, соответственно присвоение этому пользователю очень трудного пароля
б) настройка postgresql в соответствии с характеристикой сервера
в) давать доступ извне только конкретным IP-адресам, настройка файрвола
г) использование для БД отдельного жесткого диска, для логов - другого жесткого диска
... будьте добры, скажите, какие ещё основные моменты я пропустил?

3. поискав в интернете, нашёл, что можно писать хранимые функции и на языке Python. Как это отразится на хакероустойчивость? Это лучше или хуже?

2. пример: допустим есть таблица create table a(k int primary key not null, n varchar(30), o varchar(100));
и допустим она заполнена некоторыми данными. Например у нас есть хранимая функция, которая выбирает из этой таблицы данные, соответствующие условию: выбирать из поля k значения, меньше 50: k<50.
CREATE OR REPLACE FUNCTION primer(t как писать_тип_таблица?)
AS $$
DECLARE

BEGIN
select * from a where k<50
END
$$
где_описывать_возвращение_функцией_таблицу_результата?
LANGUAGE plpgsql;

Как с помощью хранимых функций дать доступ например web-странице?

Спасибо вам огромное!
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38552514
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Iceberg19851. корректная настройка - это:
а) удаление или ограничение прав пользователя postgres, соответственно присвоение этому пользователю очень трудного пароля
суперпользователь должен быть. Соответственно, защищаем вЗлоМ0у$$т0i4ивbIм паролем, больше не ограничиваем.
Снести суперпользователя - огрести проблем. Это аксиома.
в) давать доступ извне только конкретным IP-адресам, настройка файрвола

Да.
б) настройка postgresql в соответствии с характеристикой сервера
г) использование для БД отдельного жесткого диска, для логов - другого жесткого диска

Имеет отношение к производительности, не имеет - к безопасности.
3. поискав в интернете, нашёл, что можно писать хранимые функции и на языке Python. Как это отразится на хакероустойчивость? Это лучше или хуже?
все равно. (см. SQL injection)

2. пример: допустим есть таблица create table a(k int primary key not null, n varchar(30), o varchar(100));
и допустим она заполнена некоторыми данными. Например у нас есть хранимая функция, которая выбирает из этой таблицы данные, соответствующие условию: выбирать из поля k значения, меньше 50: k<50.
CREATE OR REPLACE FUNCTION primer(t как писать_тип_таблица?)
AS $$
DECLARE

BEGIN
select * from a where k<50
END
$$
где_описывать_возвращение_функцией_таблицу_результата?
LANGUAGE plpgsql;


function ... returns setof a
где a = ваша таблица.
Для данного случая достаточно LANGUAGE sql;
главное - не устраивать динамическую конкатенацию запросов внутри (см. SQL injection)
Как с помощью хранимых функций дать доступ например web-странице?
также как и к таблице. Разница будет в том, что вместо select * from a пишите select * from primer()

Главное:
завести пользователя web_user, у которого отобрать права на a.
из под того, у кого есть права на a (например postgres), создать пример, при этом обозвав функцию security definer.
дать web_user права на primer()
подключиться из бек-энда под пользователем web_user.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38552906
Sasha Alias
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Iceberg19853. поискав в интернете, нашёл, что можно писать хранимые функции и на языке Python. Как это отразится на хакероустойчивость? Это лучше или хуже?


Хуже, т.к. plpython untrusted язык в postgres, т.е. аттака через sql инъекцию может зайти очень далеко.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38556689
Iceberg1985
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoon, Sasha Alias
Спасибо Всем за драгоценные ответы. Мне они очень помогли. Ещё раз спасибо!
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38686570
Привет всем.

Мне интересна данная тема, так вот сделал так как вы и говорили.
1. создал таблицу с овнером super_user
2. дал все права super_user
3. создал хранимую процедуру, которая вставляет запись в эту таблицу, овнер хранимки super_user
а также дал права на запуск хранимки web_user-у
Код: sql
1.
GRANT EXECUTE ON FUNCTION func_test_grants(character varying) TO web_user;


4. Запустил хранимку под пользователем web_user
Код: sql
1.
select * FROM func_test_grants('test_1');



и получил ошибку
Код: sql
1.
"42501: permission denied for relation test_grants"


----
ОС FreeBSD 9.1
Версия БД: postgresql93-server-9.3.2

Подскажите, пожалуйста, где я что-то не так сделал.
...
Рейтинг: 0 / 0
Разграничение прав в postgresql
    #38686621
уже нашел решение
Надо добавить в харнимку
Код: sql
1.
LANGUAGE plpgsql VOLATILE COST 100 SECURITY DEFINER;



Проверил - все заработало, так как я хотел.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Разграничение прав в postgresql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]