我正在尝试配置对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'@'%'
def
USAGE
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)
答案 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();
还需要在该表上进行选择的特权。
这是一个不太可接受的解决方案。但这是我唯一的一个。
确切地说,问题仍然悬而未决