- •Кто и откуда может подключаться к серверу
- •Какой уровень привилегий должен иметь пользователь и на доступ к чему эти привилегии предоставляются
- •Как определить имя локального компьютера в таблице разрешений
- •Нужны ли пользователю административные привилегии
- •Отмена привилегий и удаление пользователей
- •Головоломка с привилегиями
- •Использование mysqlcheck для сопровождения и аварийного восстановления таблиц.
- •Mysqldump, получение дампов данных и структуры таблицы
- •Mysqlhotcopy, копирование баз данных и таблиц MySql
- •Способ хранения таблиц и баз данных
- •Выделенные разделы
- •Типы таблиц
- •Столбцы
- •Резервирование и копирование баз данных с помощью программы mysqldump
- •Использование методов прямого копирования
- •Репликация баз данных
- •Восстановление данных из архивов
- •Восстановление базы данных
- •Восстановление отдельных таблиц
- •Внутренняя безопасность: защита доступа к каталогу данных
- •Столбцы привилегий таблицы разрешений
- •Привилегии баз данных и таблиц
- •Административные привилегии
- •Как сервер управляет доступом клиентов
- •Проверка запроса
- •Как хранятся пароли в таблице user
- •Порядок сравнения столбцов
- •Как минимизировать риск при работе с таблицами разрешений
- •Установка пользователей без помощи оператора grant
- •Головоломка с привилегиями (продолжение)
Порядок сравнения столбцов
Сервер MySQL сортирует записи таблиц разрешений в определенном порядке, а затем, согласно этому порядку, ищет соответствующие соединениям данные. Важно понимать, в каком порядке записи располагаются сервером MySQL, особенно в таблице user.
Считывая содержимое таблицы user, сервер сортирует ее записи, согласно значениям столбцов Host и User. Доминирующую роль здесь играет значение столбца Host (т.е. записи с одинаковыми значениями столбца Host размещаются рядом, а затем упорядочиваются по значению User). Однако выполняемая сортировка не является лексикографической, или, скорее, является таковой лишь частично. Основной принцип — более высокий приоритет символьных значений по сравнению со специальными символами. Это означает, что если пользователь подключается к компьютеруboa.snake.net, а в таблице имеются записи со значениями boa.snake.net и%.snake.net, то будет выбрана именно первая запись. Аналогичным образом, значение %.snake.net имеет больший приоритет, чем %.net, которое, в свою очередь, более приоритетно, чем %. Точно так же обрабатываются и IP-адреса. Порядок приоритетности значений для пользователя, подключающегося с компьютера с IP-адресом 192.168.3.14, будет выглядеть следующим образом: 192.168.3.14, 192.168.3.%, 192.168.%, 192.% и %.
Как минимизировать риск при работе с таблицами разрешений
Ниже приведены некоторые рекомендации, которые следует учитывать при присвоении привилегий, а также описываются проблемы, связанные с неправильным выбором администратора. Для начала необходимо весьма аккуратно присваивать глобальные привилегии суперпользователей. Другими словами, не следует активизировать привилегии в записях таблицы user. Используйте с этой целью другие таблицы, чтобы ограничить область применения привилегий отдельными базами данных, таблицами и столбцами. Привилегии таблицы user позволяют воздействовать на функционирование всего сервера и получать доступ ко всем таблицам любой базы данных
Не предоставляйте никаких привилегий для доступа к базе данных mysql. Ведь пользователь, обладающий привилегиями доступа к базе данных с таблицами разрешений, может легко изменить свои привилегии и получить таким образом доступ и к другим базам данных. Присвоение пользователю достаточных привилегий для изменения таблиц базы данных mysql дает такому пользователю и привилегию GRANT. Возможность непосредственного изменения таблицы практически равноценна возможности запуска оператора grant.
Привилегию FILE также рекомендуется присваивать с большой осторожностью. Так, обладающий этой привилегией пользователь может запросто выполнить следующие операторы:
CREATE TABLE etc_passwd (pwd_entry TEXT);
LOAD DATA INFILE "/etc/passwd" INTO TABLE etc_passwd;
SELECT * FROM etc_passwd;
Выполнив эти операторы, пользователь получит содержимое файла паролей. Фактически, наличие привилегии FILEдает возможность пользователю раскрыть содержимое любого читаемого файла сервера, даже работая через сеть.
Кроме того, привилегия FILE может использоваться для повреждения баз данных в системах, работающих с недостаточными файловыми правами. Именно поэтому администратор должен сделать содержимое каталога данных читаемым только для сервера. Если файлы таблиц баз данных открыты для всеобщего обзора, прочитать их сможет не только пользователь учетной записи сервера, но и любой другой пользователь, обладающий привилегией FILE и подключающийся к серверу через сеть. Как это реализуется, показано на следующем примере.
Создайте таблицу со столбцом LONGBLOB.
USE test
CREATE TABLE tmp (b LONGBLOB)
Используйте таблицу для записи содержимого файла всех нужных таблиц, а затем запишите это содержимое в файл своей базы данных.
LOAD DATA INFILE "./other_db/x.frm" INTO TABLE tmp
FIELDS ESCAPED BY " LINES TERMINATED BY "
SELECT * FROM tmp INTO OUTFILE "y.frm"
FIELDS ESCAPED BY " LINES TERMINATED BY "
DELETE FROM tmp
LOAD DATA INFILE "./other_db/x.ISD" INTO TABLE tmp
FIELDS ESCAPED BY " LINES TERMINATED BY "
SELECT * FROM tmp INTO OUTFILE "y.ISD"
FIELDS ESCAPED BY " LINES TERMINATED BY "
DELETE FROM tmp
LOAD DATA INFILE "./other_db/x.ISM" INTO TABLE tmp
FIELDS ESCAPED BY " LINES TERMINATED BY "
SELECT * FROM tmp INTO OUTFILE "y.ISM"
FIELDS ESCAPED BY " LINES TERMINATED BY "
В результате создана новая таблица, содержащая информацию таблицы other_db.x, к которой имеется полный доступ.
Чтобы избежать подобных атак, установите права доступа к содержимому каталога данных в соответствии с инструкциями, представленными в пункте "Внутренняя безопасность: защита доступа к каталогу данных". Можно также при запуске сервера использовать опцию —skip-show- database. Это запретит пользователям запускать операторы SHOW database и show tables для баз данных, к которым им запрещен доступ, и не позволит пользователям случайно найти базу данных или таблицу, доступ к которым им не должен предоставляться.
Иногда и привилегия ALTER используется таким образом, о котором даже и не подозревают администраторы. Предположим, например, что администратор желает предоставить пользователю userl доступ к таблице tablel, но не к таблице table2. Обладающий привилегией alter пользователь может легко обойти это ограничение, переименовав с помощью оператора ALTER TABLE таблицу table2 в tablel.
Проявляйте осторожность и с привилегией GRANT. Два пользователя, обладающие разными привилегиями, могут легко расширить круг возможностей друг друга.