Mysql系列 - 第3天:管理員必備技能(必須掌握)


這是mysql系列第3篇文章。

環境:mysql5.7.25,cmd命令中進行演示。

在玩mysql的過程中,經常遇到有很多朋友在雲上面玩mysql的時候,說我創建了一個用戶為什么不能登錄?為什么沒有權限?等等各種問題,本文看完之后,這些都不是問題了。

本文主要內容

  1. 介紹Mysql權限工作原理
  2. 查看所有用戶
  3. 創建用戶
  4. 修改密碼
  5. 給用戶授權
  6. 查看用戶權限
  7. 撤銷用戶權限
  8. 刪除用戶
  9. 授權原則說明
  10. 總結

Mysql權限工作原理

mysql是如何來識別一個用戶的呢?

mysql為了安全性考慮,采用主機名+用戶名來判斷一個用戶的身份,因為在互聯網中很難通過用戶名來判斷一個用戶的身份,但是我們可以通過ip或者主機名判斷一台機器,某個用戶通過這個機器過來的,我們可以識別為一個用戶,所以mysql中采用用戶名+主機名來識別用戶的身份。當一個用戶對mysql發送指令的時候,mysql就是通過用戶名和來源(主機)來斷定用戶的權限。

Mysql權限驗證分為2個階段:

  1. 階段1:連接數據庫,此時mysql會根據你的用戶名及你的來源(ip或者主機名稱)判斷是否有權限連接
  2. 階段2:對mysql服務器發起請求操作,如create table、select、delete、update、create index等操作,此時mysql會判斷你是否有權限操作這些指令

權限生效時間

用戶及權限信息放在庫名為mysql的庫中,mysql啟動時,這些內容被讀進內存並且從此時生效,所以如果通過直接操作這些表來修改用戶及權限信息的,需要重啟mysql或者執行flush privileges;才可以生效。

用戶登錄之后,mysql會和當前用戶之間創建一個連接,此時用戶相關的權限信息都保存在這個連接中,存放在內存中,此時如果有其他地方修改了當前用戶的權限,這些變更的權限會在下一次登錄時才會生效。

查看mysql中所有用戶

用戶信息在mysql.user表中,如下:

mysql> use mysql;
Database changed
mysql> select user,host from user;
+---------------+--------------+
| user          | host         |
+---------------+--------------+
| test4         | 127.0.0.%    |
| test4         | 192.168.11.% |
| mysql.session | localhost    |
| mysql.sys     | localhost    |
| root          | localhost    |
| test2         | localhost    |
+---------------+--------------+
6 rows in set (0.00 sec)

創建用戶

語法:

create user 用戶名[@主機名] [identified by '密碼'];

說明:

  1. 主機名默認值為%,表示這個用戶可以從任何主機連接mysql服務器
  2. 密碼可以省略,表示無密碼登錄

示例1:不指定主機名

不指定主機名時,表示這個用戶可以從任何主機連接mysql服務器

mysql> use mysql;
Database changed

mysql> select user,host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
3 rows in set (0.00 sec)

mysql> create user test1;
Query OK, 0 rows affected (0.00 sec)

mysql> select user,host from user;
+---------------+-----------+
| user          | host      |
+---------------+-----------+
| test1         | %         |
| mysql.session | localhost |
| mysql.sys     | localhost |
| root          | localhost |
+---------------+-----------+
4 rows in set (0.00 sec)
    
mysql> exit
Bye

C:\Users\Think>mysql -utest1
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 49
Server version: 5.7.25-log MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

上面創建了用戶名為test1無密碼的用戶,沒有指定主機,可以看出host的默認值為%,表示test1可以從任何機器登錄到mysql中。

用戶創建之后可以在mysql庫中通過 select user,host from user;查看到。

其他示例

create user 'test2'@'localhost' identified by '123';

說明:test2的主機為localhost表示本機,此用戶只能登陸本機的mysql

create user 'test3'@% identified by '123';

說明:test3可以從任何機器連接到mysql服務器

create user 'test4'@'192.168.11.%' identified by '123';

說明:test4可以從192.168.11段的機器連接mysql

修改密碼【3種方式】

方式1:通過管理員修改密碼

SET PASSWORD FOR '用戶名'@'主機' = PASSWORD('密碼');

方式2:create user 用戶名[@主機名] [identified by '密碼'];

set password = password('密碼');

方式3:通過修改mysql.user表修改密碼

use mysql;
update user set authentication_string = password('321') where user = 'test1' and host = '%';
flush privileges;

注意:

通過表的方式修改之后,需要執行flush privileges;才能對用戶生效。

5.7中user表中的authentication_string字段表示密碼,老的一些版本中密碼字段是password。

給用戶授權

創建用戶之后,需要給用戶授權,才有意義。

語法:

grant privileges ON database.table TO 'username'[@'host'] [with grant option]

grant命令說明:

  • priveleges (權限列表),可以是all,表示所有權限,也可以是select、update等權限,多個權限之間用逗號分開。
  • ON 用來指定權限針對哪些庫和表,格式為數據庫.表名 ,點號前面用來指定數據庫名,點號后面用來指定表名,*.* 表示所有數據庫所有表。
  • TO 表示將權限賦予某個用戶, 格式為username@host,@前面為用戶名,@后面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。
  • WITH GRANT OPTION 這個選項表示該用戶可以將自己擁有的權限授權給別人。注意:經常有人在創建操作用戶的時候不指定WITH GRANT OPTION選項導致后來該用戶不能使用GRANT命令創建用戶或者給其它用戶授權。
    備注:可以使用GRANT重復給用戶添加權限,權限疊加,比如你先給用戶添加一個select權限,然后又給用戶添加一個insert權限,那么該用戶就同時擁有了select和insert權限。

示例:

grant all on *.* to 'test1'@‘%’;

說明:給test1授權可以操作所有庫所有權限,相當於dba

grant select on seata.* to 'test1'@'%';

說明:test1可以對seata庫中所有的表執行select

grant select,update on seata.* to 'test1'@'%';

說明:test1可以對seata庫中所有的表執行select、update

grant select(user,host) on mysql.user to 'test1'@'localhost';

說明:test1用戶只能查詢mysql.user表的user,host字段

查看用戶有哪些權限

show grants for '用戶名'[@'主機']

主機可以省略,默認值為%,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost                                         |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                          |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

show grants;

查看當前用戶的權限,如:

mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT ALL PRIVILEGES ON `test`.* TO 'root'@'localhost'              |
| GRANT DELETE ON `seata`.* TO 'root'@'localhost'                     |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
4 rows in set (0.00 sec)

撤銷用戶的權限

語法

revoke privileges ON database.table FROM '用戶名'[@'主機'];

可以先通過show grants命令查詢一下用戶對於的權限,然后使用revoke命令撤銷用戶對應的權限,示例:

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------------+
| Grants for test1@localhost                                         |
+--------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                          |
| GRANT SELECT (host, user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> revoke select(host) on mysql.user from test1@localhost;
Query OK, 0 rows affected (0.00 sec)

mysql> show grants for 'test1'@'localhost';
+--------------------------------------------------------------+
| Grants for test1@localhost                                   |
+--------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test1'@'localhost'                    |
| GRANT SELECT (user) ON `mysql`.`user` TO 'test1'@'localhost' |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

上面我們先通過grants命令查看test1的權限,然后調用revoke命令撤銷對mysql.userhost字段的查詢權限,最后又通過grants命令查看了test1的權限,和預期結果一致。

刪除用戶【2種方式】

方式1:

drop user '用戶名'[@‘主機’],示例:

mysql> drop user test1@localhost;
Query OK, 0 rows affected (0.00 sec)

drop的方式刪除用戶之后,用戶下次登錄就會起效。

方式2:

通過刪除mysql.user表數據的方式刪除,如下:

delete from user where user='用戶名' and host='主機';
flush privileges;

注意通過表的方式刪除的,需要調用flush privileges;刷新權限信息(權限啟動的時候在內存中保存着,通過表的方式修改之后需要刷新一下)。

授權原則說明

  • 只授予能滿足需要的最小權限,防止用戶干壞事,比如用戶只是需要查詢,那就只給select權限就可以了,不要給用戶賦予update、insert或者delete權限
  • 創建用戶的時候限制用戶的登錄主機,一般是限制成指定IP或者內網IP段
  • 初始化數據庫的時候刪除沒有密碼的用戶,安裝完數據庫的時候會自動創建一些用戶,這些用戶默認沒有密碼
  • 為每個用戶設置滿足密碼復雜度的密碼
  • 定期清理不需要的用戶,回收權限或者刪除用戶

總結

  1. 通過命令的方式操作用戶和權限不需要刷新,下次登錄自動生效
  2. 通過操作mysql庫中表的方式修改、用戶信息,需要調用flush privileges;刷新一下,下次登錄自動生效
  3. mysql識別用戶身份的方式是:用戶名+主機
  4. 本文中講到的一些指令中帶主機的,主機都可以省略,默認值為%,表示所有機器
  5. mysql中用戶和權限的信息在庫名為mysql的庫中

Mysql系列目錄

  1. 第1天:mysql基礎知識
  2. 第2天:詳解mysql數據類型(重點)

mysql系列大概有20多篇,喜歡的請關注一下!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM