在 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 中允许对特定用户进行外部访问的主要内容,如果未能解决你的问题,请参考以下文章