Разрешить внешний доступ для конкретного пользователя в MariaDB 10.3 - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь настроить ограниченный внешний доступ к 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%';
  • GRANTEE: 'dummyuser'@'%'
  • TABLE_CATALOG: def
  • PRIVILEGE_TYPE: USAGE
  • IS_GRANTABLE: NO

Coчерез мой локальный ПК

$ mysql -u dummyuser -h 51.99.999.101 -p
 > select * from mydb.v;

Возвращает то, что мы хотим: dummyuser@adsl-178-xx-xxx-123.adslplus.ch

Но теперь, когда я удаляю пользователя 'forge'@'%' через SSH (с 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)

Ответы [ 2 ]

0 голосов
/ 11 декабря 2018

С помощью @ rick-james я получил рабочий кейс.

Мне пришлось (ре) создать пользователя 'forge'@'%' с таким же ограниченным доступом, что и 'dummyuser'@'%'.
* 1006.* keep is привилегии 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 и даю ему: grant select on mydb.v to dummyuser3; dummyuser3 сможет выбрать представление.
ВВ случае, если пользователь получит доступ к forge@%, из-за ограничения он сможет выбрать только представление.Что является приемлемым решением.

[Редактировать] Он работает с ЭТОМ сценарием: create view mydb.v as select user();
В реальном мире мое мнение основано на другой таблице.В этом случае пользователю 'forge'@'%' также требуется право выбора для этой таблицы.Это менее приемлемое решение.Но это единственный, который я получил.

В окончательном виде вопрос все еще открыт

0 голосов
/ 07 декабря 2018

Начните с выяснения того, какие строки существуют в таблицах грантов.Похоже, что вы, возможно, сделали это, но давайте сделаем это в два шага:

SELECT user, host FROM mysql.user;

Затем для каждого из них выполните (с соответствующим образом заполненным ...):

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

Теперь возьмите GRANT ... TO ... созданных операторов, превратите их в REVOKE ... FROM ... (и удалите предложение пароля).

Запустите эти REVOKEs плюс все новые GRANTs, которые вам нужны. Но будьте уверены, что опечатка не заблокирует вас. Оставайтесь на связи, пока вы подключаетесь в другом месте, и проверьте результаты.

...