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

时间:2018-12-07 11:11:53

标签: mariadb privileges forge

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

  

我想要的

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

  

初始配置

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

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

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

TLDR;

两个root用户:

  • root可从以下位置访问:[[localhost127.0.0.1::151.99.999.101 *,%]
  • forge可从以下网站访问:[51.99.999.101 *,%]

一个奇怪的用户:

  • debian-sys-maint可从[[localhost]
  • 访问

。* 这显然是伪造的公共ip

  

我想要的配置

  • root可从以下位置访问:[localhost127.0.0.1::151.99.999.101]
  • forge可从以下位置访问:[localhost127.0.0.1::151.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%';
  • GRANTEE:'dummyuser'@'%'
  • TABLE_CATALOG:def
  • PRIVILEGE_TYPE:USAGE
  • IS_GRANTABLE: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'@'%'时:

重要说明::在创建虚拟用户之前执行此步骤不能解决问题。

$ 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)

2 个答案:

答案 0 :(得分:2)

从找出授权表中存在哪些行开始。看起来您可能已经这样做了,但是让我们做两个步骤:

SELECT user, host FROM mysql.user;

然后,对每个选项进行操作(并适当填充...):

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

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

运行这些REVOKEs以及您需要的所有新GRANTs但是请确保输入错误不会将您锁定。在其他地方连接并检查结果时,请保持连接状态。

答案 1 :(得分:0)

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

我必须(重新)创建一个用户 <form #searchForm="ngForm" id="searchForm" name="searchForm" (ngSubmit)="search()"> <b>Aktion/ Projekt:</b> <div class="form-group"> <label for="activityDropDown" class="mt-2">Aktion / Projekt:</label> <ngx-select-dropdown name="activityDropDown" id="activityDropDown" [multiple]="true" [(value)]="activityDropDownModel" [config]="activityDropDownConfig" [options]="activityDropDownOptions" (change)="activityDropDownSelectionChanged($event)"></ngx-select-dropdown> <label class="mt-2" for="visitPeriodInput">Besuchszeitraum Von / Bis:</label> <input name="visitPeriodInput" id="visitPeriodInput" type="text" autocomplete="off" placeholder="Keine Einschränkung ausgewählt" class="form-control" bsDaterangepicker [bsConfig]="{ dateInputFormat: 'MM/DD/YYYY' }" [(ngModel)]="searchFormModel.visitPeriod"> </div> <b>Fragebogen / Fragen</b> <div class="form-group"> <label for="questionnaireDropDown" class="mt-2">Fragebogen:</label> <ngx-select-dropdown name="questionnaireDropDown" id="questionnaireDropDown" [multiple]="true" [(value)]="questionnaireDropDownModel" [config]="questionnaireDropDownConfig" [options]="questionnaireDropDownOptions"></ngx-select-dropdown> <label for="questionTextInput" class="mt-2">Fragetext beinhalt:</label> <input type="text" placeholder="Keine Einschränkung angegeben" class="form-control" name="questionTextInput" id="questionTextInput" [(ngModel)]="searchFormModel.questionText" autocomplete="off"> </div> </form> ,该用户具有与'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'@'%' 创建dummyuser3@%并授予他:forge@localhost时,dummyuser3将能够选择视图。
如果用户由于限制而可以访问grant select on mydb.v to dummyuser3;,则只能选择视图。可以接受的解决方案。

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

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