|
|
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Всем привет! Задача: Нужно, чтобы пользователю была доступна всего одна ХП и он не мог ее менять, а мог только запускать. Даю права: CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); INSERT INTO mysql.procs_priv (host, user, db, routine_name, routine_type, proc_priv) VALUES ('%', 'vladimir', 'db', 'PROC_USER_GET_INFO', 'PROCEDURE', 'Execute'); FLUSH PRIVILEGES; Проблема в том, что тогда юзер не может подцепиться к базе в принципе. Методом тыка выяснил, что если я даю доступ на SELECT, тогда пользователь отлично подключается к базе и может выполнить лишь одну процедуру PROC_USER_GET_INFO. CREATE USER 'vladimir'@'%'; GRANT SELECT ON *.* TO 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); INSERT INTO mysql.procs_priv (host, user, db, routine_name, routine_type, proc_priv) VALUES ('%', 'vladimir', 'db', 'PROC_USER_GET_INFO', 'PROCEDURE', 'Execute'); FLUSH PRIVILEGES; Но проблема в том, что теперь он может делать абсолютно любые селекты, но мне такой возможности давать ему не хочется. Как запретить юзеру делать селекты, оставив ему при этом возможность подключаться к базе и выполнять нужную ХП? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 18:04:26 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
StygINSERT INTO mysql.procs_privИ чего же вы хотите после издевательств над базой? Используйте нормальные команды для управления привилегиями (GRANT, REVOKE) и SQL SECURITY DEFINER при создании процедур. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 18:14:41 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
StygПроблема в том, что тогда юзер не может подцепиться к базе в принципе.Как пользователь подключается? Через консольного клиента? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 18:21:46 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
_Vasilisk_StygПроблема в том, что тогда юзер не может подцепиться к базе в принципе.Как пользователь подключается? Через консольного клиента? вряд ли это так. но что ему помешает ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 18:26:10 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
netwindчто ему помешает ?То, что 99% программ при работе обращаются к системным таблицам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 18:29:29 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Действительно, изменил скрипт на: DROP USER 'vladimir'@'%'; CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%'; FLUSH PRIVILEGES; Проблема на 50% решилась. Действительно теперь можно подключиться к базе и выполнить только одну ХП. Но это если использовать dbForge или консоль. Но 50% проблемы все же осталось. Запустить ХП из приложения не удается. Приложение написано на Delphi и использует компонент TMyStoredProc из библиотеки MyDAC. Ошибка вываливается в момент выставления параметра: DM.procW.Close; DM.procW.StoredProcName:='PROC_USER_GET_INFO'; DM.procW.ParamByName('inpLOGIN').AsString:=DM.DB.Username; DM.procW.Open; Пишет Parameter inpLOGIN not found. Если добавить GRANT на SELECT *.*, то все снова работает, но опять-таки селект можно делать на любые таблицы. DROP USER 'vladimir'@'%'; CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); GRANT SELECT ON *.* TO 'vladimir'@'%'; GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%'; FLUSH PRIVILEGES; А если дать GRANT только на рабочую базу данных db.*, то приложение снова не работает - не может найти параметр ХП. DROP USER 'vladimir'@'%'; CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); GRANT SELECT ON db.* TO 'vladimir'@'%'; GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%'; FLUSH PRIVILEGES; Это как бы намекает, что нужно дать GRANT на SELECT из какой-то системной БД или таблицы, которая хранит описания ХП. Вопрос на какую БД или таблицу нужно дать GRANT, чтобы приложение могло считывать заголовки ХП и узнавать параметры ? Сча попробую выяснить методом тыка :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 19:01:59 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
О, пошел прогресс. Дать доступ к information_schema не удалось. Не хватило прав. Странно, но да ладно. Зато дал доступ на mysql.* и все заработало. DROP USER 'vladimir'@'%'; CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); GRANT SELECT ON mysql.* TO 'vladimir'@'%'; GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%'; FLUSH PRIVILEGES; Ну осталось теперь методом тыка выяснить к какой именно таблице в БД mysql нужно дать доступ и все вообще будет красиво :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 19:08:42 |
|
||
|
Как ограничить доступ только хранимыми процедурами
|
|||
|---|---|---|---|
|
#18+
Олееее, оле, оле, оле :) Нужен был доступ к системной таблице mysql.proc В общем, финальное решение выглядит вот так: DROP USER 'vladimir'@'%'; CREATE USER 'vladimir'@'%'; SET PASSWORD FOR 'vladimir'@'%' = PASSWORD ('1111'); GRANT SELECT ON mysql.proc TO 'vladimir'@'%'; GRANT EXECUTE ON PROCEDURE db.PROC_USER_GET_INFO TO 'vladimir'@'%'; FLUSH PRIVILEGES; Спасибо всем, кто участвовал в обсуждении! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.07.2014, 19:13:56 |
|
||
|
|

start [/forum/topic.php?fid=47&fpage=169&tid=1834488]: |
0ms |
get settings: |
4ms |
get forum list: |
11ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
33ms |
get topic data: |
6ms |
get forum data: |
1ms |
get page messages: |
24ms |
get tp. blocked users: |
1ms |
| others: | 197ms |
| total: | 281ms |

| 0 / 0 |
