我们最近为新项目从SQL Server切换到了MySQL,我仍然在努力探索安全模型。
我们的一个应用程序有一个名为MyApplicationUser的MySQL用户。为方便起见,当我第一次开发此应用程序时,我向用户提供了我认为所需的权限。
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,ALTER ON MyApplication.* TO 'MyApplicationUser'@'%';
它似乎有用,所以我想的不多了。在某些时候,我调整了这个列表,所以用户也可以创建索引,虽然我不能再回想起我曾经这样做过的代码。
作为安全审核的一部分,我认为将这些权限仅限于用户实际需要的权限是明智的。所以我通过运行来检查它的内容:
select * from information_schema.user_privileges where grantee like '%MyApplicationUser%';
哪个列表相当长。然后我运行了以下代码:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'MyApplicationUser'@'%';
GRANT SELECT, INSERT, EXECUTE, UPDATE ON MyApplication.* TO 'MyApplicationUser'@'%';
FLUSH PRIVILEGES;
现在,当我从user_privileges运行select时,我只得到一行--USAGE。文档说这只是基本使用权限。所以看起来我的GRANT命令没有用。更令人担忧的是,当我运行应用程序时,它似乎仍然能够读取和更改数据 - 表明该帐户具有除user_privileges中列出的权限之外的权限。
我尝试重新启动MySQL服务以确保它“新鲜”,但用户仍然拥有该应用程序的权限。
尝试为'MyApplicationUser'运行show grants @'%'似乎显示以前执行的授权语句列表,不包括我的初始GRANT:
GRANT USAGE ON *.* TO 'MyApplicationUser'@'%'
GRANT SELECT, INSERT, UPDATE, EXECUTE ON `dataportal`.* TO 'MyApplicationUser'@'%'
那么:我怎样才能找出MyApplicationUser帐户实际拥有的权限?如果真的只是USAGE,应用程序怎么还能运行?显示授权与user_privileges有何不同?