仅提供GRANT EXECUTE'程序'给用户(没有选择或插入权限)

时间:2017-01-15 19:53:40

标签: mysql security stored-procedures docker grant

我想知道是否可以向用户授予EXECUTE权限,而无需授予SELECTINSERT等权限。一个程序运行?

将其用于Web应用程序的登录表。 MySQL正在Docker容器中运行。用于创建过程的SQL作为docker构建过程的一部分进行复制(运行时,在entrypoint.sh中使用sql)。运行容器(-e标志)时会创建Login_db。

我想从下方删除GRANT SELECT行,这样无论发生什么情况,webapp服务器都无法运行SELECT查询 - 例如执行SELECT * FROM logins

CREATE USER 'logins'@'172.24.0.7' IDENTIFIED BY 'some-password';
GRANT SELECT, INSERT, UPDATE on logins_db.login TO 'logins'@'172.24.0.7';
GRANT EXECUTE ON PROCEDURE logins_db.sp_login16 TO 'logins'@'172.24.0.7';
FLUSH PRIVILEGES;

这并没有解决它 - 因为表所有者会公开相同的权限:

Execute stored proc fails with GRANT EXECUTE because of table permissions

这也许可以解释我为什么不能这样做,但表名对我来说有点奇怪(MySQL新手 - 我认为mysql.proc是一个系统表,所以不确定如果适用):

How to grant execute on specific stored procedure to user

在创建过程时root可能没有SELECT权限,因此登录用户无法运行它吗? (因为Docker MySQL运行entrypoint.sh然后运行环境变量)?

程序代码在这里(我知道,不是最优雅的) - 考虑到{{1},我可以GRANT然后REVOKE logins这个用户的权限是root?

DEFINER

2 个答案:

答案 0 :(得分:2)

是的,您可以在声明stored procedure时使用sql security definer执行此操作:

  

SQL SECURITY特性可以指定DEFINER或INVOKER   安全背景;也就是说,例程是否使用   在例程DEFINER子句中指定的帐户的权限   调用它的用户。此帐户必须具有访问权限的权限   与例程关联的数据库。默认值为   DEFINER。调用例程的用户必须具有EXECUTE   如果例程执行,DEFINER帐户必须具有特权   在definer安全上下文中。

     

DEFINER子句指定要在何时使用的MySQL帐户   在例程执行时检查访问权限   具有SQL SECURITY DEFINER特性。

     

如果为DEFINER子句指定了用户值,则它应该是MySQL   帐户指定为'user_name'@'host_name',CURRENT_USER或   当前用户()。默认的DEFINER值是执行该操作的用户   CREATE PROCEDURE或CREATE FUNCTION语句。这是一样的   明确指定DEFINER = CURRENT_USER。

总结一下:definer子句中的用户必须具有对此基础表的select / insert权限,而执行存储过程的用户必须具有对存储过程的执行权限。

答案 1 :(得分:0)

添加了具有ADMIN@localhostSELECTINSERT权限的新用户UPDATEADMIN然后成为所有程序的DEFINER'logins'@'172.24.0.7'仅被授予EXECUTE权限。现在完美运行!

显然你不能按照我的方式使用root。感谢@Shadow指出我正确的方向。

最终SQL在这里:

https://github.com/dijksterhuis/Notflix/tree/master/mysql/logins/sql