MySQL許可權管理

DB哥發表於2024-05-26

一、MySQL許可權簡介

關於mysql的許可權簡單的理解就是mysql允許你做你全力以內的事情,不可以越界。比如只允許你執行select操作,那麼你就不能執行update操作。只允許你從某臺機器上連線mysql,那麼你就不能從除那臺機器以外的其他機器連線mysql。MySQL高階教程:http://cainiao.guashuw.com/

那麼Mysql的許可權是如何實現的呢?這就要說到mysql的兩階段驗證,下面詳細介紹:第一階段:伺服器首先會檢查你是否允許連線。因為建立使用者的時候會加上主機限制,可以限制成本地、某個IP、某個IP段、以及任何地方等,只允許你從配置的指定地方登陸。第二階段:如果你能連線,Mysql會檢查你發出的每個請求,看你是否有足夠的許可權實施它。比如你要更新某個表、或者查詢某個表,Mysql會檢視你對哪個表或者某個列是否有許可權。再比如,你要執行某個儲存過程,Mysql會檢查你對儲存過程是否有執行許可權等。

MYSQL到底都有哪些許可權呢?從官網複製一個表來看看:

許可權

許可權級別

許可權說明

CREATE

資料庫、表或索引

建立資料庫、表或索引許可權

DROP

資料庫或表

刪除資料庫或表許可權

GRANT OPTION

資料庫、表或儲存的程式

賦予許可權選項

REFERENCES

資料庫或表

ALTER

更改表,比如新增欄位、索引等

DELETE

刪除資料許可權

INDEX

索引許可權

INSERT

插入許可權

SELECT

查詢許可權

UPDATE

更新許可權

CREATE VIEW

檢視

建立檢視許可權

SHOW VIEW

檢視

檢視檢視許可權

ALTER ROUTINE

儲存過程

更改儲存過程許可權

CREATE ROUTINE

儲存過程

建立儲存過程許可權

EXECUTE

儲存過程

執行儲存過程許可權

FILE

伺服器主機上的檔案訪問

檔案訪問許可權

CREATE TEMPORARY TABLES

伺服器管理

建立臨時表許可權

LOCK TABLES

伺服器管理

鎖表許可權

CREATE USER

伺服器管理

建立使用者許可權

PROCESS

伺服器管理

檢視程序許可權

RELOAD

伺服器管理

執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的許可權

REPLICATION CLIENT

伺服器管理

複製許可權

REPLICATION SLAVE

伺服器管理

複製許可權

SHOW DATABASES

伺服器管理

檢視資料庫許可權

SHUTDOWN

伺服器管理

關閉資料庫許可權

SUPER

伺服器管理

執行kill執行緒許可權

MYSQL的許可權如何分佈,就是針對表可以設定什麼許可權,針對列可以設定什麼許可權等等,這個可以從官方文件中的一個表來說明:

許可權分佈

可能的設定的許可權

表許可權

'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'

列許可權

'Select', 'Insert', 'Update', 'References'

過程許可權

'Execute', 'Alter Routine', 'Grant'

二、MySQL許可權經驗原則:

許可權控制主要是出於安全因素,因此需要遵循一下幾個經驗原則:

1、只授予能滿足需要的最小許可權,防止使用者幹壞事。比如使用者只是需要查詢,那就只給select許可權就可以了,不要給使用者賦予update、insert或者delete許可權。

2、建立使用者的時候限制使用者的登入主機,一般是限制成指定IP或者內網IP段。

3、初始化資料庫的時候刪除沒有密碼的使用者。安裝完資料庫的時候會自動建立一些使用者,這些使用者預設沒有密碼。

4、為每個使用者設定滿足密碼複雜度的密碼。

5、定期清理不需要的使用者。回收許可權或者刪除使用者。

三、MySQL許可權實戰:

1、GRANT命令使用說明:

先來看一個例子,建立一個只允許從本地登入的超級使用者jack,並允許將許可權賦予別的使用者,密碼為:jack.

mysql> grant all privileges on *.* to jack@'localhost' identified by "jack" with grant option;
Query OK, 0 rows affected (0.01 sec)

GRANT命令說明:
ALL PRIVILEGES 是表示所有許可權,你也可以使用select、update等許可權。

ON 用來指定許可權針對哪些庫和表。

*.* 中前面的*號用來指定資料庫名,後面的*號用來指定表名。

TO 表示將許可權賦予某個使用者。

jack@'localhost' 表示jack使用者,@後面接限制的主機,可以是IP、IP段、域名以及%,%表示任何地方。注意:這裡%有的版本不包括本地,以前碰到過給某個使用者設定了%允許任何地方登入,但是在本地登入不了,這個和版本有關係,遇到這個問題再加一個localhost的使用者就可以了。

IDENTIFIED BY 指定使用者的登入密碼。

WITH GRANT OPTION 這個選項表示該使用者可以將自己擁有的許可權授權給別人。注意:經常有人在建立操作使用者的時候不指定WITH GRANT OPTION選項導致後來該使用者不能使用GRANT命令建立使用者或者給其它使用者授權。

備註:可以使用GRANT重複給使用者新增許可權,許可權疊加,比如你先給使用者新增一個select許可權,然後又給使用者新增一個insert許可權,那麼該使用者就同時擁有了select和insert許可權。

2、重新整理許可權

使用這個命令使許可權生效,尤其是你對那些許可權表user、db、host等做了update或者delete更新的時候。以前遇到過使用grant後許可權沒有更新的情況,只要對許可權做了更改就使用FLUSH PRIVILEGES命令來重新整理許可權。

mysql> flush privileges;
Query OK, 0 rows affected (0.01 sec)

3、檢視許可權

複製程式碼
檢視當前使用者的許可權:
mysql> show grants;
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
+---------------------------------------------------------------------+
2 rows in set (0.00 sec)

檢視某個使用者的許可權:
mysql> show grants for 'jack'@'%';
+-----------------------------------------------------------------------------------------------------+
| Grants for jack@%                                                                                   |
+-----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'jack'@'%' IDENTIFIED BY PASSWORD '*9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0' |
+-----------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
複製程式碼

4、回收許可權

mysql> revoke delete on *.* from 'jack'@'localhost';
Query OK, 0 rows affected (0.01 sec)

5、刪除使用者

複製程式碼
mysql> select host,user,password from user;
+-----------+------+-------------------------------------------+
| host      | user | password                                  |
+-----------+------+-------------------------------------------+
| localhost | root |                                           |
| rhel5.4   | root |                                           |
| 127.0.0.1 | root |                                           |
| ::1       | root |                                           |
| localhost |      |                                           |
| rhel5.4   |      |                                           |
| localhost | jack | *9BCDC990E611B8D852EFAF1E3919AB6AC8C8A9F0 |
+-----------+------+-------------------------------------------+
7 rows in set (0.00 sec)

mysql> drop user 'jack'@'localhost';
Query OK, 0 rows affected (0.01 sec)
複製程式碼

6、對賬戶重新命名

mysql> rename user 'jack'@'%' to 'jim'@'%';
Query OK, 0 rows affected (0.00 sec)

7、修改密碼

複製程式碼
  1、用set password命令
mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('123456');
Query OK, 0 rows affected (0.00 sec)
  2、用mysqladmin
  [root@rhel5 ~]# mysqladmin -uroot -p123456 password 1234abcd
  備註:
  格式:mysqladmin -u使用者名稱 -p舊密碼 password 新密碼
  3、用update直接編輯user表
  mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set PASSWORD = PASSWORD('1234abcd') where user = 'root';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
  4、在丟失root密碼的時候:
  [root@rhel5 ~]# mysqld_safe --skip-grant-tables &
[1] 15953
[root@rhel5 ~]# 130911 09:35:33 mysqld_safe Logging to '/mysql/mysql5.5/data/rhel5.4.err'.
130911 09:35:33 mysqld_safe Starting mysqld daemon with databases from /mysql/mysql5.5/data

[root@rhel5 ~]# mysql -u root
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.5.22 Source distribution

Copyright (c) 2000, 2011, 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.

mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.5.22, for Linux (i686) using  EditLine wrapper

Connection id:        2
Current database:    
Current user:        root@
SSL:            Not in use
Current pager:        stdout
Using outfile:        ''
Using delimiter:    ;
Server version:        5.5.22 Source distribution
Protocol version:    10
Connection:        Localhost via UNIX socket
Server characterset:    utf8
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
UNIX socket:        /tmp/mysql.sock
Uptime:            36 sec

Threads: 1  Questions: 5  Slow queries: 0  Opens: 23  Flush tables: 1  Open tables: 18  Queries per second avg: 0.138
--------------

mysql> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> update user set password = PASSWORD('123456') where user = 'root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

相關文章