- 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 Хранение паролей в безопасности
- Introduction
- Prerequisites
- Creating a New User
- Granting a User Permissions
- Privilege Restrictions on DigitalOcean’s MySQL Managed Databases
- Granting Privileges
- Revoking Privileges
- Viewing Privileges
- Introduction
- Step 1 — Installing MySQL
- Step 2 — Configuring MySQL
- Step 3 — Creating a Dedicated MySQL User and Granting Privileges
- Step 4 — Testing MySQL
- Conclusion
- 4.3.5 Добавление новых пользователей в MySQL
- 4.3.1 Синтаксис команд GRANT и REVOKE
- 1. Как создать пользователя MySQL
- 2. Права пользователя MySQL
- 3. Удаление прав пользователя MySQL
- 4. Создание суперпользователя MySQL
- Выводы
- Введение
- Зачем нужны пользователи
- Пользователи MySQL
- Имя пользователя MySQL
- Просмотр всех пользователей
- Создание нового пользователя MySQL
- FLUSH PRIVILEGES
- Удаление пользователя MySQL
- Создание дополнительного суперпользователя
- Отзыв полномочий у пользователя
- Смена пароля
- Предоставление доступа пользователю MySQL
- Наследование привилегий
- Доступ к таблице
- Доступ к столбцу
- Просмотр привилегий пользователей MySQL
- Проверка текущих полномочий пользователя
- Проверка полномочий к данным
- Просмотр привилегий через системную БД mysql
- Просмотр глобальных привилегий
- Заключение
3 Управление пользователями в MySQL
4.3.1 Синтаксис GRANT
и REVOKE
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name|*|*.*|db_name.*} TO user_name [IDENTIFIED BY 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE {SSL|X509} [ISSUER issuer] [SUBJECT subject]] [WITH GRANT OPTION] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name|*|*.*|db_name.*} FROM user_name [, user_name ...]
GRANT
реализован в MySQL Version 3.22.11 или позже. Для более
ранних версий MySQL инструкция GRANT
не делает ничего.
Команды GRANT
и REVOKE
позволяют администраторам
системы создавать пользователей, предоставлять и отменять права на
MySQL-пользователей в четырех уровнях привилегий:
- Глобальный уровень (Global level)
- Глобальные привилегии обращаются ко всем базам данных на данном сервере.
Эти привилегии сохранены в таблицеmysql.user
. - Уровень баз данных (Database level)
- Привилегии баз данных обращаются ко всем таблицам в данной базе данных.
Эти привилегии сохранены в таблицахmysql.db
и
mysql.host
. - Уровень таблиц (Table level)
- Привилегии таблиц обращаются ко всем столбцам в данной таблице. Эти
привилегии сохранены в таблицеmysql.tables_priv
. - Уровень столбцов (Column level)
- Привилегии столбцов обращаются к одиночным столбцам в данной таблице. Эти
привилегии сохранены в таблицеmysql.columns_priv
.
Если Вы даете привилегии пользователю, который не существует, он будет
автоматически создан. За примерами по работе GRANT
обратитесь к
разделу «4.3.5 Добавление новых
пользователей к MySQL«.
Для инструкций GRANT
и REVOKE
аргумент
priv_type
может быть определен как любой из следующего списка:
ALL PRIVILEGES FILE RELOAD ALTER INDEX SELECT CREATE INSERT SHUTDOWN DELETE PROCESS UPDATE DROP REFERENCES USAGE
ALL
представляет собой синоним для
ALL PRIVILEGES
. REFERENCES
пока не реализовано.
USAGE
в настоящее время представляет собой синоним для
«no privileges». Это может быть применено, когда Вы хотите создать
пользователя, который не имеет никаких привилегий.
Чтобы отменять привилегию предоставленную командой grant,
используйте значение priv_type
параметра GRANT
:
OPTION
REVOKE GRANT OPTION ON ... FROM ...;
Значения priv_type
, которые Вы можете определять для таблицы:
SELECT
, INSERT
, UPDATE
,
DELETE
, CREATE
, DROP
,
GRANT
, INDEX
и ALTER
.
Значения priv_type
, которые Вы можете определять для столбца
(то есть, когда Вы используете аргумент column_list
):
SELECT
, INSERT
и UPDATE
.
Вы можете устанавливать глобальные привилегии, используя синтаксис
ON *.*
. Вы можете устанавливать привилегии базы данных,
используя синтаксис ON db_name.*
. Если Вы определяете
ON *
, и Вы имеете текущую базу данных, Вы установите привилегии
именно для этой базы данных. ПРЕДУПРЕЖДЕНИЕ: Если Вы
определяете ON *
, и Вы не имеете текущей базы данных,
Вы будете воздействовать на глобальные привилегии!
mysql> SELECT Host,User FROM mysql.user WHERE User='';
В настоящий момент GRANT
поддерживает имена хоста, базы
данных, таблицы и столбца длиной только до 60 символов. Имя пользователя
может быть длиной до 16 символов.
Привилегии для столбца могут быть вычислены следующим образом:
global privileges OR (database privileges AND host privileges) OR table privileges OR column privileges
В большинстве случаев Вы предоставляете права пользователю только в одном
из уровней привилегии, так что обычно это просто. Детали проверяющей
привилегии процедуры подробно рассмотрены в разделе
«4.2 Общие проблемы защиты и система
привилегий доступа MySQL«.
В MySQL Version 3.22.12 или позже, если новый
пользователь создан, или если Вы имеете глобальные привилегии, пароль
пользователя будет установлен в пароль, определенный предложением
IDENTIFIED BY
, если оно задано. Если пользователь уже имел
пароль, он будет заменен новым.
ПРЕДУПРЕЖДЕНИЕ: Если Вы создаете нового пользователя, но
не определяете предложение IDENTIFIED BY
, пользователь не имеет
никакого пароля. Это опасно.
Пароли также могут быть установлены командой SET PASSWORD
.
Подробности в разделе «5.5.6 Синтаксис
SET
«.
Если Вы предоставляете привилегии для базы данных, запись в таблице
mysql.db
будет создана, если необходимо. Когда все привилегии
для базы данных будут удалены с помощью REVOKE
, эта запись тоже
будет удалена автоматически.
Если пользователь не имеет привилегий на таблице, данная таблица не
отображается вообще, когда пользователь запрашивает список таблиц (например,
инструкцией SHOW TABLES
).
Предложение WITH GRANT OPTION
дает пользователю способность
передать другим пользователям любые привилегии, которые этот пользователь
имеет в определенном уровне доступа. Вы должны быть внимательным к тому, кому
Вы даете привилегию grant, поскольку два пользователя с
различными привилегиями могут быть способны соединить свои привилегии!
Вы не можете предоставлять другому пользователю привилегию, которую Вы не
имеете сами. Привилегия grant позволяет Вам передавать
только те привилегии, которыми Вы реально обладаете.
Знайте, что, когда Вы предоставляете пользователю привилегию
grant в специфическом уровне привилегии, любые привилегии,
которые пользователь уже имеет (или получит в будущем!) в этом уровне также
могут передаваться этим пользователем кому угодно. Предположите, что Вы
предоставляете пользователю привилегию insert на базе
данных. Если Вы затем предоставляете привилегию select на
базе данных и определяете WITH GRANT OPTION
, пользователь сможет
передавать не только привилегию select, но и
insert! Если Вы затем предоставляете ему еще и привилегию
update на базе данных, этот пользователь сможет передавать
insert, select и update.
Вы не должны предоставлять привилегию alter нормальному
пользователю. Если Вы это сделаете, пользователь может попробовать
разрушить систему привилегии, переименовывая таблицы!
Обратите внимание, что, если Вы используете привилегии столбца или таблицы
даже для одного пользователя, сервер исследует привилегии столбца и таблицы
для всех пользователей, и это замедлит немного MySQL.
Самые большие различия между ANSI SQL и MySQL
версиями оператора GRANT
:
- В MySQL привилегии даны для комбинаций username+hostname, а не только
для одного username. - ANSI SQL не имеет привилегий глобального уровня и базы данных и не
поддерживает все типы привилегии, которые предоставляет MySQL. Зато MySQL не
поддерживает привилегииTRIGGER
,EXECUTE
и
UNDER
из ANSI SQL. - Привилегии ANSI SQL структурированы иерархически. Если Вы удаляете
пользователя, все привилегии, которые этот пользователь предоставил,
отменяются автоматически. В MySQL предоставленные привилегии автоматически не
отменяются, Вы должны отменить их непосредственно, если это необходимо. - Если Вы в MySQL имеете предоставление
INSERT
только на части
столбцов в таблице, Вы можете выполнять инструкцииINSERT
относительно таблицы: столбцы, для которых Вы не имеете привилегию
INSERT
будут установлены к их значениям по умолчанию. ANSI SQL
требует, чтобы Вы имели привилегиюINSERT
на всех столбцах. - Когда Вы удаляете таблицу в ANSI SQL, все привилегии для таблицы
отменяются. Если Вы отменяете привилегию в ANSI SQL, все привилегии, которые
предоставлялись основанными на этой привилегии, также отменяются. В MySQL
привилегии могут быть удалены только явным вызовом команды
REVOKE
или правкой таблиц предоставления привилегий MySQL.
4.3.2 Имена и пароли пользователей MySQL
Имеются несколько различий между использованием имен и паролей MySQL и
Unix или Windows:
- Имена пользователей, которые используются MySQL для опознавательных
целей, не имеют никакого отношения к именам пользователей Unix или Windows.
Большинство клиентов MySQL по умолчанию пробует войти, используя текущее имя
пользователя Unix как имя пользователя MySQL, но это только для удобства.
Программы-клиенты позволяют задавать различные имена опциями
-u
или--user
. Это означает, что Вы не можете
делать базу данных безопасной всегда, если все имена пользователей MySQL не
имеют паролей. Любой может пытаться соединиться с сервером, используя любое
имя, и это получиться, если использовано имя, которое не имеет пароля. - Имена пользователей MySQL могут быть длиной до 16 символов. В Unix обычно
длина не превышает 8 символов. - Пароли MySQL тоже не имеют никакого отношения к паролям в Unix. Очень
советую сделать их разными: тогда взлом пароля Unix не будет означать взлома
пароля для доступа к базам данных и, наоборот. - MySQL шифрует пароли, используя алгоритм, отличный от алгоритма
шифрования в Unix. Обратите внимание, что, даже если пароль сохранен в
зашифрованном виде, знания именно зашифрованного пароля вполне достаточно,
чтобы соединиться с сервером MySQL!
Пользователи MySQL и их привилегии обычно создаются командой
GRANT
. Подробности в разделе «4.3.1
Синтаксис GRANT
и REVOKE
«.
Когда Вы входите в систему на сервере MySQL с помощью клиента командной
строки, Вы должны определить пароль с помощью опции
--password=your-password
. Подробности изложены в разделе
«4.2.7 Связь с сервером MySQL«:
mysql --user=monty --password=guess database_name
Если Вы хотите, чтобы Вас запросили относительно пароля, Вы должны
использовать аргумент --password
:
mysql --user=monty --password database_name
Или в кратком виде:
mysql -u monty -p database_name
Обратите внимание, что в последнем примере пароль НЕ
database_name.
Если Вы хотите использовать опцию -p
, чтобы задать пароль,
сделайте это так:
mysql -u monty -pguess database_name
На некоторых системах библиотечный вызов, который MySQL использует для
запроса пароля, автоматически урежет пароль до длины в 8 символов. Внутренне
MySQL не имеет ограничений на длину пароля.
4.3.3 Когда привилегии вступают в силу
При запуске mysqld
все содержание таблиц предоставления
привилегий читается в память и становится действующим.
Модификации к таблицам предоставления, которые Вы выполняете используя
GRANT
, REVOKE
или SET PASSWORD
вступают в силу немедленно.
Когда сервер обращает внимания, что таблицы предоставления были изменены,
на существующие подключения пользователей это воздействуют следующим образом:
- Изменения привилегий столбцов и таблиц воздействуют, начиная со
следующего запроса пользователя. - Изменения привилегии базы данных воздействуют в следующем вызове команды
USE db_name
.
Изменения глобальных привилегий и пароля воздействуют, когда пользователь
соединится в следующий раз.
4.3.4 Установка начальных привилегий MySQL
После установки MySQL Вы устанавливаете начальные привилегии доступа
вызовом скрипта scripts/mysql_install_db
. Подробности в разделе
«2.3.1 Обзор быстрой установки«.
Скрипт mysql_install_db
запускает сервер mysqld
и
устанавливает следующие привилегии:
- MySQL-пользователь
root
создан как суперпользователь,
который может делать что угодно. Подключения должны быть обязательно с
локального компьютера. ОБРАТИТЕ ВНИМАНИЕ: начальный пароль
дляroot
пуст, так что любой может соединяться как
root
без пароля и предоставлять все привилегии. - Анонимный пользователь создан, что может делать что-нибудь с базами
данных, которые имеют имяtest
, или их имя начинается с
test_
. Подключения должны быть с локального компьютера. Это
означает, что любой локальный пользователь может соединяться без пароля и
обрабатываться как анонимный пользователь. - Другие привилегии отклонены. Например, нормальные пользователи не могут
mysqladmin shutdown
илиmysqladmin processlist
.
ОБРАТИТЕ ВНИМАНИЕ: заданные по умолчанию привилегии иные
для Windows. Подробности в разделе «
2.6.2.3 Запуск MySQL под Windows«.
Первое, что следует сделать, это определить пароль для MySQL-пользователя
root
. Вы можете сделать это следующим образом (обратите
внимание, что Вы определяете пароль, используя функцию
PASSWORD()
):
shell> mysql -u root mysql mysql> UPDATE user SET Password=PASSWORD('new_password') WHERE user='root'; mysql> FLUSH PRIVILEGES;
Вы можете, в MySQL версии 3.22 и выше, использовать инструкцию
SET PASSWORD
:
shell> mysql -u root mysql mysql> SET PASSWORD FOR root=PASSWORD('new_password');
shell> mysqladmin -u root password new_password
Только пользователи с доступом на чтение/запись к базе данных
mysql
могут изменять пароль для других пользователи. Все
нормальные пользователи (не анонимные) могут менять только их собственный
пароль с помощью вышеупомянутых команд или вызовом
SET PASSWORD=PASSWORD('new password')
.
Как только пароль root
был установлен, Вы должны использовать
его при соединении с сервером.
Изучение скрипта scripts/mysql_install_db
весьма пригодится
при сборе информации по созданию и настройке других пользователей.
Если Вы хотите, чтобы начальные привилегии были иными, чем те, которые
только что я описал, Вы можете изменять скрипт mysql_install_db
прежде, чем Вы его выполните.
Чтобы освежить таблицы
предоставления привилегий полностью (пересоздать их заново), удалите все
файлы `.frm', `.MYI' и `.MYD' в каталоге,
содержащем базу данных mysql
. Это каталог с именем
`mysql' в каталоге баз данных, который будет перечислен, когда
Вы выполняете mysqld --help
. Затем выполните скрипт
mysql_install_db
, возможно, после его редактирования, чтобы
иметь те привилегии, которые Вы хотите установить.
ОБРАТИТЕ ВНИМАНИЕ: Для MySQL версий старше, чем 3.22.10,
Вы не должны удалить файлы `.frm'. Если Вы случайно сделаете это, Вы
должны скопировать их обратно из Вашего дистрибутива MySQL перед выполнением
mysql_install_db
.
4.3.5 Добавление новых пользователей в MySQL
Вы можете добавлять пользователей двумя различными путями: используя
инструкции GRANT
или непосредственно управляя таблицами MySQL.
Примеры ниже показывают, как использовать клиент mysql
, чтобы
установить новых пользователей. Эти примеры принимают, что привилегии
установлены согласно значениям по умолчанию, описанным в предыдущем разделе.
Это означает, что, чтобы делать изменения, Вы должны быть зарегестрированы на
той же самой машине, где работает сервер mysqld
, Вы должны
соединиться как MySQL-пользователь root
, и он должен иметь
привилегию insert для базы данных mysql
, а
также административную привилегию reload. Также, если Вы
изменили пароль для root
, Вы должны определить его в командах.
Вы можете добавлять новых пользователей, выдавая инструкции
GRANT
:
shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost;
Эти инструкции GRANT
устанавливают трех новых пользователей:
monty
- Полный суперпользователь, может соединяться с сервером отовсюду, но
должен использовать пароль'some_pass'
. Обратите внимание, что
Вы должны выдать инструкцииGRANT
для
monty@localhost
иmonty@"%"
. Если мы не добавляем
запись сlocalhost
, анонимный пользователь для
localhost
, который созданmysql_install_db
, будет
иметь приоритет, когда мы соединяемся с локального компьютера потому, что это
имеет более специфическое полеHost
, и таким образом окажется
первым в отсортированной таблицеuser
. admin
- Пользователь может соединяться с
localhost
без пароля, и ему
предоставляют административные привилегии reload и
process. Это позволяет пользователю выполнять команды
mysqladmin reload
,mysqladmin refresh
и
mysqladmin flush-*
, также какmysqladmin
. Никакие связанные с базой данных привилегии ему не
processlist
предоставляются. Их можно предоставить позже, выдавая
дополнительные инструкцииGRANT
. dummy
- Пользователь может соединяться без пароля, но только с локального
компьютера. Глобальные привилегии все установлены в'N'
.
ПривилегияUSAGE
позволяет Вам создавать пользователя без
привилегий. Принимается, что Вы предоставите ему специфические для базы
данных привилегии позже.
Вы можете также добавлять то же
самое, обращаясь к информации непосредственно, выдавая инструкции
INSERT
и затем сообщая серверу перезагрузить таблицы:
shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES;
Следующий пример добавляет пользователя custom
, который может
соединяться с компьютеров localhost
, server.domain
и whitehouse.gov
. Он хочет обращаться к базе данных
bankaccount
только с машины localhost
, базе данных
expenses
только с машины whitehouse.gov
, а к базе
данных customer
со всех трех компьютеров. Он хочет использовать
пароль stupid
для всех систем.
Чтобы установить привилегии этого пользователя, используя инструкцию
GRANT
, выполните эти команды:
shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO custom@localhost IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO custom@whitehouse.gov IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO custom@'%' IDENTIFIED BY 'stupid';
Чтобы установить привилегии пользователя, изменяя таблицы предоставления
привилегий непосредственно, выполните эти команды (обратите внимание на вызов
FLUSH PRIVILEGES
в конце):
shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('stupid')); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv) VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES;
Если Вы хотите давать специфический доступ пользователю с любой машины в
данном домене, Вы можете выдать инструкцию GRANT
таким образом:
mysql> GRANT ... ON *.* TO myusername@"%.mydomainname.com" IDENTIFIED BY 'mypassword';
Чтобы сделать ту же самую работу, изменяя таблицы предоставления
привилегий непосредственно, сделайте так:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername', PASSWORD('mypassword'),...); mysql> FLUSH PRIVILEGES;
4.3.6 Установка паролей
В большинстве случаев Вы должны использовать GRANT
, чтобы
установить Ваших пользователей и их пароли, так что следующее касается только
пользоваателей профессионального уровня.
shell> mysql -u root mysql mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey','biscuit'); mysql> FLUSH PRIVILEGES;
shell> mysql -u jeffrey -pbiscuit test Access denied
mysql> INSERT INTO user (Host,User,Password) VALUES('%','jeffrey',PASSWORD('biscuit'));
Вы должны также использовать функцию PASSWORD()
, когда Вы
применяете инструкции SET PASSWORD
:
mysql> SET PASSWORD FOR jeffrey@"%" = PASSWORD('biscuit');
mysql> GRANT USAGE ON *.* TO jeffrey@"%" IDENTIFIED BY 'biscuit';
или примерно так:
shell> mysqladmin -u jeffrey password biscuit
ОБРАТИТЕ ВНИМАНИЕ: PASSWORD()
не выполняет
шифрование пароля так, как это делается в Unix.
4.3.7 Хранение паролей в безопасности
Нецелесообразно определять Ваш пароль так, что его могут увидеть другие
пользователи. Методы, которые Вы можете использовать, чтобы определить Ваш
пароль, когда Вы выполняете программы-клиенты, перечислены ниже, наряду с
оценкой рисков каждого метода:
- Никогда не давайте нормальному пользователю доступ к таблице
mysql.user
. Знание зашифрованного пароля для пользователя делает
возможным вход в систему под именем этого пользователя. - Используйте опции
-pyour_pass
или
--password=your_pass
в командной строке. Это удобно, но опасно
потому, что Ваш пароль становится видимым программам состояния системы
(например,ps
), которые могут вызываться другими пользователями,
чтобы отобразить командные строки. Клиенты MySQL обнуляют командные строки,
чтобы их не было видно в процессе выполнения, но имеется краткий интервал, в
течение которого значение является видимым. - Используйте опции
-p
или--password
(без
определенного значенияyour_pass
). В этом случае
программа-клиент запросит пароль с терминала:shell> mysql -u user_name -p Enter password: ********
Символы * представляют Ваш пароль. Это более безопасно, чем
определить пароль прямо в командной строке потому, что это не видно другим
пользователям. Однако, этот метод ввода пароля подходит только для программ,
которые Вы выполняете в интерактивном режиме. Если Вы хотите вызывать клиента
из скрипта, который выполняется не в интерактивном режиме, не имеется никакой
возможности ввести пароль с терминала. На некоторых системах Вы можете даже
обнаружить, что первая строка Вашего скрипта читается и неправильно
интерпретируется как Ваш пароль! - Сохраните Ваш пароль в файле конфигурации. Например,
Вы можете перечислить пароль в разделе[client]
файла
.my.cnf в Вашем основном каталоге:[client] password=your_pass
Если Вы сохраняете Ваш пароль в файле .my.cnf, не должен быть
доступен на чтение (тем более на запись) никому, кроме Вас. Удостоверьтесь,
что режим доступа файла400
или600
. - Вы можете сохранять Ваш пароль в системной переменной
MYSQL_PWD
, но этот метод должен рассматриваться как чрезвычайно
опасный и не должен использоваться. Некоторые версииps
включают
опцию, чтобы отобразить среду управления процессами. Ваш пароль будет видим
всем желающим использовать такую команду. Даже на системах без такой версии
ps
неблагоразумно считать, что не имеется никакого другого
метода наблюдать среды процесса.
В целом, самые безопасные методы состоят в том, чтобы иметь запрос
программы-клиента для пароля или определять пароль в правильно защищенном
файле личных настроек .my.cnf.
Introduction
MySQL is an open-source relational database management system. It is commonly deployed as part of the LAMP stack (which stands for Linux, Apache, MySQL, and PHP) and, as of this writing, is the most popular open-source database in the world.
Prerequisites
You could alternatively spin up a MySQL database managed by a cloud provider. For details on how to spin up a DigitalOcean Managed Database, see our product documentation.
Please note that any portions of example commands that you need to change or customize will be highlighted like this
throughout this guide.
Creating a New User
- mysql
- mysql root
- ">CREATE @ IDENTIFIED WITH authentication_plugin BY
- ">CREATE @ IDENTIFIED BY
- ">CREATE @ IDENTIFIED WITH mysql_native_password BY
- ">ALTER @ IDENTIFIED WITH mysql_native_password BY
Granting a User Permissions
- ">GRANT PRIVILEGE ON database.table TO @
You can find the full list of available privileges in the official MySQL documentation.
- ">GRANT CREATE, ALTER, DROP, INSERT, UPDATE, DELETE, SELECT, REFERENCES, RELOAD on *.* TO @ WITH GRANT OPTION
- ">GRANT ALL PRIVILEGES ON *.* TO @ WITH GRANT OPTION
- ">FLUSH PRIVILEGES
However, according to the official MySQL documentation, when you modify the grant tables indirectly with an account management statement like GRANT
, the database will reload the grant tables immediately into memory, meaning that the FLUSH PRIVILEGES
command isn’t necessary in our case. On the other hand, running it won’t have any negative effect on the system.
If you need to revoke a permission, the structure is almost identical to granting it:
- ">REVOKE type_of_permission ON database_name.table_name FROM @
Note that when revoking permissions, the syntax requires that you use FROM
, instead of TO
which you used when granting the permissions.
- ">SHOW GRANTS FOR @
- ">DROP @
- ">
- mysql sammy
MySQL is an open source, object-relational database built with speed and reliability in mind. Its large and active developer community has created many third-party applications, tools, and libraries that expand MySQL’s functionality.
Privilege Restrictions on DigitalOcean’s MySQL Managed Databases
mysql
sys
metrics_user_telegraf
performance_schema
Granting Privileges
">
GRANT ALL ON example_database.* TO 'example_user'@'%';
">
GRANT ALL ON example_database.* TO 'example_user'@'%' WITH GRANT OPTION;
">
GRANT SELECT ON example_database TO 'example_user'@'%';
">
GRANT SELECT ON example_database TO 'example_user'@'%';
mysql> GRANT INSERT ON example_database.example_table TO 'example_user'@'%';
Revoking Privileges
">
REVOKE ALL ON example_database FROM 'example_user'@'%';
">
REVOKE ALL ON example_database FROM 'example_user'@'%';
mysql> GRANT SELECT ON example_database TO 'example_user'@'%';
Viewing Privileges
">
SHOW GRANTS;
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+---------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT CREATE, DROP, PROCESS, SHOW DATABASES, REPLICATION CLIENT, CREATE USER, CREATE ROLE, DROP ROLE ON *.* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT ROLE_ADMIN ON *.* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON "defaultdb".* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "mysql".* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "sys".* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "metrics_user_telegraf".* TO "doadmin"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "performance_schema".* TO "doadmin"@"%" WITH GRANT OPTION
+---------------------------------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.07 sec)
">
SHOW GRANTS FOR 'example_user';
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT CREATE, DROP, RELOAD, PROCESS, SHOW DATABASES, REPLICATION CLIENT, CREATE USER ON *.* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT ROLE_ADMIN ON *.* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON "defaultdb".* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "mysql".* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "sys".* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "metrics_user_telegraf".* TO "example_user"@"%" WITH GRANT OPTION |
| GRANT SELECT ON "performance_schema".* TO "example_user"@"%" WITH GRANT OPTION |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+
7 rows in set (0.00 sec)
Introduction
MySQL is an open-source database management system, commonly installed as part of the popular LAMP (Linux, Apache, MySQL, PHP/Python/Perl) stack. It implements the relational model and uses Structured Query Language (better known as SQL) to manage its data.
This tutorial will go over how to install MySQL version 8.0 on an Ubuntu 22.04 server. By completing it, you will have a working relational database that you can use to build your next website or application.
Step 1 — Installing MySQL
On Ubuntu 22.04, you can install MySQL using the APT package repository. At the time of this writing, the version of MySQL available in the default Ubuntu repository is version 8.0.28.
To install it, update the package index on your server if you’ve not done so recently:
- update
Then install the mysql-server
package:
- mysql-server
Ensure that the server is running using the systemctl start
command:
- systemctl start mysql.service
These commands will install and start MySQL, but will not prompt you to set a password or make any other configuration changes. Because this leaves your installation of MySQL insecure, we will address this next.
Step 2 — Configuring MySQL
Warning: As of July 2022, an error will occur when you run the mysql_secure_installation
script without some further configuration. The reason is that this script will attempt to set a password for the installation’s root MySQL account but, by default on Ubuntu installations, this account is not configured to connect using a password.
... Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost' as the authentication method used doesn't store authentication data in the MySQL server. Please consider using ALTER USER instead if you want to change authentication parameters.
New password:
This will lead the script into a recursive loop which you can only get out of by closing your terminal window.
First, open up the MySQL prompt:
- mysql
- ">ALTER @ IDENTIFIED WITH mysql_native_password BY
After making this change, exit the MySQL prompt:
- ">
Run the security script with sudo
:
- mysql_secure_installation
Securing the MySQL server deployment.
Connecting to MySQL using a blank password.
VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?
Press y|Y for Yes, any other key for No: Y
There are three levels of password validation policy:
LOW Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary file
Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
2
Please set the password for root here.
New password:
Re-enter new password:
If you used the Validate Password Plugin, you’ll receive feedback on the strength of your new password. Then the script will ask if you want to continue with the password you just entered or if you want to enter a new one. Assuming you’re satisfied with the strength of the password you just entered, enter Y
to continue the script:
Estimated strength of the password: 100
Do you wish to continue with the password provided?(Press y|Y for Yes, any other key for No) : Y
- mysql root
Then go back to using the default authentication method using this command:
- ">ALTER @ IDENTIFIED WITH auth_socket
Step 3 — Creating a Dedicated MySQL User and Granting Privileges
- mysql
- mysql root
- ">CREATE @ IDENTIFIED WITH authentication_plugin BY
- ">CREATE @ IDENTIFIED BY
- ">CREATE @ IDENTIFIED WITH mysql_native_password BY
- ">ALTER @ IDENTIFIED WITH mysql_native_password BY
- ">GRANT PRIVILEGE ON database.table TO @
You can find the full list of available privileges in the official MySQL documentation.
- ">GRANT CREATE, ALTER, DROP, INSERT, UPDATE, INDEX, DELETE, SELECT, REFERENCES, RELOAD on *.* TO @ WITH GRANT OPTION
- ">GRANT ALL PRIVILEGES ON *.* TO @ WITH GRANT OPTION
- ">FLUSH PRIVILEGES
Then you can exit the MySQL client:
- ">
- mysql sammy
Finally, let’s test the MySQL installation.
Step 4 — Testing MySQL
Regardless of how you installed it, MySQL should have started running automatically. To test this, check its status.
- systemctl status mysql.service
● mysql.service - MySQL Community Server
Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
Active: active (running) since Mon 2022-04-11 16:04:39 UTC; 2h 36min ago
Process: 2593 ExecStartPre=/usr/share/mysql/mysql-systemd-start pre (code=exited, status=0/SUCCESS)
Main PID: 2601 (mysqld)
Status: "Server is operational"
Tasks: 38 (limit: 1119)
Memory: 354.3M
CPU: 19.944s
CGroup: /system.slice/mysql.service
└─2601 /usr/sbin/mysqld
If MySQL isn’t running, you can start it with sudo systemctl start mysql
.
- mysqladmin sammy version
Below is an example of the output:
mysqladmin Ver 8.0.28-0ubuntu4 for Linux on x86_64 ((Ubuntu))
Copyright (c) 2000, 2022, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Server version 8.0.28-0ubuntu4
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /var/run/mysqld/mysqld.sock
Uptime: 2 hours 31 min 57 sec
Threads: 2 Questions: 25 Slow queries: 0 Opens: 160 Flush tables: 3 Open tables: 79 Queries per second avg: 0.000
This means MySQL is up and running.
Conclusion
You now have a basic MySQL setup installed on your server. Here are a few examples of next steps you can take:
- Set up a LAMP stack or a LEMP stack
- Practice running queries with SQL
- Manage your MySQL installation with phpMyAdmin
4.3.5 Добавление новых пользователей в MySQL
Пользователей можно добавлять двумя различными способами — при помощи
команды GRANT
или напрямую в таблицы назначения привилегий MySQL.
Предпочтительнее использовать команду GRANT
— этот способ проще и дает
меньше ошибок. See section 4.3.1 Синтаксис команд GRANT
и REVOKE
.
В приведенных ниже примерах демонстрируется, как использовать клиент mysql
для задания новых пользователей. В примерах предполагается, что привилегии
установлены в соответствии с принятыми по умолчанию значениями, описанными
в предыдущем разделе. Это означает, что для внесения изменений на том же
компьютере, где запущен mysqld
, необходимо подсоединиться к серверу как
пользователь MySQL root
, и у пользователя root
должна быть привилегия
INSERT
для базы данных mysql
, а также административная привилегия RELOAD
.
Кроме того, если был изменен пароль пользователя root
, его необходимо
указать здесь для команды mysql
.
Новых пользователей можно добавлять, используя команду GRANT
:
shell> mysql --user=root mysql mysql> GRANT ALL PRIVILEGES ON *.* TO monty@localhost -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT ALL PRIVILEGES ON *.* TO monty@"%" -> IDENTIFIED BY 'some_pass' WITH GRANT OPTION; mysql> GRANT RELOAD,PROCESS ON *.* TO admin@localhost; mysql> GRANT USAGE ON *.* TO dummy@localhost;
Эти команды GRANT
создают трех новых пользователей:
monty
- Полноценный суперпользователь — он может подсоединяться к серверу откуда
угодно, но должен использовать для этого парольsome_pass
. Обратите
внимание на то, что мы должны применить операторыGRANT
как для
monty@localhost
, так и дляmonty@"%"
. Если не добавить запись сlocalhost
,
запись анонимного пользователя дляlocalhost
, которая создается при помощи
mysql_install_db
, будет иметь преимущество при подсоединении с локального
компьютера, так как в ней указано более определенное значение для поля
Host
, и она расположена раньше в таблицеuser
. admin
- Пользователь, который может подсоединяться с
localhost
без пароля; ему
назначены административные привилегииRELOAD
иPROCESS
. Эти привилегии
позволяют пользователю запускать командыmysqladmin reload
,mysqladmin
h и
refresmysqladmin flush-*
, а такжеmysqladmin processlist
. Ему не
назначено никаких привилегий, относящихся к базам данных (их можно
назначить позже, дополнительно применив операторGRANT
). dummy
- Пользователь, который может подсоединяться к серверу без пароля, но только
с локального компьютера. Все глобальные привилегии установлены в значение
'N'
-тип привилегииUSAGE
, который позволяет создавать пользователей без
привилегий. Предполагается, что относящиеся к базам данных привилегии
будут назначены позже.
Можно напрямую добавить точно такую же информацию о пользователе при
помощи оператора INSERT
, а затем дать серверу команду перезагрузить
таблицы назначения привилегий:
shell> mysql --user=root mysql mysql> INSERT INTO user VALUES('localhost','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user VALUES('%','monty',PASSWORD('some_pass'), -> 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO user SET Host='localhost',User='admin', -> Reload_priv='Y', Process_priv='Y'; mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','dummy',''); mysql> FLUSH PRIVILEGES;
В приведенном ниже примере добавляется пользователь custom
, который может
подсоединяться с компьютеров localhost
, server.domain
и whitehouse.gov
. Он
хочет получать доступ к базе данных bankaccount
только с компьютера
localhost
, к базе данных expenses
— только с whitehouse.gov
, и к базе
данных customer
— со всех трех компьютеров, а также использовать пароль
stupid
при подсоединении со всех трех компьютеров.
Чтобы задать эти привилегии пользователя при помощи оператора GRANT
,
выполните следующие команды:
shell> mysql --user=root mysql mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON bankaccount.* -> TO custom@localhost -> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON expenses.* -> TO custom@whitehouse.gov -> IDENTIFIED BY 'stupid'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP -> ON customer.* -> TO custom@'%' -> IDENTIFIED BY 'stupid';
Привилегии для пользователя custom мы назначаем потому, что этот
пользователь хочет получать доступ к MySQL как с локального компьютера
через сокеты Unix, так и с удаленного компьютера whitehouse.gov
через
протокол TCP/IP.
Чтобы задать привилегии пользователя путем непосредственного внесения
изменений в таблицы назначения привилегий, выполните следующие команды
(обратите внимание на команду FLUSH PRIVILEGES
в конце примера):
shell> mysql --user=root mysql mysql> INSERT INTO user (Host,User,Password) -> VALUES('localhost','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('server.domain','custom',PASSWORD('stupid')); mysql> INSERT INTO user (Host,User,Password) -> VALUES('whitehouse.gov','custom',PASSWORD('stupid')); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES -> ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES -> ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y'); mysql> INSERT INTO db -> (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, -> Create_priv,Drop_priv) -> VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y'); mysql> FLUSH PRIVILEGES;
Если необходимо предоставить определенному пользователю доступ с любого
компьютера к определенному домену, можно воспользоваться оператором GRANT
следующим образом:
mysql> GRANT ... -> ON *.* -> TO myusername@"%.mydomainname.com" -> IDENTIFIED BY 'mypassword';
Чтобы сделать то же самое путем непосредственного внесения изменений в
таблицы назначения привилегий, выполните следующие действия:
mysql> INSERT INTO user VALUES ('%.mydomainname.com', 'myusername', -> PASSWORD('mypassword'),...); mysql> FLUSH PRIVILEGES;
4.3.1 Синтаксис команд GRANT
и REVOKE
GRANT priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY 'password'] ...] [REQUIRE [{SSL| X509}] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] ...] ON {tbl_name | * | *.* | db_name.*} FROM user_name [, user_name ...]
GRANT
включен в MySQL начиная с версии 3.22.11 и выше. В более ранних
версиях MySQL оператор GRANT
ничего не выполняет.
Команды GRANT
и REVOKE
позволяют системным администраторам создавать
пользователей MySQL, а также предоставлять права пользователям или лишать
их прав на четырех уровнях привилегий:
- Глобальный уровень
- Глобальные привилегии применяются ко всем базам данных на указанном
сервере. Эти привилегии хранятся в таблицеmysql.user
. - Уровень базы данных
- Привилегии базы данных применяются ко всем таблицам указанной базы данных.
Эти привилегии хранятся в таблицахmysql.db
иmysql.host
. - Уровень таблицы
- Привилегии таблицы применяются ко всем столбцам указанной таблицы. Эти
привилегии хранятся в таблицеmysql.tables_priv
. - Уровень столбца
- Привилегии столбца применяются к отдельным столбцам указанной таблицы. Эти
привилегии хранятся в таблицеmysql.columns_priv
.
Если привилегии предоставляются пользователю, которого не существует, то
этот пользователь создается. Чтобы просмотреть примеры работы команды
GRANT
, см. раздел section 4.3.5 Добавление новых пользователей в MySQL.
В таблице приведен список возможных значений параметра priv_type
для
операторов GRANT
и REVOKE
:
Значение USAGE
можно задавать, если необходимо создать пользователя без
привилегий.
В боле старых версиях MySQL привилегия PROCESS
предоставляет такие же
права, как и новая привилегия SUPER
.
Чтобы лишить пользователя привилегий, предоставленных командой GRANT
,
воспользуйтесь значением priv_type
в GRANT OPTION
:
mysql> REVOKE GRANT OPTION ON ... FROM ...;
Для таблицы можно указать только следующие значения priv_type
: SELECT
,
INSERT
, UPDATE
, DELETE
, CREATE
, DROP
, GRANT
, INDEX
и ALTER
.
Для столбца можно указать только следующие значения priv_type
(при
использовании оператора column_list
): SELECT
, INSERT
и UPDATE
.
Глобальные привилегии можно задать, воспользовавшись синтаксисом ON *.*
, а
привилегии базы данных — при помощи синтаксиса ON db_name.*
. Если указать
ON *
при открытой текущей базе данных, то привилегии будут заданы для этой
базы данных. (Предупреждение: если указать ON *
при отсутствии открытой
текущей базы данных, это повлияет на глобальные привилегии!)
Чтобы проверить, происходит ли подобное на вашем компьютере, выполните
следующий запрос:
mysql> SELECT Host,User FROM mysql.user WHERE User='';
На данный момент команда GRANT
поддерживает имена удаленных компьютеров,
таблиц, баз данных и столбцов длиной не более 60 символов. Имя
пользователя должно содержать не более 16 символов.
Привилегии для столбца могут быть вычислены следующим образом:
глобальные привилегии OR (привилегии базы данных AND привилегии удаленного компьютера) OR привилегии таблицы OR привилегии столбца
В большинстве случаев права пользователя определяются только на одном
уровне привилегий, поэтому обычно эта процедура не настолько сложна, как
описано выше. Подробная информация о последовательности действий проверки
привилегий представлена в разделе section 4.2 Общие проблемы безопасности и система привилегий доступа MySQL.
Если в MySQL версий 3.22.12 и выше создан новый пользователь или
предоставлены глобальные привилегии, пароль пользователя будет назначаться
оператором IDENTIFIED BY
, если он указан. Если у пользователя уже есть
пароль, то этот пароль будет заменен новым.
Если вы не хотите отправлять пароль открытым текстом, можно
воспользоваться параметром PASSWORD
с зашифрованным паролем, полученным
при помощи функции SQL PASSWORD()
или функции C API
make_scrambled_password(char *to, const char *password)
.
Предупреждение: если при создании нового пользователя не указать оператор
IDENTIFIED BY
, будет создан пользователь без пароля. Это ненадежно с точки
зрения безопасности.
Пароли также можно задавать при помощи команды SET PASSWORD
. See section 5.5.6 Синтаксис команды SET
.
Если у вас привилегии для базы данных, то при необходимости в таблице
mysql.db
создается запись. Данная запись удаляется после удаления всех
привилегий для этой базы данных командой REVOKE
.
Если у пользователя нет никаких привилегий для таблицы, то таблица не
отображается, когда пользователь запрашивает список таблиц (например, при
помощи оператора SHOW TABLES
).
Оператор WITH GRANT OPTION
предоставляет пользователю возможность наделять
других пользователей любыми привилегиями, которые он сам имеет на
указанном уровне привилегий. При предоставлении привилегии GRANT
необходимо проявлять осмотрительность, так как два пользователя с разными
привилегиями могут объединить свои привилегии!
Параметры MAX_QUERIES_PER_HOUR #
, MAX_UPDATES_PER_HOUR #
и
MAX_CONNECTIONS_PER_HOUR #
являются новыми в MySQL версии 4.0.2. Эти
параметры ограничивают количество запросов, обновлений и входов, которые
пользователь может осуществить в течение одного часа. Если установлено
значение 0 (принято по умолчанию), то это означает, что для данного
пользователя нет ограничений. See section 4.3.6 Ограничение ресурсов пользователя.
Нельзя предоставить другому пользователю привилегию, которой нет у вас
самого. Привилегия GRANT
позволяет предоставлять только те привилегии,
которыми вы обладаете.
Учтите, что если пользователю назначена привилегия GRANT
на определенном
уровне привилегий, то все привилегии, которыми этот пользователь уже
обладает (или которые будут ему назначены в будущем!) на этом уровне,
также могут назначаться этим пользователем. Предположим, пользователю
назначена привилегия INSERT
в базе данных. Если потом в базе данных
назначить привилегию SELECT
и указать WITH GRANT OPTION
, пользователь
сможет назначать не только привилегию SELECT
, но также и INSERT
. Если
затем в базе данных предоставить пользователю привилегию UPDATE
,
пользователь сможет после этого назначать INSERT
, SELECT
и UPDATE
.
Не следует назначать привилегии ALTER
обычным пользователям. Это дает
пользователю возможность разрушить систему привилегий путем переименования
таблиц!
Обратите внимание на то, что если используются привилегии для таблицы или
столбца даже для одного пользователя, сервер проверяет привилегии таблиц и
столбцов для всех пользователей, и это несколько замедляет работу MySQL.
Наиболее значительные отличия команды GRANT
версий ANSI SQL и MySQL
следующие:
В MySQL привилегии назначаются для сочетания имя пользователя +
удаленный компьютер, а не только для имени пользователя.В ANSI SQL отсутствуют глобальные привилегии и привилегии уровня базы
данных, и ANSI SQL поддерживает не все типы привилегий MySQL. В свою
очередь, в MySQL отсутствует поддержка привилегий ANSI SQLTRIGGER
,
EXECUTE
илиUNDER
.Структура привилегий ANSI SQL является иерархической. Если удалить
пользователя, то все назначенные этому пользователелю привилегии будут
отменены. В MySQL назначенные привилегии не отменяются автоматически,
их при необходимости требуется удалять самостоятельно.В MySQL пользователь может применять к таблице оператор
INSERT
при
наличии у него привилегииINSERT
только для нескольких столбцов в этой
таблице. Столбцы, для которых отсутствует привилегияINSERT
, будут
установлены в свои значения, принятые по умолчанию. В ANSI SQL
требуется наличие привилегииINSERT
для всех столбцов.При удалении таблицы в ANSI SQL все привилегии для этой таблицы будут
отменены. Если отменить привилегию в ANSI SQL, то все привилегии,
которые были назначены на основе этой привилегии, также будут
отменены. В MySQL привилегии могут удаляться только при помощи команды
REVOKE
или путем изменения таблиц назначения привилегий MySQL.
Чтобы ознакомиться с описанием использования REQUIRE
, см. раздел See section 4.3.9 Использование безопасных соединений.
Поэтому для каждой базы данных нужно создавать отдельных пользователей и настраивать для них права. В этой статье мы рассмотрим, как выполняется создание пользователя mysql, а также настройка его прав.
1. Как создать пользователя MySQL
Предположим, что база данных уже создана и называется test_database. Нам нужно открыть клиент базы данных. Для этого наберите в терминале:
mysql -u root -p
Или можно создать пользователя, который будет доступен со всех хостов:
Смотрим наших пользователей:
Все пользователи созданы.
2. Права пользователя MySQL
Создать пользователя — это ещё далеко не всё, теперь нужно назначить ему права. Для этого используется команда GRAT. У неё такой синтаксис:
Здесь можем дать определённые привилегии для опредёленного пользователя к базе данных или таблице. Если нужно дать права для всех баз данных или таблиц, используйте вместо названия звездочку — «*». Вот основные права пользователя MySQL, которые вы можете использовать:
- ALL PRIVILEGES — все, кроме GRANT;
- USAGE PRIVILEGES — никаких привилегий;
- SELECT — делать выборки из таблиц;
- INSERT — вставлять данные в таблицу;
- UPDATE — обновлять данные в таблице;
- DELETE — удалять данные из таблицы;
- FILE — разрешает читать файлы на сервере;
- CREATE — создавать таблицы или базы данных;
- ALTER — изменять структуру таблиц;
- INDEX — создавать индексы для таблиц;
- DROP — удалять таблицы;
- EVENT — обработка событий;
- TRIGGER — создание триггеров.
Также доступны такие привилегии администрирования баз данных:
- GRANT — изменять права пользователей;
- SUPER — суперпользователь;
- PROCESS — получение информации о состоянии MySQL;
- RELOAD — позволяет перезагружать таблицы привилегий;
- SHUTDOWN — позволяет отключать или перезапускать базу данных;
- SHOW DATABASES — просмотр списка баз данных;
- LOCK TABLES — блокирование таблиц при использовании SELECT;
- REFERENCES — создание внешних ключей для связывания таблиц;
- CREATE USER — создание пользователей;
Чтобы дать права пользователю MySQL на обновление и добавление записей для базы данных test_database, выполните:
Дальше дадим этому же пользователю все права над этой базой данных:
Теперь посмотрим привилегии нашего пользователя:
Мы видим, что для всех баз данных и таблиц привелегий нет, но зато есть все привилегии для базы данных test_database. Вот так это работает. После обновления прав пользователя необходимо обновить таблицу прав пользователей MySQL в памяти. Для этого выполните:
3. Удаление прав пользователя MySQL
Чтобы отозвать права у пользователя MySQL, используйте команду REVOKE вместо GRANT. Её синтаксис похож на GRANT:
Например, заберём все права на базу данных test_database у нашего пользователя:
4. Создание суперпользователя MySQL
Если вам необходимо создать пользователя со всеми правами MySQL на замену для root, то можно использовать такую конструкцию:
Выводы
Обнаружили ошибку в тексте? Сообщите мне об этом. Выделите текст с ошибкой и нажмите Ctrl+Enter.
Введение
В статье речь пойдет о работе с пользователями открытой реляционной системы управления базами данных (СУБД) MySQL, появившейся в 1994 году. В 2008 году Sun Microsystems купил MySQL AB, а в 2010 уже Sun была поглощена Oracle. Эти продажи побудили авторов исходной СУБД создать форк — MariaDB, свободный от лицензионных ограничений текущего владельца и совместимый с Oracle MySQL. Помимо «Марии» известен другой форк, Percona, — от Петра Зайцева и Вадима Ткаченко. Оба форка совместимы с MySQL.
БД от Percona обладает дополнительными функциями, направленными на повышение производительности. Многие дистрибутивы (например, Red Hat) перешли на MariaDB из-за предсказуемой лицензионной политики. В своих проектах автор использует MariaDB.
Поскольку работа с пользователями задача больше административная и нерегулярная, рассмотрим наиболее надежный способ — через консоль.
Зачем нужны пользователи
После установки MySQL технически мы можем подключаться из нашего ПО от имени root’а, но это не безопасно. Работая с информационными системами, мы всегда должны помнить и соблюдать принцип наименьших привилегий. Для более безопасной работы и создаются пользователи БД. Привилегии должны быть предоставлены пользователю строго только те, что действительно необходимы.
Администратору MariaDB в работе требуется создавать учетные записи «обычных» пользователей с ограниченным доступом к данным, определять права доступа, при необходимости — создавать дополнительных (привилегированных) суперпользователей. Также важно проводить аудит — просматривать выданные полномочия и корректировать их по мере необходимости.
Пользователи MySQL
Имя пользователя MySQL
В MySQL имя пользователя состоит из 2-х частей: имени пользователя (обязательно) и хоста (может быть опущена, тогда она означает ‘%’):
Примеры записи хоста:
somehost.example.com
localhost
127.0.0.1
::1
192.168.123.%
192.168.123.0/255.255.255.0
%
Примечание: имена и адреса следует указывать в том формате, в каком возвращает системный DNS resolver сервера.
Просмотр всех пользователей
Давайте проверим, какие пользователи есть в нашей БД. Выведем основную информацию о пользователях:
SELECT host, user, password, password_expired FROM mysql.user;
Когда список получается большим, мы можем добавить фильтр (в примере — по хостам, начинающимся с msk):
SELECT host, user, password FROM mysql.user WHERE host LIKE 'msk%';
Или использовать в конце модификатор \G, оптимизирующий вывод для отображения в консоли:
SELECT host, user, password FROM mysql.user\G;
SELECT * FROM mysql.user[\G];
Создание нового пользователя MySQL
Новый пользователь в MySQL добавляется командой:
CREATE USER 'some_user'@'somehost.somedomain' IDENTIFIED BY 'some_password';
Теперь давайте создадим нашего первого пользователя:
CREATE USER 'test'@'localhost' IDENTIFIED BY 'secret';
FLUSH PRIVILEGES;
Полезная возможность — добавление комментария:
CREATE USER 'test'@'localhost' COMMENT 'My 1st user for app';
FLUSH PRIVILEGES
Удаление пользователя MySQL
Для удаления пользователя используется команда
DROP USER 'some_user'@'somehost.somedomain';
На нашем предыдущем примере:
DROP USER 'test'@'localhost';
FLUSH PRIVILEGES;
Создание дополнительного суперпользователя
Это не лучшая практика, но бывают ситуации, когда у СУБД несколько хозяев и всем нужно быть суперпользователями. В MySQL добавить пользователя с root-правами можно так:
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
Отзыв полномочий у пользователя
Команда отзыва привилегий функционально обратна GRANT, “TO” заменяется на “FROM”:
REVOKE SELECT ON `somedb`.* FROM 'someuser'@'somehost';
REVOKE ALL PRIVILEGES ON `somedb`.* FROM 'someuser'@'somehost';
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'someuser'@'somehost';
Смена пароля
ALTER USER 'test_user'@'localhost' IDENTIFIED BY 'new_password';
Предоставление доступа пользователю MySQL
Доступ предоставляется командой:
GRANT SELECT ON `some_db`.* TO 'some_user'@'somehost.somedomain';
FLUSH PRIVILEGES;
Создадим пользователя и БД (часто БД называют схемой, в терминах MySQL):
CREATE SCHEMA test_DB;
CREATE USER 'test_user'@'localhost' IDENTIFIED BY 'secret';
Команда для предоставления доступа будет выглядеть так:
GRANT SELECT ON `test_db`.* TO 'test_user'@'localhost';
FLUSH PRIVILEGES;
Наследование привилегий
В предыдущем примере наш пользователь сможет только читать данные из базы test_db, но передать свои права другому пользователю не сможет. Используя GRANT OPTION, мы можем позволить ему сделать это. Тогда пользователь получит возможность передавать другим то, что разрешено ему самому.
GRANT SELECT, INSERT, UPDATE, DELETE ON `some_db`.* TO 'some_user'@'somehost' WITH GRANT OPTION;
Из соображений безопасности использовать GRANT OPTION небезопасно! В случае компрометации учетной записи злоумышленник сможет не только получить доступ к данным, но и сделать закладку в виде копии учетной записи.
Доступ к таблице
Примеры выше дают доступ ко всей БД. Часто доступ должен быть ограничен строго определенным набором таблиц:
GRANT SELECT ON `test_db`.`table_users` TO 'test_user'@'localhost';
Выполнение команды приведет к ошибке, т.к. этой таблицы еще нет.
CREATE TABLE `test_db`.`table_users` (id INT AUTO_INCREMENT PRIMARY KEY, user_name VARCHAR(16) NOT NULL, password VARCHAR(32));
и повторим предоставление доступа:
GRANT SELECT ON `test_db`.`table_users` TO 'test_user'@'localhost';
Доступ к столбцу
Предоставляется перечислением столбцов:
GRANT SELECT (id, user_name), UPDATE (user_name) ON `test_db`.`table_users` TO 'test_user'@'localhost';
В этом примере пользователю дано право читать идентификатор, читать и менять имя пользователя, а парольный хэш доступен не будет.
Просмотр привилегий пользователей MySQL
Часто возникает задача выяснить полномочия учетной записи или определить, кому дан доступ к базе или таблице. Остановимся на этом подробнее.
Проверка текущих полномочий пользователя
Нам пригодится команда:
SHOW GRANTS FOR 'someuser'@'somehost.somedomain';
SHOW GRANTS FOR 'appuser'@'srv14.example.com';
+--------------------------------------------------------------------------------------------------------------------------------+
| Grants for appuser@srv14.example.com |
+--------------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'appuser'@'srv14.example.com' IDENTIFIED BY PASSWORD '*F4E0A7F0B10264F70558CF07A4ABD4E041182D6E' |
| GRANT SELECT ON `net_database`.* TO 'appuser'@'srv14.example.com' |
+--------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
Проверка полномочий к данным
Через read-only БД information_schema доступно множество метаданных — системной информации. Информация о доступе на БД (схемы), таблицы и столбцы доступны в таблицах schema_privileges, table_privileges и column_privileges. Работа с ними — обычные SQL-запросы:
SELECT * FROM information_schema.schema_privileges;
SELECT * FROM information_schema.table_privileges;
SELECT * FROM information_schema.column_privileges;
SELECT * FROM information_schema.column_privileges WHERE GRANTEE="'test_user'@'localhost'";
MariaDB [information_schema]> select * from information_schema.column_privileges WHERE GRANTEE="'test_user'@'localhost'";
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| GRANTEE | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | PRIVILEGE_TYPE | IS_GRANTABLE |
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
| 'test_user'@'localhost' | def | test_db | table_usr | id | INSERT | NO |
| 'test_user'@'localhost' | def | test_db | table_usr | user_name | UPDATE | NO |
+-------------------------+---------------+--------------+------------+-------------+----------------+--------------+
2 rows in set (0.001 sec)
Просмотр привилегий через системную БД mysql
Аналогичных результатов можно добиться, обратившись к системным таблицам напрямую.
Информация о пользователях:
SELECT * FROM mysql.user;
Привилегии на базы данных:
SELECT * FROM mysql.db;
Права, назначенные на таблицы:
SELECT * FROM mysql.tables_priv;
И на столбцы:
SELECT * FROM mysql.columns_priv;
Просмотр глобальных привилегий
Глобальные полномочия смотрим здесь:
SELECT * FROM information_schema.user_privileges;
Заключение
Полученная информация поможет выполнить базовые операции при работе с пользователями: создание и удаление учетных записей, предоставление и отзыв привилегий, а также просмотр прав доступа.
Всем высоких скоростей, безаварийной работы и долгого аптайма!