Назад | Перейти на главную страницу

Предоставление разрешений MySQL для определенного списка серверов

Предположим, у меня есть сервер MySQL, и я хотел бы предоставить набор (нетривиальных) разрешений 10 пользователям (user1, user2, ... user10), каждый из которых может поступать с любого из 10 разных хостов, которые могут ' t быть специально выбранным с помощью подстановочного знака или сетевой маски; например:

Есть ли простой способ справиться с этим без необходимости поддерживать 10x10 = 100 наборов GRANT для каждой отдельной комбинации пользователь @ хост?

Я могу придумать несколько компромиссов:

  1. Используйте более широкий подстановочный знак, например "user1'@'%.example.com". Сюда входят все необходимые хосты, но также разрешается доступ с других хостов в пределах example.com, некоторые из которых могут быть вредоносными. (Представьте себе университет с тысячами студентов внутри сети.) Надежные пароли решают проблему, но все же неплохо иметь дополнительный уровень безопасности для конкретного хоста.

  2. Сделайте №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

Вот концептуальный пример

Предположим, вы хотите создать список пользователей

  • user1
  • user2
  • ...
  • user10

где каждый пользователь будет заходить на example.com с этими префиксами

  • abc.foo
  • def.bar
  • ghi.baz

и каждому пользователю должно быть предоставлено

ВСТАВИТЬ, ОБНОВИТЬ, УДАЛИТЬ, ВЫБРАТЬ

а пароль для пользователей - "любой желающий"

Вот чистый запрос 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.

Надеюсь это поможет