Не могу спрятать от пользователя ненужные ему данные.
Единственное на что должен иметь права пользователь, это на подключение к базе, вызов одной функции и отключение от базы. Соответственно всю структуру таблиц, названия таблиц и код функции, да и вызов системных функций хочу запретить и спрятать.
Просмотр структуры из pgAdmin прячется после команды:
REVOKE SELECT ON pg_catalog.pg_proc, information_schema.routines FROM public
Казалось вопрос решен, но через системные функции все прекрасно отображается:
SELECT a.attname, format_type(a.atttypid, a.atttypmod), a.attnotnull, a.atthasdef, a.attnum
FROM pg_class c, pg_attribute a
WHERE c.relname ='имя таблицы' AND a.attnum > 0 AND a.attrelid = c.oid ORDER BY a.attnum;
Даже показывает структуру таблицы созданную в отдельной схеме(причем для данной схемы не ставил доступ).
в файле: /etc/postgresql/8.4/main/pg_hba.conf
оставил только:
host all all 0.0.0.0/0 md5
Вообще не пойму на каком основании пользователь ограниченный в правах получает доступ к названиям таблиц и к структуре таблиц (хотя даже схема не public). А по умолчанию в базе пользователь еще и имеет доступ на просмотр тела функции - это вообще абсурд.
Как быть? Как запретить.
Попробуйте создать роль и
Попробуйте создать роль и отобрать у неё все права. Вообще все. По умолчанию даются права на схемы public и pg_catalog.
Далее постепенно давайте роли права: login (connect), usage для схемы, куда вы поместите ту функцию, которая только и должна быть доступна. В самой функции используйте ключевые слова SECURITY DEFINER. Как-то так.
> Вообще не пойму на каком основании пользователь ограниченный в правах получает доступ к названиям таблиц и к структуре таблиц
С ходу могу предположить лишь, что стандартом SQL не определяются права на чтение СТРУКТУРЫ, лишь права на работу с ДАННЫМИ. Возможно в PostgreSQL это не так - точно не знаю, никогда не интересовало
Отсутствие логики
Внимательней почитал мануал, понял что pgAdmin недостаточно развит и надо ручками делать.
Создал новую роль в pgAdmin
CREATE ROLE user2 LOGIN
ENCRYPTED PASSWORD '..пароль..'
NOSUPERUSER NOINHERIT NOCREATEDB NOCREATEROLE;
Что еще добавить совсем не понятно.
Далее пытаюсь через REVOKE убрать лишние права
REVOKE ALL ON SCHEMA pg_catalog FROM public;
REVOKE ALL ON SCHEMA pg_catalog FROM user2;
REVOKE ALL PRIVILEGES ON SCHEMA main FROM user2;
REVOKE ALL PRIVILEGES ON SCHEMA main FROM user2;
Ничего не помогает все равно отображается структура таблицы.
В общем пришлось для каждой мелочи писать REVOKE (гдето 50 строк текста) тогда вроде все стало как надо.
Раньше в основном работал в MSSQL и там данный момент вполне логично сделан.
А тут до меня не доходит, кто вообще разрабатывал политику безопасности. Ведь любому известно что изначально у новой учетки не должно быть никаких прав, тем более что тут даже ставишь "не наследовать".
Интересно и тупо получается, вот настроил рабочий сервер, запустил в работу пару лет все отлично, а потом обновился на новую версию, а в ней добавили новые объекты и если на них не удалишь разрешения, то все появляется явная дырка - это шпионский заговор?
Как насовсем и полностью удалить пользователя public в pgAdmin его не видать, и не работает команда: DROP ROLE public;
public - это не пользователь.
public - это не пользователь. public - это схема по-умолчанию, в которой опять же по умолчанию создаются новые объекты. В схеме public снова по-умолчанию, пользователи с правами доступа к БД, могут что-то делать - опять же точно не скажу что. Может для вас было бы лучшим выходом создать свою схему и стуктуру БД создавать в ней? pg_catalog - это тоже схема - схема системного каталога. А есть роли. Достаточно для одной роли прописать нужные права и другие роли можно создавать на её основе.
Другая схема не поможет.
Другая схема не поможет. Нужно убирать привилегии с pg_class, остальные псевдотаблицы завязаны на нее. Только работать с базой можно будет только через "security definer" функции. Ни один прямой запрос к таблицам работать не будет. С телом функции проще - pg_proc.
Вот в том то и дело что
Вот в том то и дело что public в postgresql это нечто непонятное.
Создаешь новую схему, а public уже имеет к ней доступ. - pgAdmin есть даже такая роль. Смотришь свойства таблицы и вроде в привилегиях её нет, а доступ имеет.
Создаешь нового пользователя и он уже имеет права public. Хотя опять же в pgAdmin новый пользователь еще никуда не был подключён и не возможно пользователя исключить из роли public.
Если взять любой объект в postgresql как узнать кто имеет к нему доступ, и куда этот объект имеет доступ.
в pgAdmin это не реализовано, надеюсь что хоть в базе есть такая возможность.
Очень неудобно когда пользователь имеет либо все либо ни чего.
При изучении MSSQL почему-то вопросов с распределением доступа не возникало. А тут на ровном месте приходится топтаться.
Понимаю что многие делают код для php и им не надо задумываться о безопасности, но вот если клиенты имеют доступ к базе напрямую как вы решаете проблему распределения прав?
Я же вам уже отвечал
Я же вам уже отвечал как.
Создайте роль с нужными вам правами и создавайте другие роли на основе этой.