【问题标题】:Allow external access to specific user in MariaDB 10.3在 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)

【问题讨论】:

    标签: mariadb privileges forge


    【解决方案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'@'%' 也需要在该表上进行选择的权限。 这是一个不太可接受的解决方案。但这是我得到的唯一一个。

    最终,问题仍然悬而未决

    【讨论】:

      猜你喜欢
      • 2011-12-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-23
      • 2012-04-16
      • 1970-01-01
      相关资源
      最近更新 更多