2016-05-12 142 views
1

我们最近从SQL Server切换到MySQL用于新项目,并且我仍然努力争取让自己的头脑安全模型。具有清除权限的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运行选择我只得到一个行 - 用法。文档说这只是基本的使用权限。所以看起来我的GRANT命令没有起作用。更令人震惊的是,当我运行应用程序时,它似乎仍然具有读取和更改数据的能力 - 表明该帐户拥有除user_privileges中列出的权限以外的权限。

我试过重新启动MySQL服务以确保它“新鲜”,但用户仍然有权限访问应用程序。

试图为“MyApplicationUser”运行秀补助@“%”似乎表明先前执行GRANT语句列表,不包括我的初步GRANT:

GRANT USAGE ON *.* TO 'MyApplicationUser'@'%' 
GRANT SELECT, INSERT, UPDATE, EXECUTE ON `dataportal`.* TO 'MyApplicationUser'@'%' 

所以:我怎么能找出什么特权我的MyApplicationUser帐户实际上有?如果它真的只是用法,那么应用程序如何继续工作?显示授权与user_privileges有什么不同?

回答

1

首先,您必须确保您的应用程序不再连接到数据库服务器。

检查以确保您的应用程序已停止。 要确信,请将您的服务器与网络断开连接。 另外,请确保您在执行这些操作时使用root帐户。

然后执行以下步骤:

  • 重启MySQL服务
  • 执行取消所有权限,然后FLUSH
  • 授予相应的权限,以您的用户然后刷新一次
  • 运行SELECT * FROM mysql.user

检查priv标有'Y'的斜角,然后与您得到的结果进行比较 SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE '%MYAPPLICATIONUSER%';

作为最后的手段,您可能必须删除用户并使用适当的权限重新创建它。

1

所以:我如何知道MyApplicationUser帐户实际上拥有哪些权限?

我认为你可以使用这个

use mysql 
select * from user where user = 'username';