Как правильно реализовать безопасность доступа к данным на MySQL?
Привет!
Есть несколько табличек с важными записями. Есть пользователи, группы и подразделения. Нужно организовать механизм безопасности доступа к данным. Чтобы пользователи могли читать и редактировать только свои записи, своей группы или своего подразделения. Что-то наподобие безопасности на файловой системе. Сложность в том, что один объект — запись в табличке может быть назначена для нескольких пользователей, групп или подразделений.
Например делать ли отдельную таблицу с правами, или добавить колонку. Вот только не понятно что туда писать, как правильно закодировать значение прав, чтобы потом можно было быстро делать выборки. Какие бывают подходы, как правильно реализовывать, что почитать?
Если групп немного без тенденций к росту, можете изобразить ограничивающие VIEW и раздать доступ пользователям туда.
Другой способ — хранимые процедуры старательно проверяющие все параметры. Пользователями дают доступ к этим процедурам, а доступа к таблицам напрямую не дают.
Проблема в том, что в mysql эти вещи недостаточно полно и удобно реализованы.
Третий способ -«трехзвенка». дополнительная серверная программа, с которой общаются клиентские приложения. Она делает все проверки на удобном вам языке.
Скорее 3й способ, только хочется как-то унифицировать такой подход, сделать не зависимым от предметной области. Чтобы запросы можно было удобно писать и не сильно замедлило производительность.
Если групп немного без тенденций к росту, можете изобразить ограничивающие VIEW и раздать доступ пользователям туда.
Другой способ — хранимые процедуры старательно проверяющие все параметры. Пользователями дают доступ к этим процедурам, а доступа к таблицам напрямую не дают.
Проблема в том, что в mysql эти вещи недостаточно полно и удобно реализованы.
Третий способ -«трехзвенка». дополнительная серверная программа, с которой общаются клиентские приложения. Она делает все проверки на удобном вам языке.
В MySQL вам это сделать не удастся. Без гранта на SELECT, CALL не выполняется. Вообще там привилегии через жопу сделаны. Пример. Делаем 1 таблицу и одну процедуру с селектом из этой таблицы. Юзеру даем грант ТОЛЬКО на выполнение процедуры. Результат: процедура не выполняется, т.к. нет гранта на SELECT внутри процедуры. Полный бред…
mysql> grant usage on t.* to testuser@localhost identified by 'qwe';
Query OK, 0 rows affected (0.01 sec)
mysql> grant execute on procedure t.testproc to testuser@localhost;
Query OK, 0 rows affected (0.01 sec)
mysql> exit
Bye
# mysql -u testuser -p
mysql> use t
Database changed
mysql> select * from testtable;
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'
mysql> call testproc();
ERROR 1142 (42000): SELECT command denied to user 'testuser'@'localhost' for table 'testtable'
Ага. Не вижу никакого смысла в DEFINER. Это какое то sudo получается. От кого процедуру определять? От рута? Нет. Держать еще одного юзера@хост специально для этой процедуры? Чего это за новости… я как то definer'a грохнул за неактуальностью, все его процедуры и нагнулись раком у других юзеров.