Документация MySQL
| Документация DHTML | Документация Smarty | SVG/VML Графика и JavaScript
| Документация bash |
| Глава 4. Администрирование баз данных | ||
|---|---|---|
| Пред. | След. | |
Глава 4. Администрирование баз данных
Содержание
- 4.1. Конфигурирование MySQL
- 4.2. Общие проблемы безопасности и система привилегий доступа MySQL
- 4.2.1. Общие принципы обеспечения безопасности
- 4.2.2. Как обезопасить MySQL от хакеров
- 4.2.3. Опции запуска
mysqld, относящиеся к безопасности - 4.2.4. Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
- 4.2.5. Функции, выполняемые системой привилегий
- 4.2.6. Как работает система привилегий
- 4.2.7. Привилегии, предоставляемые MySQL
- 4.2.8. Соединение с сервером MySQL
- 4.2.9. Управление доступом, этап 1: верификация подсоединения
- 4.2.10. Управление доступом, этап 2: верификация запросов
- 4.2.11. Причины появления ошибок
Access denied('в доступе отказано')
- 4.3. Управление учетными записями пользователей MySQL
- 4.3.1. Синтаксис команд
GRANTиREVOKE - 4.3.2. Имена пользователей MySQL и пароли
- 4.3.3. Когда изменения в привилегиях вступают в силу
- 4.3.4. Задание изначальных привилегий MySQL
- 4.3.5. Добавление новых пользователей в MySQL
- 4.3.6. Ограничение ресурсов пользователя
- 4.3.7. Задание паролей
- 4.3.8. Обеспечение безопасности своего пароля
- 4.3.9. Использование безопасных соединений
- 4.3.1. Синтаксис команд
- 4.4. Предотвращение катастроф и восстановление
- 4.4.1. Резервное копирование баз данных
- 4.4.2. Синтаксис
BACKUP TABLE - 4.4.3. Синтаксис
RESTORE TABLE - 4.4.4. Синтаксис
CHECK TABLE - 4.4.5. Синтаксис
REPAIR TABLE - 4.4.6. Использование
myisamchkдля профилактики таблиц и послеаварийного - 4.4.7. Настройка режима профилактики таблиц
- 4.4.8. Получение информации о таблице
- 4.5. Справочник по языку администрирования баз данных
- 4.6. Локализация MySQL и использование национальных алфавитов
- 4.6.1. Набор символов, применяющийся для записи данных и сортировки
- 4.6.2. Сообщения об ошибках на языках, отличных от английского
- 4.6.3. Добавление набора символов
- 4.6.4. Массивы определения символов
- 4.6.5. Поддержка упорядочивания строк
- 4.6.6. Поддержка многобайтовых символов
- 4.6.7. Проблемы с наборами символов
- 4.7. Серверные сценарии и утилиты MySQL
- 4.8. Клиентские сценарии и утилиты MySQL
- 4.8.1. Обзор клиентских сценариев и утилит
- 4.8.2.
mysql, Утилита командной строки - 4.8.3.
mysqladmin, Администрирование MySQL-сервера. - 4.8.4. Использование
mysqlcheckдля сопровождения и аварийного восстановления таблиц. - 4.8.5.
mysqldump, Получение дампов данных и структуры таблицы - 4.8.6.
mysqlhotcopy, Копирование баз данных и таблиц MySQL - 4.8.7.
mysqlimport, импорт данных из текстовых файлов - 4.8.8.
mysqlshow, просмотр баз данных, таблиц и столбцов - 4.8.9.
mysql_config, Получение опций компиляции для компиляции клиентских программ - 4.8.10.
perror, разъяснение кодов ошибок - 4.8.11. Как запускать SQL-команды из текстового файла
- 4.9. Файлы журналов MySQL
- 4.10. Репликация в MySQL
- 4.10.1. Введение
- 4.10.2. Как реализована репликация: обзор
- 4.10.3. Как настроить репликацию
- 4.10.4. Возможности репликации и известные проблемы
- 4.10.5. Опции репликации в файле
my.cnf - 4.10.6. SQL-команды, относящиеся к репликации
- 4.10.7. Часто задаваемые вопросы по репликации
- 4.10.8. Поиск неисправностей репликации
4.1. Конфигурирование MySQL
- 4.1.1. Параметры командной строки
mysqld - 4.1.2. Файлы параметров
my.cnf - 4.1.3. Установка нескольких серверов на один компьютер
- 4.1.4. Запуск нескольких серверов MySQL на одном компьютере
4.1.1. Параметры командной строки mysqld
В большинстве случаев управление
параметрами mysqld осуществляется
при помощи файлов параметров (see
Раздел 4.1.2, «Файлы параметров my.cnf»).
mysqld и mysqld.server
считывают параметры из групп
mysqld и server.
mysqld_safe считывает
параметры из групп mysqld,
server, mysqld_safe и
safe_mysqld. Встроенный
сервер MySQL обычно считывает
параметры из server,
embedded и xxxxx_SERVER,
где xxxxx - имя приложения.
mysqld принимает следующие параметры
командной строки (для получения
полного списка выполните mysqld
--help):
--ansiИспользовать синтаксис ANSI SQL вместо синтаксиса MySQL (see Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).
-b, --basedir=pathПуть к каталогу установки. Все остальные пути обычно определяются относительно этого пути.
--big-tablesПозволяет использовать наборы результатов большого объема за счет сохранения всех временных файлов в одном. Данный параметр позволяет устранить большинство ошибок 'table full' (таблица переполнена), но замедляет обработку запросов, для которых было бы достаточно таблиц, расположенных в памяти. Начиная с версии 3.23.2 в MySQL эта проблема решается автоматически: память используется для небольших временных таблиц, а при необходимости происходит переключение на таблицы, расположенные на диске.
--bind-address=IPIP-адрес, с которым необходимо установить связь.
--consoleПисать журнал сообщений/ошибок в stderr/stdout даже если
--log-errorуказана. На Windows mysqld просто не будет закрывать консольное окно если указана эта опция.--character-sets-dir=pathКаталог, в котором расположены наборы символов (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
--chroot=pathИзменяет корневой каталог программы mysqld во время запуска. Рекомендуемая мера безопасности для MySQL 4.0 (MySQL 3.23 не вполне в состоянии предоставить 100% измененную среду запуска). Эта опция некоторым образом ограничивает использование функций
LOAD DATA INFILEиSELECT ... INTO OUTFILE.--core-fileЗаписывает файл ядра, если происходит аварийное прекращение работы
mysqld. В некоторых системах также необходимо указать--core-file-sizeдля safe_mysqld (see Раздел 4.7.2, «safe_mysqld, оболочкаmysqld»). Обратите внимание на то, что в некоторых системах, таких как Solaris, не удастся записать файл ядра, если используется параметр--user.-h, --datadir=pathПуть к корневому каталогу базы данных.
--debug[...]=Если MySQL настроен при помощи
--with-debug, то этот параметр позволяет получить файл трассировки, в котором отражена работаmysqld(see Раздел E.1.2, «Создание трассировочных файлов»).--default-character-set=charsetЗадает набор символов, принятый по умолчанию (see Раздел 4.6.1, «Набор символов, применяющийся для записи данных и сортировки»).
--default-table-type=typeЗадает тип таблиц, принятый по умолчанию (see Глава 7, Типы таблиц MySQL).
--delay-key-write[= OFF | ON | ALL]Указывает, как на MyISAM
DELAYED KEYSдолжен обрабатываться. See Раздел 5.5.2, «Настройка параметров сервера».--delay-key-write-for-all-tables; В MySQL 4.0.3 следует использовать --delay-key-write=ALL.Отмена сброса на диск ключевых буферов для всех таблиц
MyISAMмежду записями. See Раздел 5.5.2, «Настройка параметров сервера».--des-key-file=filenameЗадает считывание из файла filename принятых по умолчанию ключей, которые используются для
DES_ENCRYPT()иDES_DECRYPT().--enable-external-locking (было --enable-locking)Включает блокировку доступа к системе. Обратите внимание на то, что если этот параметр используется в системе, где функция
lockdполностью не работает (например, в Linux), это может привести к зависанию mysqld.--enable-named-pipeВключает поддержку для именованных каналов (только в NT/Win2000/XP).
-T, --exit-infoПобитовое маскирование различных флагов, которое применяется для отладки сервера mysqld; не следует использовать этот параметр, если вы хорошо не разбираетесь в том, что именно он делает!
--flushЗадает сброс на диск всех изменений после каждой команды SQL. Обычно MySQL только направляет все изменения на диск после каждой команды SQL, делегируя управление синхронизацией записи на диск операционной системе (see Раздел A.4.1, «Что делать, если работа MySQL сопровождается постоянными сбоями»).
-?, --helpВывод сокращенной справки и завершение выполнения.
--init-file=fileЗадает считывание команды SQL из файла file при запуске.
-L, --language=...Вывод сообщений об ошибках клиента на указанном языке. Может быть задан в виде полного пути (see Раздел 4.6.2, «Сообщения об ошибках на языках, отличных от английского»).
-l, --log[=file]Задает занесение в файл журнала соединений и запросов (see Раздел 4.9.2, «Общий журнал запросов»).
--log-bin=[file]Двоичный журнал обновлений. Сохранение всех запросов, изменяющих данные, в файл. Используется для архивного копирования и репликации. See Раздел 4.9.4, «Бинарный журнал обновлений».
--log-bin-index[=file]Имя индексного файла для двоичного журнала обновлений. See Раздел 4.9.4, «Бинарный журнал обновлений».
--log-error[=file]Писать ошибки и сообщения в этот файл. See Раздел 4.9.1, «Журнал ошибок».
--log-isam[=file]Заносит в файл журнала все изменения
ISAM/MyISAM(используется только при отладкеISAM/MyISAM).--log-slow-queries[=file]Заносит в файл журнала все запросы, выполнение которых заняло больше, чем
long_query_timeсекунд (see Раздел 4.9.5, «Журнал медленных запросов»).--log-update[=file]Заносит в файл журнала обновления
file.#где#представляет собой уникальный номер, если он не был задан (see Раздел 4.9.3, «Журнал обновлений (update)»).--log-long-formatЗаносит в файл журнала обновлений некоторую дополнительную информацию. Если задано
--log-slow-queries, то запросы, не использующие индексов, будут заноситься в журнал медленных запросов.--low-priority-updatesОперациям по изменению таблиц (
INSERT/DELETE/UPDATE) будет назначен более низкий приоритет, чем операциям выбора. Это также можно реализовать при помощи{INSERT | REPLACE | UPDATE | DELETE} LOW_PRIORITY ..., чтобы понизить приоритет только одного запроса, или черезSET LOW_PRIORITY_UPDATES=1, чтобы изменить приоритет в одном потоке (see Раздел 5.3.2, «Вопросы блокирования таблиц»).--memlockФиксирует процесс
mysqldв памяти. Этот параметр работает только в том случае, если ваша система поддерживает системный вызовmlockall(), например Solaris. Такая мера может быть полезной, если операционная система записываетmysqldв файл подкачки на диск.--myisam-recover [=параметр[,параметр...]]]Параметр - это любое сочетание
DEFAULT,BACKUP,FORCEилиQUICK. Если необходимо отключить данную функцию, укажите вместо набора параметров явно"". Если эта функция используется,mysqldпроверит таблицу на предмет того, была ли она отмечена как сбойная или не была закрыта надлежащим образом (последний вариант действует только в том случае, если был включен параметр--skip-external-locking). В любом из этих случаевmysqldпроизведет полную проверку таблицы. Если таблица была повреждена,mysqldпопытается ее восстановить. Приведенные ниже параметры влияют на работу процесса восстановления.Параметр Описание DEFAULT Аналогично отсутствию каких-либо параметров для функции --myisam-recover.BACKUP Если во время восстановления таблица данных была изменена, сохраняется резервная копия файла данных table_name.MYDпод именемtable_name-datetime.BAK.FORCE Запуск восстановления, даже если будет утрачено более одной строки из файла .MYD.QUICK Не проверять строки в таблице, в которых отсутствуют удаленные блоки. Перед автоматическим восстановлением таблицы MySQL добавит запись об этом в журнал ошибок. Если необходимо, чтобы восстановление после большинства ошибок осуществлялось без вмешательства пользователя, следует установить параметры
BACKUPиFORCE. Тогда восстановление будет производиться даже в случае, если некоторые строки будут удалены, но файл данных будет сохраняться в виде резервной копии, поэтому впоследствии всегда можно будет определить, что произошло.--pid-file=pathПуть к pid-файлу используется функцией
safe_mysqld.-P, --port=...Номер порта для прослушивания соединений TCP/IP.
-o, --old-protocolИспользовать протокол 3.20 для совместимости с некоторыми очень старыми клиентами (see Раздел 2.5.5, «Модернизация с версии 3.20 до версии 3.21»).
--one-threadИспользовать только один поток (для отладки в системе Linux) (see Раздел E.1, «Отладка сервера MySQL»).
-O, --set-variable var=optionЗадает значение для переменной.
--help- выводит список переменных. Подробное описание всех переменных можно найти в разделеSHOW VARIABLESэтого руководства (see Раздел 4.5.6.4, «SHOW VARIABLES»).Обратите внимание,
--set-variableморально устарела с версии MySQL 4.0. Просто используйте--var=option. See Раздел 5.5.2, «Настройка параметров сервера».В MySQL 4.0.2 вы можете устанавливать переменную непосредственно с помощью
--variable-name=option, иset-variableбольше не нужна в файлах опций.Если вы хотите ограничить максимальное значение, в которое может быть установлена пемеременная при помощи
SET, определите это значение с помощью опции--maximum-variable-nameSee Раздел 5.5.6, «Синтаксис командыSET».Когда переменная будет устанавливаться в какое-либо значение, MySQL автоматически будет корректировать его, чтобы оно оставалось в указананных рамках; также MySQL может немного корректировать установленное значение с тем, чтобы эффективнее использовались внутренние алгоритмы.
Раздел по настройке параметров сервера включает информацию по их оптимизации (see Раздел 5.5.2, «Настройка параметров сервера»).
--safe-modeПропуск некоторых этапов оптимизации.
--safe-show-databaseПри использовании этого параметра команда
SHOW DATABASESвыдает только те базы данных, для которых у пользователя есть какие-либо привилегии. Начиная с версии 4.0.2 этот параметр является недействительным и больше ни на что не влияет (его значение установлено по умолчанию), так как в новой версии появилась привилегияSHOW DATABASES(see Раздел 4.3.1, «Синтаксис командGRANTиREVOKE»).--safe-user-createКогда этот параметр включен, пользователь не может создавать новых пользователей при помощи команды
GRANT, если он не имеет привилегииINSERTдля таблицыmysql.userили для любого столбца этой таблицы.--skip-bdbЗапретить использование таблиц BDB. Это сэкономит память и может ускорить работу.
--skip-concurrent-insertОтключает возможность одновременного выбора и вставки данных для таблиц
MyISAM(используется только в том случае, если в этой функции найдена ошибка).--skip-delay-key-write; в MySQL 4.0.3 следует использовать --delay-key-write=OFFИгнорирует параметр
DELAY_KEY_WRITEдля всех таблиц (see Раздел 5.5.2, «Настройка параметров сервера»).--skip-grant-tablesВключение данного параметра приводит к тому, что сервер совсем не использует систему привилегий - таким образом полный доступ ко всем базам данных получают все! (Можно дать серверу команду снова использовать таблицы доступа, запустив
mysqladmin flush-privilegesилиmysqladmin reload.)--skip-host-cacheНикогда не использовать кэш имени главного компьютера для быстрого разрешения соответствий имен и IP-адресов, а вместо этого всегда запрашивать DNS-сервер по каждому соединению (see Раздел 5.5.5, «Как MySQL использует DNS»).
--skip-innodbЗапретить использование таблиц InnoDB. Это сэкономит память и может ускорить работу.
--skip-external-locking (было --skip-locking)Не использовать средства системных блокировок. Чтобы воспользоваться функциями
isamchkилиmyisamchk, необходимо выключить сервер (see Раздел 1.4.3, «Насколько стабильным является MySQL?»). Обратите внимание на то, что в MySQL версии 3.23 для восстановления или проверки таблицMyISAMможно использоватьREPAIRиCHECK.--skip-name-resolveНе производится разрешения имен хостов. Все значения в столбце Host в таблицах привилегий должны быть IP-адресами или значениями localhost (see Раздел 5.5.5, «Как MySQL использует DNS»).
--skip-networkingПрослушивание соединений TCP/IP не производится. Связь с
mysqldдолжна осуществляться через сокеты Unix. Этот параметр рекомендуется для систем, в которых разрешены только локальные запросы (see Раздел 5.5.5, «Как MySQL использует DNS»).--skip-newНе использовать новые (возможно, неправильные) операции.
--skip-symlinkНе удалять и не переименовывать файлы, на которые указывает файл
symlinkedв каталоге данных.--skip-safemallocЕсли MySQL настроен при помощи
--with-debug=full, все программы будут проверять память на наличие выхода за границы области памяти при каждом заполнении и освобождении памяти. Поскольку такая проверка осуществляется довольно медленно, от нее можно отказаться, воспользовавшись этим параметром.--skip-show-databaseНе позволяет использовать команду
SHOW DATABASES, если пользователь не имеет привилегииSHOW DATABASES. Начиная с версии 4.0.2 этот параметр больше не нужен, поскольку доступ теперь может быть разрешен при помощи привилегииSHOW DATABASES.--skip-stack-traceНе записывать трассировку стеков. Этот параметр может оказаться полезным, когда
mysqldзапущен под отладчиком. В некоторых системах данный параметр также необходимо использовать для получения файла ядра (see Раздел E.1, «Отладка сервера MySQL»).--skip-thread-priorityОтключает использование приоритетов потока, чтобы уменьшить время ожидания ответа.
--socket=pathФайл канала, который используется для локального соединения вместо файла, принятого по умолчанию,
/tmp/mysql.sock.--sql-mode=параметр[,параметр[,параметр...]]Параметр может представлять собой любое сочетание из:
REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,SERIALIZE,ONLY_FULL_GROUP_BY. Если нужно произвести сброс значения, параметр может быть пустым (""). Указание всех приведенных выше параметров аналогично использованию--ansi. При помощи этого параметра можно включать только необходимые режимы SQL (see Раздел 1.9.2, «Запуск MySQL в режиме ANSI»).--temp-poolПри указании данного параметра для создаваемых временных файлов будет использоваться ограниченный набор имен вместо создания уникального имени для каждого нового файла. Данная функция предназначена для устранения проблемы ядра Linux, возникающей при создании большого количества новых файлов с разными именами. По старой схеме в Linux как бы происходит 'утечка' памяти, так как она распределяется для кэша каталогов вместо дискового кэша.
--transaction-isolation= { READ-UNCOMMITTED | READ-COMMITTED |REPEATABLE-READ | SERIALIZABLE } Задает принятый по умолчанию уровень изоляции транзакции (see Раздел 6.7.3, «Синтаксис команды
SET TRANSACTION»).-t, --tmpdir=pathПуть для временных файлов. Может быть полезен, если принятый по умолчанию каталог
/tmpрасположен на слишком маленьком диске и не может вместить все временные таблицы. Начиная с MySQL 4.1, эта опция поддержает указание нескольких путей, разделенных двоеточием:(на Windows - точкой с запятой;). Эти пути будут использованы в ротации.-u, --user= [user_name | userid]Запуск демона
mysqldот имени пользователяuser_nameилиuserid(число). Этот параметр является обязательным при запускеmysqldв качестве главной программы.Начиная с MySQL 3.23.56 и 4.0.12:
Для того, чтобы избежать возможного пробоя в безопасности когда пользователь добавляет опцию
--user=rootв один из файловmy.cnf,mysqldлишь только будет использовать первую указанную опцию--userи давать предупреждение если указано множество таких опций. Имейте в виду, что/etc/my.cnfиdatadir/my.cnfмогут перекрыть опцию командной строки - таким образом, рекомендовано указывать эту опцию именно в/etc/my.cnf.-V, --versionВывод информации по версии программы и завершение выполнения.
-W, --log-warnings (было --warnings)Задает запись таких предупреждений, как
Aborted connection...в файл.err(see Раздел A.2.9, «Коммуникационные ошибки / Оборванные соединения».
Большая часть значений может быть
изменена в процессе работы сервера
с помощью команды SET. See
Раздел 5.5.6, «Синтаксис команды SET».
4.1.2. Файлы параметров my.cnf
Начиная с версии 3.22 MySQL может считывать принятые по умолчанию параметры запуска для сервера и клиентов из файлов параметров.
В Unix считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
| Имя файла | Назначение |
/etc/my.cnf | Общие параметры |
DATADIR/my.cnf | Параметры для сервера |
defaults-extra-file | Файл, указанный при помощи -defaults-extra-file=# |
~/.my.cnf | Параметры для пользователя |
DATADIR является каталогом
данных MySQL (обычно
/usr/local/mysql/data для
бинарной установки или
/usr/local/var для установки
из исходных текстов). Обратите
внимание, что это тот каталог,
который был задан во время
настройки, а не указанный при
помощи --datadir при запуске
mysqld! (--datadir не
оказывает влияния на просмотр
файлов параметров сервером, так
как их просмотр происходит до
обработки аргументов командной
строки).
В Windows считывание принятых по умолчанию параметров MySQL производится из следующих файлов:
| Имя файла | Назначение |
windows-system-directory\my.ini | Общие параметры |
C:\my.cnf | Общие параметры |
Обратите внимание на то, что в Windows
все пути необходимо указывать при
помощи / вместо
\. Если необходимо
использовать \, то его
нужно указать дважды, так как
\ является знаком
перехода в MySQL.
MySQL пытается прочитать файлы параметров в указанном выше порядке. Если существует несколько таких файлов, то параметр, указанный в файле, идущем позже, имеет преимущество над таким же параметром, указанным в файле, расположенном ранее. Параметры, указанные в командной строке, обладают более высоким приоритетом по отношению к параметрам, указанным в любом из файлов параметров. Некоторые параметры можно задавать при помощи переменных окружения. Параметры, указанные в командной строке или в файлах параметров, обладают преимуществом по отношению к переменным окружения (see Приложение F, Переменные окружения).
Приводим список программ,
поддерживающих файлы параметров:
mysql, mysqladmin,
mysqld, mysqld_safe,
mysql.server, mysqldump,
mysqlimport, mysqlshow,
mysqlcheck, myisamchk и
myisampack.
Любой параметр, который может быть
задан в командной строке при
запуске программы MySQL, может быть
также задан в файле параметров (без
предваряющего двойного слэша).
Чтобы получить список доступных
параметров, следует запустить
программу с параметром
--help.
Файлы параметров могут содержать строки следующего вида:
#commentСтроки комментариев начинаются с символа ‘
#’ или ‘;’. Пустые строки игнорируются.[group]группа представляет собой имя программы или группы, для которой необходимо задать параметры. Любые параметры или строки, задающие значения переменных, которые указаны после строки группы, будут относиться к названной группе, пока не закончится файл параметров или же не будет указана другая строка группы.
optionЭквивалент
--optionв командной строке.option=valueЭквивалент
--option=valueв командной строке.set-variable = variable=valueЭквивалент
--set-variable variable=valueв командной строке. Данный синтаксис необходимо использовать для задания переменныхmysqld. Заметьте,--set-variableне используется с MySQL 4.0. Просто используйте--variable=value.
Группа client обеспечивает
возможность задавать параметры,
относящиеся ко всем клиентам MySQL
(кроме самого mysqld). Эта
группа великолепно подходит для
указания пароля, используемого при
подсоединении к серверу (но при
этом следует убедиться, что
разрешение на чтение и запись
этого файла есть только у вас).
Обратите внимание на то, что для
параметров и значений все
введенные перед ними и после них
пробелы автоматически удаляются. В
строках значений можно
использовать такие экранирующие
секвенции: '\b',
'\t', '\n',
'\r', '\\' и
'\s' ('\s' - это
пробел).
Пример типичного глобального файла параметров:
[client] port=3306 socket=/tmp/mysql.sock [mysqld] port=3306 socket=/tmp/mysql.sock set-variable = key_buffer_size=16M set-variable = max_allowed_packet=1M [mysqldump] quick
Пример типичного файла параметров пользователя:
[client] # Указанный пароль будет направлен всем стандартным клиентам MySQL password=my_password [mysql] no-auto-rehash set-variable = connect_timeout=2 [mysqlhotcopy] interactive-timeout
Если у вас дистрибутив исходного
кода, то примеры конфигурационных
файлов с именами my-xxxx.cnf
можно найти в каталоге
support-files. В случае
бинарного дистрибутива следует
обратиться к каталогу
DIR/support-files, где
DIR - имя каталога
установки MySQL (обычно
/usr/local/mysql). На данный
момент там приведены примеры
файлов конфигурации для малых,
средних, больших и очень больших
систем. Чтобы
поэкспериментировать с файлом,
можно скопировать
my-xxxx.cnf в свой домашний
каталог (переименуйте копию в
.my.cnf).
Все поддерживающие файлы параметров клиенты MySQL принимают следующие параметры:
| Параметр | Описание |
| --no-defaults | Не читать информацию из файлов параметров. |
| --print-defaults | Вывести имя программы и все параметры, которые ей передаются. |
| --defaults-file=full-path-to-default-file | Использовать только указанный файл конфигурации. |
| --defaults-extra-file=full-path-to-default-file | Прочитать этот файл конфигурации после глобального файла конфигурации, но перед файлом конфигурации пользователя. |
Обратите внимание на то, что
указанные выше параметры должны
идти первыми в командной строке!
Однако параметр --print-defaults
может использоваться сразу после
команд --defaults-xxx-file.
Примечание для разработчиков: обработка файла параметров происходит следующим образом: все совпадающие параметры (т.е. параметры в соответствующих группах) обрабатываются перед любыми аргументами командной строки. Этот алгоритм хорошо подходит для программ, которые в случае, если один и тот же параметр указывается несколько раз, используют последний экземпляр параметра. Если же вы работаете со старой программой, которая считывает заданные несколько раз параметры указанным образом, но не читает файлы параметров, необходимо добавить только две строки, чтобы у нее появилась эта возможность. Чтобы увидеть, как это делается, достаточно ознакомиться с исходным кодом любого стандартного клиента MySQL.
В скриптах оболочки для анализа
файлов config можно
использовать команду
my_print_defaults:
shell> my_print_defaults client mysql
--port=3306
--socket=/tmp/mysql.sock
--no-auto-rehash
Приведенные выше выходные данные
содержат все параметры для групп
client и mysql.
4.1.3. Установка нескольких серверов на один компьютер
В некоторых случаях необходимо,
чтобы на одном компьютере работало
несколько различных серверов
mysqld: например, если нужно
запустить для тестирования новую
версию MySQL совместно со старой
версией, которая находится в
работе, или когда разным
пользователям нужно предоставить
доступ к различным серверам
mysqld, с которыми они умеют
обращаться самостоятельно.
Один из способов запустить новый сервер -- указать ему другой канал и порт, например, таким образом:
shell>MYSQL_UNIX_PORT=/tmp/mysqld-new.sockshell>MYSQL_TCP_PORT=3307shell>export MYSQL_UNIX_PORT MYSQL_TCP_PORTshell>scripts/mysql_install_dbshell>bin/safe_mysqld &
Приложение, в котором описаны
переменные окружения, включает
список других переменных
окружения, которые можно
использовать для управления
mysqld (see
Приложение F, Переменные окружения).
В приведенном выше примере представлен грубый быстрый метод, который обычно применяется для тестирования. Преимуществом данного метода является то, что все соединения, которые устанавливаются в указанной выше оболочке, автоматически направляются на новый запущенный сервер!
Если работать с несколькими
серверами необходимо постоянно, то
нужно создать файл параметров для
каждого сервера (see
Раздел 4.1.2, «Файлы параметров my.cnf»). В скрипте
запуска, который выполняется при
каждой загрузке, следует указать
оба сервера:
safe_mysqld
--defaults-file=path-to-option-file
Для серверов должны быть различными по крайней мере следующие параметры:
port=#
socket=path
pid-file=path
Приведенные ниже параметры, если они используются, также должны различаться:
log=path
log-bin=path
log-update=path
log-isam=path
bdb-logdir=path
shared-memory-base-name (Новое в MySQL 4.1)
Если требуется увеличить производительность, необходимо также задать разные значения для следующих параметров:
tmpdir=path
bdb-tmpdir=path
See Раздел 4.1.1, «Параметры командной строки mysqld». Начиная с
MySQL 4.1, в tmpdir могут быть
указаны несколько путей,
разделенных двоеточием :
(точкой с запятой на Windows
;). Эти пути будут
использованы в ротации. Эта
функция может быть использована
для того, чтобы распределить
данные между разными физическими
дисками.
Если производится установка
бинарной версии MySQL (файлы .tar),
которая запускается из
./bin/safe_mysqld, то в
большинстве случаев единственными
параметрами, которые необходимо
добавить/изменить, являются
аргументы socket и
port для safe_mysqld.
See Раздел 4.1.4, «Запуск нескольких серверов MySQL на одном компьютере».
4.1.4. Запуск нескольких серверов MySQL на одном компьютере
Иногда возникают обстоятельства, когда необходимо запустить несколько серверов на одном компьютере. Например, может понадобиться произвести тестирование новой версии MySQL, не изменяя текущей установки программы. Или еще вариант: вы являетесь поставщиком услуг Internet, который хочет предоставить независимые установки MySQL для различных клиентов.
Если необходимо запустить
несколько серверов, то проще всего
скомпилировать серверы с
различными портами TCP/IP и файлами
сокетов (see Раздел 4.7.3, «Mysqld_multi, программа для управления множеством серверов MySQL»).
Предположим, что существующий
сервер настроен на принятые по
умолчанию номер порта и файл
сокета. Настроим новый сервер при
помощи команды configure
следующим образом:
shell>./configure --with-tcp-port=port_number \--with-unix-socket-path=file_name \--prefix=/usr/local/mysql-3.22.9
Здесь port_number и
file_name должны отличаться
от принятого по умолчанию номера
порта и пути файла сокета, а
значение --prefix должно
указывать каталог установки,
который отличается от того, в
котором установлен текущий MySQL.
Проверить сокет, используемый установленным на данный момент сервером MySQL, можно при помощи следующей команды:
shell> mysqladmin -h hostname --port=port_number variables
Обратите внимание: если указать
``localhost'' как имя
удаленного компьютера,
mysqladmin по умолчанию будет
использовать сокеты Unix вместо TCP/IP.
В MySQL 4.1 вы также можете указать
протокол, который надлежит
использовать с помощью опции
--protocol=(TCP | SOCKET | PIPE | MEMORY).
Если на используемом порту находится сервер MySQL, то будет выдан список самых важных настраиваемых переменных в MySQL, включая имя сокета.
Повторно компилировать новый
сервер MySQL нет необходимости, его
просто нужно запустить с другими
параметрами для порта и сокета.
Используемые порт и сокет можно
изменить, указав их как параметры
запуска для safe_mysqld:
shell> /path/to/safe_mysqld --socket=file_name --port=port_number
Модуль mysqld_multi может
также в качестве аргумента
принимать safe_mysqld (или
mysqld) и передавать
параметры из файла конфигурации
для safe_mysqld и дальше для
mysqld.
Если новый сервер запускается на
том же каталоге базы данных, что и
другой сервер с включенной записью
в журналы, необходимо также
указать имена файлов журналов для
safe_mysqld при помощи
параметров --log,
--log-update или
--log-slow-queries. Иначе оба
сервера могут попытаться
осуществить запись в один и тот же
файл журнала.
Предупреждение: обычно нельзя допускать, чтобы два сервера одновременно заносили данные в одну и ту же базу данных! Если ваша операционная система не поддерживает безотказную блокировку доступа, это может привести к возникновению неприятных сюрпризов!
Если для второго сервера
понадобится использовать другой
каталог базы данных, можно
воспользоваться параметром
--datadir=path для
safe_mysqld.
Обратите
внимание: запуск нескольких
серверов MySQL (mysqlds) на
различных компьютерах с доступом к
одному каталогу данных через
сетевую файловую систему обычно не
приводит ни к чему хорошему!
Проблема состоит в том, что сетевая
файловая система становится узким
местом для передачи данных. Она не
предназначена для такого
использования. И даже в этом случае
придется искать решение, которое
позволит обеспечить отсутствие
конфликтов между двумя или более
модулями mysqld. На данный
момент не существует платформы,
которая обеспечивает на 100%
надежную блокировку доступа к
файлам (обычно демон lockd)
во всех возможных ситуациях. Кроме
того, существует еще одна
опасность при использовании
сетевой файловой системы: эта
система может еще больше усложнить
работу программы lockd.
Поэтому лучше смотреть на вещи
проще и забыть об этой идее.
Оптимальным решением будет
использование одного компьютера с
несколькими центральными
процессорами и с операционной
системой, которая эффективно
управляет потоками.
Если нужно подсоединиться к серверу MySQL, который работает с портом, отличным от того, с которым откомпилирован ваш клиент, можно воспользоваться одним из следующих методов:
Запустите клиент с параметрами
--host 'hostname' --port=port_number, чтобы подсоединиться через TCP/IP, или[--host localhost --socket=file_name], чтобы подсоединиться через сокет Unix.Запускайте ваш клиент с
--protocol=tcpдля подключения по TCP/IP и--protocol=socketдля подключения через сокет Unix.В своей программе на языке C или Perl можно задать аргументы порта или сокета при подсоединении к серверу MySQL.
При использовании модуля Perl
DBD::mysqlможно прочитать параметры из файлов параметров MySQL (see Раздел 4.1.2, «Файлы параметровmy.cnf»).$dsn = "DBI:mysql:test;mysql_read_default_group=client; mysql_read_default_file=/usr/local/mysql/data/my.cnf" $dbh = DBI->connect($dsn, $user, $password);
Задайте переменные окружения
MYSQL_UNIX_PORTиMYSQL_TCP_PORT, чтобы указать на сокет Unix и порт TCP/IP до запуска клиентов. Если обычно используются конкретные сокет или порт, команды для задания этих переменных окружения необходимо поместить в свой файл.login(see Приложение F, Переменные окружения).Укажите принятые по умолчанию сокет и порт TCP/IP в файле
.my.cnfв своем домашнем каталоге (see Раздел 4.1.2, «Файлы параметровmy.cnf»).
4.2. Общие проблемы безопасности и система привилегий доступа MySQL
- 4.2.1. Общие принципы обеспечения безопасности
- 4.2.2. Как обезопасить MySQL от хакеров
- 4.2.3. Опции запуска
mysqld, относящиеся к безопасности - 4.2.4. Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
- 4.2.5. Функции, выполняемые системой привилегий
- 4.2.6. Как работает система привилегий
- 4.2.7. Привилегии, предоставляемые MySQL
- 4.2.8. Соединение с сервером MySQL
- 4.2.9. Управление доступом, этап 1: верификация подсоединения
- 4.2.10. Управление доступом, этап 2: верификация запросов
- 4.2.11. Причины появления ошибок
Access denied('в доступе отказано')
MySQL имеет развитую, но нестандартную систему обеспечения безопасности и привилегий доступа. В этом разделе дается описание ее работы.
4.2.1. Общие принципы обеспечения безопасности
С данным разделом должны ознакомиться все, кто использует MySQL на компьютерах, подключенных к Internet, - чтобы избежать наиболее распространенных ошибок, приводящих к нарушению безопасности системы.
При обсуждении вопросов безопасности мы акцентируем внимание на необходимости защиты всего серверного хоста (а не одного лишь сервера MySQL) от всех возможных типов атак: перехвата, внесения изменений, считывания и отказа в обслуживании. Данный раздел не охватывает всех аспектов готовности к работе и отказоустойчивости.
Используемая в MySQL система безопасности для всех подключений, запросов и иных операций, которые может пытаться выполнить пользователь, базируется на списках контроля доступа ACLs (Access Control Lists). Обеспечивается также некоторая поддержка SSL-соединений между клиентами и серверами MySQL. Многие из рассматриваемых здесь концепций не относятся исключительно к MySQL; те же общие соображения применимы практически ко всем приложениям.
При работе в MySQL старайтесь следовать приведенным ниже инструкциям:
Не предоставляйте никому (за исключением пользователя
mysqlпод именемroot) доступа к таблицеuserв базе данныхmysql! Это чрезвычайно важно. В MySQL зашифрованный пароль является реальным паролем. Узнав пароль, занесенный в таблицуuser, и имея доступ к удаленному компьютеру, занесенному в соответствующую учетную запись, войти в систему под именем зарегистрированного владельца пароля легко может кто угодно.Изучите систему прав доступа MySQL. Для управления доступом к MySQL служат команды
GRANTиREVOKE. Предоставляйте ровно столько прав, сколько необходимо, и не больше. Никогда не предоставляйте права всем хостам. Полезно проводить следующие контрольные проверки:Выполните команду
mysql -u root. Если удается успешно установить соединение с сервером без получения запроса пароля, значит, у вас имеются проблемы. Это означает, что кто угодно может подсоединиться к вашему серверу MySQL как клиент MySQL под именемroot, получая таким образом право неограниченного доступа! Проанализируйте инструкцию по инсталляции MySQL, обращая особое внимание на ту часть, которая касается задания пароля пользователяroot.С помощью команды
SHOW GRANTSпроверьте, кто и к каким ресурсам имеет доступ. Воспользуйтесь командойREVOKE, отмените права доступа, которые не являются необходимыми.
Не храните в базе данных незашифрованных паролей. Если злоумышленнику удастся получить доступ на ваш компьютер, то в его руках окажется полный список паролей, которыми он может воспользоваться. Применяйте для шифрования
MD5(),SHA1()или другие односторонние хеш-функции.Не используйте в качестве пароля слова из словарей. Для взлома такого рода паролей имеются специальные программы. Даже слова типа ``xfish98'' - это очень плохие пароли. Куда лучше ``duag98'': здесь используется то же слово ``fish'', но при этом буквы в нем заменены ближайшими к ним слева буквами клавиатуры QWERTY. Еще один метод - составить парольное слово из первых букв слов какого либо словосочетания, например ``Mhall'' - по фразе ``Mary had a little lamb.'' Такой пароль легко запоминается и его легко вводить. А вот разгадать его тому, кто не знает ключевой фразы, будет непросто.
Приобретите брандмауэр. Эта мера обеспечит защиту как минимум от половины всех видов несанкционированного использования любого ПО, с которым вы работаете. Разместите MySQL за брандмауэром или в демилитаризованной зоне (demilitarised zone - DMZ). Полезно проводить следующие контрольные проверки:
Попробуйте просканировать ваши порты из Internet с помощью утилиты типа
nmap. MySQL использует по умолчанию порт 3306. Этот порт должен быть недоступен с неблагонадежных компьютеров. Еще один простой способ проверить, открыт или нет ваш MySQL-порт, - попытаться выполнить с какой либо удаленной машины следующую команду, гдеserver_host- имя хоста, на котором установлен ваш сервер MySQL:shell>
telnet server_host 3306Если соединение будет установлено, и вы получите какие-либо бессмысленные символы, это будет означать, что порт открыт, и его нужно закрыть на брандмауэре или маршрутизаторе (если, конечно, нет действительно веских причин держать его открытым). Если же
telnetпросто зависнет или в подсоединении будет отказано, тогда все в порядке: порт заблокирован.Не доверяйте никаким данным, которые вводят пользователи. Возможны попытки перехитрить вашу программу путем ввода последовательностей специальных или экранированных символов в веб-формы, URL-ы или любое приложение, созданное вами. Убедитесь, что защита вашего приложения не будет нарушена, если пользователь введет что-нибудь типа "
'; DROP DATABASE mysql;''. Это крайний случай, но действия хакеров, использующих подобную технологию, могут привести к потере информации и появлению брешей в системе безопасности, если вы не готовы к ним. Не следует также забывать о необходимости проверки цифровых данных (распространенной ошибкой является защита только строк). Некоторые полагают, что если в базе данных хранятся только открытые данные, то в ее защите нет необходимости. Это неверно. Такие базы могут стать объектом успешных атак типа отказа от обслуживания. Простейший способ защиты от взломов такого типа - заключать числовые константы в кавычки:SELECT * FROM table WHERE ID='234', а неSELECT * FROM table WHERE ID=234. MySQL автоматически преобразует эту строку в число и выбросит из нее все нецифровые символы. Полезно проводить следующие контрольные проверки:Для всех веб-приложений:
Попробуйте ввести во все ваши веб-формы одинарные и двойные кавычки - ‘
'’ и ‘"’. Если MySQL выдаст любое сообщение об ошибке, немедленно разберитесь, в чем дело.Попробуйте видоизменять динамические URL, добавляя в них
%22(‘"’),%23(‘#’), и%27(‘'’).Попробуйте модифицировать типы данных в динамических URL - замените числовые на символьные, используя символы из предыдущих примеров. Ваше приложение должно быть устойчиво к подобного рода атакам.
Попробуйте вводить в числовые поля вместо цифр буквы, пробелы и специальные символы. Ваше приложение должно либо удалять их до передачи в MySQL, либо выдавать сообщение об ошибке. Пропускать в MySQL значения без проверки очень опасно!
Проверяйте размер данных перед тем, как они будут переданы в MySQL.
При подключении приложения к базе данных лучше использовать имя пользователя, отличное от того, которое вы используете для целей администрирования. Не предоставляйте своим приложениям больше прав доступа, чем это необходимо.
Пользователям PHP:
Проверьте функцию
addslashes(). Что касается PHP 4.0.3, то в нем имеется функцияmysql_escape_string(), базирующаяся на функции с тем же именем из MySQL C API.
Пользователям MySQL C API:
Проверьте API-вызов
mysql_real_escape_string().
Пользователям MySQL++:
Проверьте такие модификаторы, как
escapeиquote, - для потоков запросов.
Пользователям Perl DBI:
Проверьте метод
quote()или используйте для проверки заполнители.
Пользователям Java JDBC:
Используйте для проверки объект
PreparedStatementи символы-заполнители.
Не передавайте по Internet открытые (незашифрованные) данные. Они могут оказаться у кого угодно, имеющего достаточно времени и возможностей для того, чтобы перехватить их и использовать в своих целях. Используйте вместо этого протоколы с шифрованием данных, такие как SSL и SSH. MySQL, начиная с версии 4.0.0, поддерживает собственные SSL-соединения. Пересылка по SSH (SSH Port Forwarding) может быть использована для создания туннеля передачи данных с шифрованием и сжатием.
Научитесь пользоваться утилитами
tcpdumpиstrings. В большинстве случаев проверить, являются ли потоки данных MySQL зашифрованными, можно с помощью команды, подобной той, которая приведена ниже:shell>
tcpdump -l -i eth0 -w - src or dst port 3306 | strings(Она работает под Linux, и будет, с незначительными изменениями, работать под другими системами.) Предупреждение: если вы не видите данных, это еще не гарантирует того, что они зашифрованы. Если требуется высокий уровень безопасности, обратитесь к экспертам в этой области.
4.2.2. Как обезопасить MySQL от хакеров
При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.
Вся остальная информация
передается в текстовом виде и
может быть прочитана кем угодно,
кто в состоянии отлеживать
подключение. Если это вас
беспокоит, можно воспользоваться
протоколом со сжатием данных (в MySQL
3.22 и последующих версиях), что
значительно затруднит подобные
действия. Чтобы еще более повысить
безопасность связи, следует
использовать протокол
ssh. Open
source-клиент ssh
доступен на веб-сайте
http://www.openssh.org/,
а коммерческий ssh-клиент
можно получить на веб-сайте
http://www.ssh.com/. С
помощью такого протокола можно
обеспечить зашифрованную связь по
протоколу TCP/IP между сервером MySQL и
клиентом MySQL.
Если вы используете MySQL 4.0, то можете также использовать предусмотренную в этой версии поддержку протокола OpenSSL. Обратитесь к разделу See Раздел 4.3.9, «Использование безопасных соединений».
Для обеспечения безопасности MySQL-системы необходимо строго придерживаться следующих рекомендаций:
У всех пользователей MySQL должны быть пароли. Для приложений клиент/сервер является общепринятым, что клиент может указывать любое имя пользователя, но если для
other_userне задан пароль, то кто угодно может зайти под любым именем, просто введяmysql -u other_user db_name. Чтобы этого избежать, можно изменить пароль для всех пользователей, отредактировав скриптmysql_install_dbперед запуском приложения, или только пароль дляroot-пользователя MySQL, как это показано ниже:shell>
mysql -u root mysqlmysql>UPDATE user SET Password=PASSWORD('new_password')WHERE user='root'; mysql>FLUSH PRIVILEGES;Не запускайте демон MySQL от имени пользователя Unix
root. Это очень опасно, потому что любой пользователь, имеющий привилегиюFILE, будет в состоянии создавать файлы как пользовательroot(например~root/.bashrc). Чтобы предотвратить это,mysqldоткажется запускаться от имени пользователяroot, если это не будет задано напрямую с помощью опции--user=root. В то же времяmysqldможет быть запущена от имени обычного непривилегированного пользователя. Можно также, в целях еще большего укрепления безопасности, создать новый аккаунт Unix-пользователяmysql. При запускеmysqldот имени другого пользователя Unix у вас отпадает необходимость заменять имя пользователяrootв таблицеuser, так как имена пользователя в MySQL не имеют ничего общего с аккаунтами пользователей Unix. Для запускаmysqldот имени другого пользователя Unix добавьте в группу[mysqld]файла опций/etc/my.cnfили файла опцийmy.cnf, находящегося в каталоге данных сервера, строкуuser, задающую имя пользователя. Например:[mysqld] user=mysql
В результате сервер будет запущен от имени назначенного пользователя, независимо от того, производится запуск вручную или посредством
safe_mysqldилиmysql.server. Для получения дополнительной информации обратитесь к разделу See Раздел A.3.2, «Запуск MySQL от обычного пользователя».Откажитесь от поддержки символических ссылок на таблицы (ее можно запретить с помощью опции
--skip-symlink). Это особенно важно в том случае, если вы запускаетеmysqldот имени пользователяroot, поскольку у того, кто имеет право доступа для записи в каталоги данныхmysqld, появляется возможность стереть любой файл в системе! Обратитесь к разделу See Раздел 5.6.1.2, «Использование символических ссылок для таблиц».Удостоверьтесь, что пользователь Unix, от имени которого запускается mysqld, является единственным пользователем, имеющим привилегии чтения/записи в директории базы данных.
Не предоставляйте привилегии
PROCESSвсем пользователям. Командаmysqladmin processlistвыводит текст запросов, обрабатываемых в данный момент. Следовательно, любой пользователь, имеющий право на выполнение этой команды, получает возможность прочитать, например, такой запрос другого пользователя, какUPDATEuserSET password=PASSWORD('not_secure').mysqldрезервирует добавочное подключение для пользователей, имеющих привилегиюPROCESS, так что пользователь MySQL под именемrootможет подключиться и осуществлять контроль даже в том случае, когда все обычные подключения заняты.Не предоставляйте привилегии
FILEвсем пользователям. Любой пользователь, имеющий такую привилегию, может записать в любом месте файловой системы файл с привилегиями демонаmysqld! Чтобы обеспечить здесь хоть минимальную защиту, все файлы создаваемые с помощью командыSELECT ... INTO OUTFILE, сделаны общедоступными для записи, но перезаписать существующие файлы нельзя.Привилегия
FILEможет быть также использована для чтения любого файла, доступного пользователю Unix, от имени которого запускается сервер.Можно также прочитать любой файл в текущую базу данных. Это может быть использовано в корыстных целях. Возможно, например, с помощью команды
LOAD DATAзагрузить/etc/passwdв таблицу и прочесть ее позже с помощьюSELECT.Если вы не доверяете своему DNS-серверу, используйте в таблицах привилегий вместо имен хостов IP-адреса. В любом случае следует очень осторожно относиться к внесению в таблицы привилегий записей, в которых значения имени хоста содержат шаблонные символы!
Чтобы ограничить число подключений, доступных для отдельного пользователя, можно в
mysqldзадать значение переменнойmax_user_connections.
4.2.3. Опции запуска mysqld, относящиеся к безопасности
К безопасности имеют отношение
следующие опции mysqld:
--local-infile[=(0|1)]При установке опции
--local-infile=0теряется возможность выполнять командуLOAD DATA LOCAL INFILE.--safe-show-databaseЕсли установлена эта опция, команда
SHOW DATABASESвозвращает только те базы данных, для которых пользователь имеет какую-либо привилегию. Начиная с версии 4.0.2 эта опция отменена и не служит ни для чего (она включена по умолчанию), т.к. сейчас у нас имеется привилегияSHOW DATABASES. Обратитесь к разделу See Раздел 4.3.1, «Синтаксис командGRANTиREVOKE».--safe-user-createПри установке этой опции пользователь не может создавать новых пользователей с помощью команды
GRANT, если у него отсутствует привилегияINSERTдля таблицыmysql.user. Чтобы предоставить пользователю доступ именно для создания новых пользователей с теми привилегиями, которые он имеет право предоставлять, для этого пользователя следует установить следующую привилегию:mysql>
GRANT INSERT(user) ON mysql.user TO 'user'@'hostname';Задание такой привилегии гарантирует, что этот пользователь не сможет непосредственно вносить изменения ни в одном из столбцов привилегий, а для предоставления привилегий другим пользователям должен будет использовать команду
GRANT.--skip-grant-tablesУстановка этой опции запрещает серверу вообще использовать систему привилегий. Это открывает кому бы то ни было полный доступ ко всем базам данных! (После запуска сервера можно заставить его снова использовать таблицы привилегий с помощью команды mysqladmin
flush-privilegesилиmysqladmin reload.)--skip-name-resolveПри установке данной опции имена хостов не разрешены. Все значения в столбцах
Hostтаблиц привилегий должны быть либо IP-адресами, либоlocalhost.--skip-networkingНе разрешает осуществлять подсоединений по протоколу TCP/IP через сеть (данная опция запрещает такие подсоединения). Все подсоединения к
mysqldдолжны осуществляться посредством сокетов Unix. Для MySQL старше 3.23.27 эта опция непригодна для систем, в которых используются MIT-потоки, так как MIT-потоки на тот момент не поддерживали сокеты Unix.--skip-show-databaseРазрешает выполнение команды
SHOW DATABASESтолько в том случае, если пользователь имеет привилегиюSHOW DATABASES. Начиная с версии 4.0.2 в этой опции больше нет необходимости, т.к. теперь доступ может предоставляться избирательно с помощью привилегииSHOW DATABASES.
4.2.4. Вопросы безопасности, относящиеся к команде LOAD DATA LOCAL
Чтобы решить проблемы
безопасности, которые могут
возникнуть при использовании
команды LOAD DATA LOCAL,в MySQL
3.23.49 и MySQL 4.0.2 были добавлены новые
опции.
При поддержке этой команды могут возникнуть две проблемы:
Первая: поскольку чтение файла инициируется сервером, теоретически имеется возможность создать ``доработанный'' при помощи патча сервер MySQL, способный читать любые файлы на клиентской машине, к которой текущий пользователь имеет доступ для чтения, в то время, когда клиент направляет запрос к таблице.
Вторая: в веб-среде, в которой
подсоединение клиентов
осуществляется с веб-сервера,
пользователь может использовать
команду LOAD DATA LOCAL для
чтения любых файлов, к которым
процесс веб-сервера имеет доступ
для чтения (если предположить, что
пользователь может выполнять на
сервере SQL любые команды).
Эти проблемы решаются с помощью двух следующих исправлений:
Если вы конфигурируете MySQL без
опции --enable-local-infile, то
команда LOAD DATA LOCAL будет
запрещена для всех клиентов, если,
конечно, они не будут вызывать
mysql_options (... MYSQL_OPT_LOCAL_INFILE,
0). Обратитесь к разделу See
Раздел 8.4.3.39, «mysql_options()».
В случае клиента mysql, LOAD DATA
LOCAL может быть разблокирована
заданием опции --local-infile[=1]
или заблокирована с помощью опции
--local-infile=0.
По умолчанию все MySQL-клиенты и
библиотеки компилируются с опцией
--enable-local-infile для
обеспечения совместимости с MySQL
3.23.48 и более старыми версиями.
Блокировку всех команд LOAD DATA
LOCAL на MySQL-сервере можно
осуществить путем запуска
mysqld с опцией
--local-infile=0.
В случае, если команда LOAD DATA
LOCAL INFILE заблокирована на
сервере или клиенте, вы получите
следующее сообщение об ошибке (1148):
The used command is not allowed with this MySQL version
4.2.5. Функции, выполняемые системой привилегий
Основной функцией системы
привилегий MySQL является
аутентификация пользователя,
подключающегося с указанного
хоста, и ассоциирование его с
привилегиями базы данных, такими
как SELECT, INSERT,
UPDATE и DELETE.
К дополнительным функциональным
возможностям системы привилегий
относятся следующие: возможность
обслуживания анонимного
пользователя и предоставление
привилегий для таких
специфических для MySQL функций, как
LOAD DATA INFILE и функции
администрирования.
4.2.6. Как работает система привилегий
Система привилегий MySQL обеспечивает пользователям возможность выполнять только те действия, которые им разрешены в соответствии с их обязанностями. Когда вы подсоединяетесь к серверу MySQL, ваша личность устанавливается по имени хоста, с которого вы подсоединяетесь, и имени пользователя, которое вы указываете. Система предоставляет привилегии в соответствии с вашей личностью и тем, что вы хотите делать.
MySQL идентифицирует пользователя
как по имени хоста, так и по имени
пользователя, т.к. нет оснований
полагать что данное имя
пользователя принадлежит во всей
Сети единственному человеку.
Например, пользователь
joe, устанавливающий
соединение с office.com,
вовсе не обязательно один и тот же
человек, что и пользователь
joe, подсоединяющийся с
elsewhere.com. MySQL решает эту
проблему, обеспечивая возможность
различать пользователей,
подсоединяющихся с различных
хостов под одним и тем же именем
пользователя: вы можете
предоставлять joe один
набор привилегий, если он
подсоединяется с office.com,
и другой набор привилегий, если
joe подсоединяется с
elsewhere.com.
Управление доступом в MySQL осуществляется в два этапа:
Этап 1: сервер проверяет, имеется ли у вас вообще разрешение на подсоединение.
2item Этап 2: если таковое имеется, сервер проверяет каждый из ваших запросов, чтобы убедиться в том, что у вас имеется достаточно привилегий для его выполнения. Например, если вы пытаетесь выбрать строки в таблице базы данных или удалить таблицу из базы данных, сервер в первом случае проверяет, имеется ли у вас для этой таблицы привилегия
SELECT, а во втором - имеется ли у вас для этой базы данных привилегияDROP.
На обеих стадиях управления
доступом сервер использует
таблицы user, db и
host из базы данных
mysql. Ниже перечислены
поля этих таблиц привилегий:
| Имя таблицы | user | db | host |
| Поля контекста | Host | Host | Host |
User | Db | Db | |
Password | User | ||
| Поля привилегий | Select_priv | Select_priv | Select_priv |
Insert_priv | Insert_priv | Insert_priv | |
Update_priv | Update_priv | Update_priv | |
Delete_priv | Delete_priv | Delete_priv | |
Index_priv | Index_priv | Index_priv | |
Alter_priv | Alter_priv | Alter_priv | |
Create_priv | Create_priv | Create_priv | |
Drop_priv | Drop_priv | Drop_priv | |
Grant_priv | Grant_priv | Grant_priv | |
References_priv | |||
Reload_priv | |||
Shutdown_priv | |||
Process_priv | |||
File_priv |
На втором этапе управления
доступом (верификация запросов)
сервер может (в случае, если запрос
относится к таблицам базы данных)
дополнительно обратиться к
таблицам tables_priv и
columns_priv. Поля этих таблиц
привилегий перечислены ниже:
| Имя таблицы | tables_priv | columns_priv |
| Поля контекста | Host | Host |
Db | Db | |
User | User | |
Table_name | Table_name | |
Column_name | ||
| Поля привилегий | Table_priv | Column_priv |
Column_priv | ||
| Иные поля | Timestamp | Timestamp |
Grantor |
Каждая таблица привилегий включает в себя поля контекста и поля привилегий.
Поля контекста определяют область
действия каждой из записей в
таблицах, т.е. контекст, к которому
имеет отношение та или иная запись.
Например, запись в таблице
user, в полях Host
и User которой указаны
значения 'thomas.loc.gov'
'bob', предназначена для
аутентификации подсоединений к
серверу с хоста thomas.loc.gov
под именем пользователя
bob. Аналогично запись в
таблице db, в полях
Host, User и
Db которой указаны
значения 'thomas.loc.gov',
'bob' и 'reports',
будет использоваться при попытке
пользователя по именем
bob подсоединиться с
хоста thomas.loc.gov и получить
доступ к базе данных
reports. В полях контекста в
таблицах tables_priv и
columns_priv указаны таблицы
или комбинации таблиц/столбцов, к
которым применяется каждая запись.
При контроле доступа сравнение
значений в полях Host
осуществляется без учета регистра.
Значения в полях User,
Password, Db и
Table_name также являются
независимыми от регистра символов.
Значения в поле Column_name
являются независимыми от регистра
символов, начиная с MySQL 3.22.12.
В полях привилегий указываются привилегии, предоставляемые записью в таблице, т.е. то, какие операции разрешено выполнять. Сервер формирует полное описание привилегий пользователя, комбинируя информацию, хранящуюся в разных таблицах привилегий. Это осуществляется по правилам, которые описаны в разделе See Раздел 4.2.10, «Управление доступом, этап 2: верификация запросов».
Поля контекста - это строковые значения, объявленные, как показано ниже; устанавливаемым по умолчанию значением для каждого из них является пустая строка:
| Имя поля | Тип | Примечания |
Host | CHAR(60) | |
User | CHAR(16) | |
Password | CHAR(16) | |
Db | CHAR(64) | (CHAR(60) для таблиц
tables_priv и
columns_priv tables) |
Table_name | CHAR(60) | |
Column_name | CHAR(60) |
В таблицах user,
db и host все поля
привилегий имеют объявленный тип
ENUM('N','Y'), т.е. возможно
одно из двух значений - 'N'
и 'Y', а устанавливаемым
по умолчанию является 'N'.
В таблицах tables_priv and
columns_priv поля привилегий
объявляются как SET:
| Имя таблицы | Имя поля | Допустимые элементы набора |
tables_priv | Table_priv | 'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop',
'Grant', 'References', 'Index', 'Alter' |
tables_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
columns_priv | Column_priv | 'Select', 'Insert', 'Update', 'References' |
Если кратко, то сервер использует таблицы привилегий следующим образом:
Поля контекста таблицы
userопределяют, разрешить входящее подсоединение или отказать в нем. Для разрешенных подсоединений любые привилегии, предоставленные в таблицеuser, означают глобальные привилегии пользователя (привилегии суперпользователя). Эти привилегии распространяются на все базы данных, размещенные на сервере.Таблицы
dbиhostиспользуются совместно:Поля контекста таблицы
dbопределяют, каким пользователям, при подсоединении с каких хостов разрешен доступ к каким базам данных. Поля привилегий определяют разрешенные операции.Таблица
hostиспользуется в качестве расширения таблицыdbв случае, если необходимо применить некоторую запись из таблицы db к разным хостам. Например, если вы хотите предоставить пользователю возможность обращаться к базе данных с различных хостов сети, оставьте пустым поле в записи этого пользователя в таблицеdb, а затем внесите в таблицуhostзапись для каждого из этих хостов. Более подробно данный механизм описан в разделе See Раздел 4.2.10, «Управление доступом, этап 2: верификация запросов».
Таблицы
tables_privиcolumns_privподобны таблицеdb, но областью их действия является уже уровень таблиц и столбцов, а не баз данных.
Заметим, что привилегии
администрирования (RELOAD,
SHUTDOWN и т.д..) задаются
только в таблице user. Это
связано с тем, что операции
администрирования являются
операциями над самим сервером, а не
над базами данных, поэтому не
смысла перечислять такие
привилегии в других таблицах
привилегий. Фактически для того,
чтобы выяснить, имеете ли вы
привилегии выполнять операции
администрирования, достаточно
обратиться только к таблице
user.
Привилегия FILE также
задается только в таблице
user. Она не является
привилегией администрирования как
таковой, но возможность
производить чтение или запись
файлов на серверном хосте не
связана с базой данных, к которой
вы получаете доступ.
Сервер mysqld считывает
содержимое таблиц привилегий
единожды, при его запуске. О том,
каким образом изменения, вносимые
в таблицы привилегий, вступают в
силу, рассказывается в разделе See
Раздел 4.3.3, «Когда изменения в привилегиях вступают в силу».
При внесении изменений в таблицы
привилегий стоит убедиться в том,
что ваши изменения задают
привилегии именно так, как
задумано вами. Помощь по
диагностике проблем вы найдете в
разделе See Раздел 4.2.11, «Причины появления ошибок Access denied ('в доступе отказано')». По
вопросам, связанным с
безопасностью, следует обращаться
к разделу See Раздел 4.2.2, «Как обезопасить MySQL от хакеров».
Полезным диагностическим
инструментом является скрипт
mysqlaccess, которым Ив Карлье
(Yves Carlier) укомплектовал дистрибутив
MySQL. Запустите mysqlaccess с
опцией --help чтобы
посмотреть, как он работает.
Заметим, что mysqlaccess
контролирует доступ, используя
только таблицы user,
db и host. Он не
проверяет привилегии на уровне
таблиц или столбцов.
4.2.7. Привилегии, предоставляемые MySQL
Информация о привилегиях
пользователя хранится в таблицах
user, db,
host, tables_priv и
columns_priv базы данных
mysql (т.е. в базе данных с
именем mysql). Сервер MySQL считывает
содержимое этих таблиц во время
запуска, и в случаях, указанных в
разделе See Раздел 4.3.3, «Когда изменения в привилегиях вступают в силу».
Ниже приведены имена, используемые в данном руководстве для ссылок на привилегии, предоставляемые в MySQL 4.0.2. Здесь же указаны имена табличных столбцов, ассоциированных с каждой из привилегий в таблицах привилегий, наряду с контекстом, в котором эти привилегии имеют силу:
| Привилегия | Столбец | Контекст |
ALTER | Alter_priv | таблицы |
DELETE | Delete_priv | таблицы |
INDEX | Index_priv | таблицы |
INSERT | Insert_priv | таблицы |
SELECT | Select_priv | таблицы |
UPDATE | Update_priv | таблицы |
CREATE | Create_priv | базы данных, таблицы или индексы |
DROP | Drop_priv | базы данных или таблицы |
GRANT | Grant_priv | базы данных или таблицы |
REFERENCES | References_priv | базы данных или таблицы |
CREATE TEMPORARY TABLES | Create_tmp_table_priv | администрирование сервера |
EXECUTE | Execute_priv | администрирование сервера |
FILE | File_priv | доступ к файлам на сервере |
LOCK TABLES | Lock_tables_priv | администрирование сервера |
PROCESS | Process_priv | администрирование сервера |
RELOAD | Reload_priv | администрирование сервера |
REPLICATION CLIENT | Repl_client_priv | администрирование сервера |
REPLICATION SLAVE | Repl_slave_priv | администрирование сервера |
SHOW DATABASES | Show_db_priv | администрирование сервера |
SHUTDOWN | Shutdown_priv | администрирование сервера |
SUPER | Super_priv | администрирование сервера |
Привилегии SELECT,
INSERT, UPDATE и
DELETE позволяют выполнять
операции над строками таблиц баз
данных.
Для операторов SELECT
привилегия SELECT
требуется только в том случае, если
они действительно извлекают
строки из таблицы.. В ряде случае
можно выполнять операторы
SELECT, даже не имея
разрешения на доступ ни к одной
базе данных на сервере. Например:
клиент mysql вы можете
использовать в качестве обычного
калькулятора:
mysql>SELECT 1+1;mysql>SELECT PI()*2;
Привилегия INDEX позволяет
создавать или уничтожать (удалять)
индексы.
Привилегия ALTER позволяет
использовать команду ALTER
TABLE.
Привилегии CREATE и
DROP позволяют создавать
новые базы данных и таблицы или
уничтожать (удалять) существующие
базы данных и таблицы.
Заметим, что в случае, если
пользователю предоставляется
привилегия DROP по
отношению к базе данных
mysql, он может уничтожить
базу данных, в которой хранятся
привилегии доступа в MySQL!
Привилегия GRANT позволяет
вам предоставлять другим
пользователям привилегии,
которыми обладаете вы сами.
Привилегия FILE дает вам
право читать и записывать файлы на
сервере с помощью операторов
LOAD DATA INFILE и SELECT ... INTO
OUTFILE. Любой пользователь,
которому предоставлена такая
привилегия, имеет право прочитать
или записать любой файл, который
может прочитать или записать
сервер MySQL. Пользователь также
может прочитать любой файл в
каталоге текущей базы данных.
Однако существующие файлы
перезаписывать нельзя.
Остальные привилегии используются
для операций администрирования,
выполняемых с помощью программы
mysqladmin. В таблице,
приведенной ниже, для каждой из
привилегий администрирования
показано, какие команды
mysqladmin она позволяет
выполнять.
| Привилегия | Команды, разрешенные обладателю привилегии |
RELOAD | reload, refresh,
flush-privileges,
flush-hosts,
flush-logs, and
flush-tables |
SHUTDOWN | shutdown |
PROCESS | processlist |
SUPER | kill |
Команда reload заставляет
сервер перечитать таблицы
привилегий. Команда refresh
очищает все таблицы, а также
открывает и закрывает файлы
журналов. flush-privileges
является синонимом reload.
Остальные команды flush-*
выполняют функции, аналогичные
функциям команды refresh, но
с более узкой областью действия. В
некоторых случаях такие команды
могут оказаться более
предпочтительными. Например, если
вы хотите очистить только
системные журналы, команда
flush-logs лучше, чем
refresh.
Команда shutdown завершает
работу сервера.
Команда processlist выводит
информацию о задачах,
выполняющихся на сервере. Команда
kill уничтожает серверные
потоки. Собственные потоки всегда
можно просмотреть или уничтожить,
но для отображения потоков,
запущенных другими
пользователями, нужна привилегия
PROCESS,а для уничтожения
потоков, запущенных другими
пользователями, потребуется
привилегия SUPER.
Обратитесь к разделу See
Раздел 4.5.5, «Синтаксис команды KILL».
В общем случае идея предоставлять привилегии только тем пользователям, которым они необходимы, хорошая, но к предоставлению некоторых из них следует относиться особенно внимательно:
Привилегия
GRANTпозволяет пользователям передавать свои привилегии другим пользователям. Два пользователя с неодинаковыми привилегиями, имея привилегиюGRANT, способны объединить свои привилегии.Привилегия
ALTERможет быть использована для переименования таблиц и разрушения таким образом всей системы привилегий.Привилегия
FILEможет использоваться злонамеренно для считывания любого доступного файла, хранящегося на сервере, или любого файла в каталоге текущей базы данных в таблицу, к содержимому которой можно затем получить доступ с помощью командыSELECT.Привилегия
SHUTDOWNможет использоваться злонамеренно для полного прекращения работы сервера и, таким образом, полного запрещения обслуживания других пользователей.Привилегия
PROCESSможет быть использована для просмотра открытого текста запросов выполняющихся в данный момент, включая запросы на установку или изменение паролей.Привилегии доступа к базе данных
mysqlмогут быть использованы для изменения паролей и другой информации, относящейся к привилегиям доступа. (Пароли хранятся в зашифрованном виде, поэтому злоумышленник не сможет просто прочесть их, чтобы получить пароли в виде обычного текста). Получив доступ к столбцу паролейmysql.user, любой пользователь может войти на сервер MySQL под именем другого пользователя (имея достаточные привилегии, тот же самый пользователь может заменить пароль на другой).
Есть вещи, которые система привилегий MySQL делать не может:
Нельзя явно указать, что данному пользователю должен быть закрыт доступ. Т.е. вы не можете явно выбрать пользователя и затем отказать ему в подключении.
Нельзя указать, что некий пользователь имеет привилегии создавать или удалять таблицы в базе данных, но не имеет привилегий создавать или удалять саму базу данных.
4.2.8. Соединение с сервером MySQL
Обычно для получения доступа к
серверу MySQL необходимо сообщить
клиентской программе параметры
подсоединения: указать хост, с
которым вы хотите соединиться,
ваши имя пользователя и пароль.
Например, клиент mysql
можно запустить следующим образом
(необязательные аргументы
заключены в квадратные скобки
‘[’ и
‘]’):
shell> mysql [-h host_name] [-u user_name] [-pyour_pass]
Альтернативной формой опций
-h, -u, и
-p являются
--host=host_name,
--user=user_name и
--password=your_pass. Заметим, что
между -p или
--password= и следующим за ними
паролем пробела нет.
Внимание:
Указывать пароль в командной
строке небезопасно! Любой
пользователь в вашей системе может
впоследствии отыскать ваш пароль,
введя команду типа ps auxww.
Обратитесь к разделу See
Раздел 4.1.2, «Файлы параметров my.cnf».
В mysql используются
следующие значения по умолчанию
для параметров подсоединения,
пропущенных в командной строке:
Значением по умолчанию для имени хоста является
localhost.Значением по умолчанию для имени пользователя является ваш Unix-аккаунт.
При отсутствии префикса
-pникакого пароля не указывается.
Таким образом, для Unix-пользователя
joe следующие команды
являются эквивалентными:
shell>mysql -h localhost -u joeshell>mysql -h localhostshell>mysql -u joeshell>mysql
Другие клиенты MySQL ведут себя подобным же образом.
В Unix-системах можно задавать различные значения по умолчанию, которые будут использоваться при соединении с сервером, чтобы избавиться от необходимости каждый раз при вызове клиентской программы вводить их в командной строке. Это можно сделать двумя способами:
Параметры подсоединения можно задать в разделе
[client]файла конфигурацииmy.cnf, который находится в вашей домашней директории. Соответствующий раздел этого файла может иметь следующий вид:[client] host=host_name user=user_name password=your_pass
Обратитесь к разделу See Раздел 4.1.2, «Файлы параметров
my.cnf».