Предположим, у меня есть сервер MySQL, и я хотел бы предоставить набор (нетривиальных) разрешений 10 пользователям (user1, user2, ... user10), каждый из которых может поступать с любого из 10 разных хостов, которые могут ' t быть специально выбранным с помощью подстановочного знака или сетевой маски; например:
Есть ли простой способ справиться с этим без необходимости поддерживать 10x10 = 100 наборов GRANT для каждой отдельной комбинации пользователь @ хост?
Я могу придумать несколько компромиссов:
Используйте более широкий подстановочный знак, например "user1'@'%.example.com". Сюда входят все необходимые хосты, но также разрешается доступ с других хостов в пределах example.com, некоторые из которых могут быть вредоносными. (Представьте себе университет с тысячами студентов внутри сети.) Надежные пароли решают проблему, но все же неплохо иметь дополнительный уровень безопасности для конкретного хоста.
Сделайте №1, но также используйте брандмауэр, чтобы ограничить порт MySQL 10 конкретными хостами, которые мы хотим разрешить. Обратной стороной будет то, что позже мы захотим добавить 11-го пользователя с очень ограниченными GRANT, который может получить доступ из любого места: 'user11' @ '%'.
Самое близкое, что я знаю к тому, о чем вы спрашиваете, - это Securich проект. Он создает набор хранимых процедур и помощников, которые можно использовать для создания псевдоролей и управления множеством привилегий в MySQL. Обратите внимание, что я сам не использовал его; Я только что с интересом смотрел сообщения в блоге. Вы можете узнать больше на http://mysqlpreacher.com/wordpress/tag/securich/. Он также был представлен в прошлом году на конференции MySQL: http://en.oreilly.com/mysql2011/public/schedule/detail/17372 хотя я не могу найти слайд-колоду, и Шери К. Кабрал упомянула об этом в своем выступлении на IOUG Collaborate: http://technocation.org/files/doc/MySQLSecurity2011_06.pdf
Вот концептуальный пример
Предположим, вы хотите создать список пользователей
где каждый пользователь будет заходить на example.com с этими префиксами
и каждому пользователю должно быть предоставлено
ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ, ВЫБРАТЬ
а пароль для пользователей - "любой желающий"
Вот чистый запрос MySQL Query
select CONCAT('GRANT ',Grants,' TO ''',User,'''@''',Host,'.example.com'' IDENTIFIED BY PASSWORD ''',pwd,''';') GrantCommand
from
(select "INSERT,UPDATE,DELETE,SELECT ON *.*" Grants) G,
(SELECT PASSWORD('whateveriwant') pwd) P,
(
select 'user1' User
union select 'user2'
union select 'user3'
union select 'user4'
union select 'user5'
union select 'user6'
union select 'user7'
union select 'user8'
union select 'user9'
union select 'user10'
) U,
(
select 'abc.foo' Host
union select 'def.bar'
union select 'ghi.baz'
) H
;
Вот этот чистый MySQL-запрос, выполняемый в MySQL-клиенте
mysql> select CONCAT('GRANT ',Grants,' TO ''',User,'''@''',Host,'.example.com'' IDENTIFIED BY PASSWORD ''',pwd,''';') GrantCommand
-> from
-> (select "INSERT,UPDATE,DELETE,SELECT ON *.*" Grants) G,
-> (SELECT PASSWORD('whateveriwant') pwd) P,
-> (
-> select 'user1' User
-> union select 'user2'
-> union select 'user3'
-> union select 'user4'
-> union select 'user5'
-> union select 'user6'
-> union select 'user7'
-> union select 'user8'
-> union select 'user9'
-> union select 'user10'
-> ) U,
-> (
-> select 'abc.foo' Host
-> union select 'def.bar'
-> union select 'ghi.baz'
-> ) H
-> ;
+------------------------------------------------------------------------------------------------------------------------------------------------+
| GrantCommand |
+------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user1'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user1'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user1'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user2'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user2'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user2'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user3'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user3'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user3'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user4'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user4'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user4'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user5'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user5'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user5'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user6'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user6'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user6'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user7'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user7'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user7'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user8'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user8'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user8'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user9'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user9'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user9'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user10'@'abc.foo.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user10'@'def.bar.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
| GRANT INSERT,UPDATE,DELETE,SELECT ON *.* TO 'user10'@'ghi.baz.example.com' IDENTIFIED BY PASSWORD '*2BE1C8DCB5977386CFE99E3BE97EEFA7510786BA'; |
+------------------------------------------------------------------------------------------------------------------------------------------------+
30 rows in set (0.00 sec)
mysql>
Просто поместите этот запрос в текстовый файл, например /root/MakeBulkUserGrants.sql.
Тогда просто беги
mysql -uroot -hlocalhost -p < /root/MakeBulkUserGrants.sql > /root/BulkUserGrants.sql
Попробуйте !!!
Прежде всего, я бы рекомендовал отключить разрешение DNS в вашей конфигурации mysql. (опция skip-name-resolve) Если вы настраиваете гранты через полное доменное имя (abc.bcd.example.com) вместо IP, у вас могут возникнуть проблемы, когда DNS-запрос не может быть запущен вовремя, и пользователь не сможет воспользоваться этой привилегией вы ему дали (или его, если это приложение).
Кроме того, время соединения будет намного быстрее при использовании пропуска имени-разрешения, при загрузке mysql вы не можете жить без этой опции.
Для 100 грантов я бы использовал сценарий оболочки, чтобы добавить привилегии, а если вы хотите запросить их, используйте pt-show-grants, часть Percona Toolkit.
Надеюсь это поможет