在 MariaDB 10.3 中允许对特定用户进行外部访问

Posted

技术标签:

【中文标题】在 MariaDB 10.3 中允许对特定用户进行外部访问【英文标题】:Allow external access to specific user in MariaDB 10.3 【发布时间】:2019-05-09 03:38:10 【问题描述】:

我正在尝试配置对 MariaDB 10.3 的有限外部访问

我想要什么

用户只能从外部访问视图,但即使他有密码也不能以 root 身份连接。

初始配置

使用默认的forge 配置,我们从这些用户开始:

$ mysql -u root -p
 > use information_schema;
 > select * from user_privileges;

完整结果:https://pastebin.com/kNNVUjrz

TLDR;

两个root用户:

root 可通过以下方式访问:[localhost, 127.0.0.1, ::1, 51.99.999.101*, %] forge 可通过以下方式访问:[51.99.999.101*, %]

一个奇怪的用户:

debian-sys-maint 访问地址:[localhost]

.* 这明显是假的公网ip

我想要的配置

root 可通过以下方式访问:[localhost, 127.0.0.1, ::1, 51.99.999.101] forge 可通过以下方式访问:[localhost, 127.0.0.1, ::1, 51.99.999.101] dummyuser 可访问表单:[%]

问题

当我删除用户 'forge'@'%' 但保留 'forge'@'localhost' 时,用户 (dummyuser) 没有更多权限。

ERROR 1045 (28000): Access denied for user 'dummyuser'@'%' (using password: YES)

我所做的细节

通过 SSH 连接到服务器

$ mysql -u forge -p
 > create database mydb;
 > create view mydb.v as select user();
 > create user dummyuser identified by 'password';
 > grant select on mydb.v to dummyuser;
 > select * from information_schema.user_privileges where grantee like '%dummyuser%';
受赠人:'dummyuser'@'%' TABLE_CATALOG:def PRIVILEGE_TYPE:USAGE IS_GRANTABLE:NO

通过我的本地电脑连接

$ mysql -u dummyuser -h 51.99.999.101 -p
 > select * from mydb.v;

返回我们想要的:dummyuser@adsl-178-xx-xxx-123.adslplus.ch

但是现在当我通过 SSH 删除用户 'forge'@'%'(这次是 root)

重要提示:在创建 dummyuser 之前执行此步骤并不能解决问题。

$ mysql -u root -p
 > drop user 'forge'@'%';
 > create user 'forge'@'localhost' identified by 'passowrd';
 > grant all privileges on *.* to 'forge'@'localhost' with grant option;
 > flush privileges;

问题来了:当我使用dummyuser 登录并重试时:

$ mysql -u dummyuser -h 51.99.999.101 -p
 > select * from mydb.v;
 ERROR 1045 (28000): Access denied for user 'dummyuser'@'%' (using password: YES)

【问题讨论】:

【参考方案1】:

首先找出授权表中存在哪些行。看起来您可能已经这样做了,但让我们分两步进行:

SELECT user, host FROM mysql.user;

然后,对于其中的每一个,执行(适当填写...):

SHOW GRANTS FOR '...'@'...'

现在将生成的GRANT ... TO ... 语句转换为REVOKE ... FROM ...(并删除密码子句)。

运行那些REVOKEs 以及你需要的任何新的GRANTs但请确保拼写错误不会将您拒之门外。在您连接其他地方并检查结果时保持连接。

【讨论】:

我不确定我在寻找什么。 pastebin.com/4gGYAaHf 他们确实有选择的权限。 (dummyuser2@%forge@% 被删除后由forge@localhost 创建。) --- 我假设% 和用户名存在某种继承。重新创建具有完全权限的用户 'forge'@'%' 允许 dummyuser 进行选择。 @cbaconnier - 不完全是“继承”,而是一些检查赠款以查看哪个适用的神秘顺序。一些注意事项:'%' 不包括localhost。更具体(更少 %s)的授权会覆盖其他授权。示例(使用您的授权):可能root@'%'(不太具体)不允许任何内容,而root@'51.99.999.101'(更具体)允许一切。 在您的帮助下我想通了。我将回答最终配置如何。非常感谢。【参考方案2】:

在@rick-james 的帮助下,我得到了一个可行的案例。

我必须(重新)创建一个用户 'forge'@'%',其访问权限与 'dummyuser'@'%' 相同。'forge'@'localhost' 保留权限 root

> show grants for root@localhost;                                                                                                          
  GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*****' WITH GRANT OPTION 
  GRANT PROXY ON ''@'%' TO 'root'@'localhost' WITH GRANT OPTION      

> show grants for forge@localhost;  
  GRANT ALL PRIVILEGES ON *.* TO 'forge'@'localhost' IDENTIFIED BY PASSWORD '*****' WITH GRANT OPTION                   

> show grants for 'forge'@'%';              
  GRANT USAGE ON *.* TO 'forge'@'%' IDENTIFIED BY PASSWORD '*****' 
  GRANT SELECT ON `mydb`.`v` TO 'forge'@'%'  

> show grants for 'dummyuser'@'%';
  GRANT USAGE ON *.* TO 'dummyuser'@'%' IDENTIFIED BY PASSWORD '*****'   
  GRANT SELECT ON `mydb`.`v` TO 'dummyuser'@'%'  

现在,当我使用用户 forge@localhost 创建 dummyuser3@% 并授予他:grant select on mydb.v to dummyuser3; 时,dummyuser3 将能够选择视图。 如果用户访问forge@%,由于限制,它将只能选择视图。这是一个可以接受的解决方案。

[编辑] 它适用于这种情况:create view mydb.v as select user(); 在现实世界中,我的观点基于另一个表格。在这种情况下,用户'forge'@'%' 也需要在该表上进行选择的权限。 这是一个不太可接受的解决方案。但这是我得到的唯一一个。

最终,问题仍然悬而未决

【讨论】:

以上是关于在 MariaDB 10.3 中允许对特定用户进行外部访问的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 10.3 序列

MariaDB 10.3 主从半同步复制

CentOS7.x安装mariadb-10.3

MariaDB 10.3 主从复制

MariaDB 10.3 instant ADD COLUMN亿级大表毫秒级加字段

MariaDB 10.3 主主半同步复制