允许外部访问MariaDB 10.3中的特定用户

允许外部访问MariaDB 10.3中的特定用户,mariadb,privileges,forge,Mariadb,Privileges,Forge,我正在尝试配置对MariaDB 10.3的有限外部访问 我想要什么 用户只能通过外部访问访问视图,但即使拥有密码,也不能作为root用户连接 初始配置 使用默认配置,我们从以下用户开始: $ mysql -u root -p > use information_schema; > select * from user_privileges; 全部结果: TLDR 两个根用户: root可从以下位置访问:[localhost,127.0.0.1,::1,51.99.999.10

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

我想要什么

用户只能通过外部访问访问视图,但即使拥有密码,也不能作为root用户连接

初始配置

使用默认配置,我们从以下用户开始:

$ mysql -u root -p
 > use information_schema;
 > select * from user_privileges;
全部结果:

TLDR

两个根用户:

  • 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
)没有更多权限

错误1045(28000):用户“dummyuser”@“%”的访问被拒绝(使用密码:是)

我所做的细节

通过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'@%'
  • 表u目录:
    def
  • 特权类型:
    用法
  • 可授予:
    NO
通过我的本地PC连接

$ mysql -u dummyuser -h 51.99.999.101 -p
 > select * from mydb.v;
返回所需内容:
dummyuser@adsl-178-xx-xxx-123.adslplus.ch

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

重要提示:在创建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)

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

SELECT user, host FROM mysql.user;
然后,针对每一项,执行以下操作(适当填写
):

现在接受
GRANT。。。若要…
生成的语句,请将它们转换为
REVOKE。。。从…
(并删除密码子句)


运行那些
撤销
以及您需要的任何新的
授权。但要确保打字错误不会把你拒之门外。保持连接,同时连接其他地方并检查结果。

在@rick james的帮助下,我得到了一个工作案例

我必须(重新)创建一个用户
'forge'@'
,其访问权限与
'dummyuser'@'%
相同
'forge'@'localhost'
keep is privileges
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
并授予他:
将mydb.v上的select授予dummyuser3dummyuser3将能够选择视图。
如果用户获得了对
forge@%
的访问权限,由于该限制,它将只能选择该视图。这是一个可接受的解决方案

[编辑]它适用于以下场景:
create view mydb.v as select user()
在现实世界中,我的视图基于另一个表。在这种情况下,用户
'forge'@'
还需要在该表上进行选择的权限。 这是一个不太可接受的解决方案。但那是我仅有的一个


确切地说,这个问题仍然悬而未决

我不确定我要用这个来寻找什么。他们确实有选择的特权。(
dummyuser2@%
forge@localhost
forge@%
被删除之后。)---我假设
%
和用户名存在某种继承。使用完全权限重新创建用户“
”forge“@”
,允许dummyuser进行选择。@cbaconnier-不完全是“继承”,而是检查授予以查看哪一项适用的神秘顺序。一些注意事项:
“%”
不包括
localhost
。更具体(更少%s)的授权将覆盖其他授权。示例(使用您的授权):可能
root@'
(不太具体)不允许任何内容,而
root@'51.99.999.101'
(更具体)允许所有内容。我在您的帮助下解决了这个问题。我将回答最终配置如何。非常感谢你。
> 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'@'%'