安裝Mysql時會自動安裝一個名為mysql的資料庫。這個資料庫下面儲存的是許可權表。
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| mysql |
| test |
+--------------------+
Mysql會根據這些許可權表的內容為每個使用者賦予相應的許可權
所以我們也是通過這些表來實現管理使用者和許可權的
use mysql; show tables; +---------------------------+ | Tables_in_mysql | +---------------------------+ | columns_priv | | db | | event | | func | | general_log | | help_category | | help_keyword | | help_relation | | help_topic |
| host | | innodb_index_stats | | innodb_table_stats | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+
user表
1. user表的作用相當與mysql工作流程中的"使用者管理模組",它決定著我們對一個連線允許或拒絕
2. user表用於記錄允許連線到伺服器的使用者帳號資訊,裡面的對於資料庫的許可權是全域性生效的
3. 根據user表結構,表的欄位可以分為4類
(1) 使用者列
- Host 主機名 ——>如果想要從別的機器來登入資料庫,Host可以設成 %
- User 使用者名稱
- Password 密碼
使用者登入時,首先要判斷這三個欄位是否匹配,匹配則允許登入;
使用者建立時,也是設定這三個欄位的值;
修改使用者密碼時,實際也是修改了user表的Password欄位的值。
(2) 許可權列(以priv結尾的)
- Grant_priv 是否有Grant許可權
- Shutdown_priv 是否有停止mysql服務的許可權
- Super_priv 是否有超級許可權
- Execute_priv 是否有執行儲存過程和函式的許可權
包含普通許可權:查詢許可權、修改許可權等 運算元據庫的動作;
包含高階管理許可權:關閉服務許可權、超級許可權、載入使用者等 管理資料庫的動作;
這些欄位只有N和Y兩個選項,為安全起見預設值都設為N;
對這些許可權的管理可以使用GRANT語句、也可以通過UPDATE user表的這些列來實現。
(3) 安全列
ssl用於加密,不過一般的發行版本並不支援ssl
mysql> show variables LIKE'have_openssl'; +---------------+----------+ | Variable_name | Value | +---------------+----------+ | have_openssl | DISABLED | ——>DISABLED表示沒有支援ssl加密功能 +---------------+----------+ 1 row in set (0.03 sec)x509標準可以用來標識使用者
(4) 資源控制列
- max_questions 每小時允許執行多少次查詢
- max_updates 每小時允許執行多少次更新
- max_connections 每小時允許建立多少連線
- max_user_connections 單個使用者可以同時具有的連線數
這些欄位預設值為0,表示沒有限制
desc user; +------------------------+-----------------------------------+------+-----+---- | Field | Type | Null | Key | Default | Extra | +------------------------+-----------------------------------+------+-----+--- | Host | char(60) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Password | char(41) | NO | | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Reload_priv | enum('N','Y') | NO | | N | | | Shutdown_priv | enum('N','Y') | NO | | N | | | Process_priv | enum('N','Y') | NO | | N | | | File_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Show_db_priv | enum('N','Y') | NO | | N | | | Super_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Repl_slave_priv | enum('N','Y') | NO | | N | | | Repl_client_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Create_user_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | | Create_tablespace_priv | enum('N','Y') | NO | | N | | | ssl_type | enum('','ANY','X509','SPECIFIED') | NO | | | ssl_cipher | blob | NO | | NULL | | | x509_issuer | blob | NO | | NULL | | | x509_subject | blob | NO | | NULL | | | max_questions | int(11) unsigned | NO | | 0 | | | max_updates | int(11) unsigned | NO | | 0 | | | max_connections | int(11) unsigned | NO | | 0 | | | max_user_connections | int(11) unsigned | NO | | 0 | | | plugin | char(64) | YES | | mysql_native_password | | | authentication_string | text | YES | | NULL | | | password_expired | enum('N','Y') | NO | | N | | +------------------------+-----------------------------------+------+-----+----------------
db表
1. 使用者被允許連線了,但是是不是可以就能操作所有資料庫了呢?
2. 所以我們需要db表/host表,用來規定某一個使用者對一個資料庫的許可權
3. db表的欄位分為兩類:
(1)使用者列
- Host 主機名
- Db 資料庫名
- User 使用者名稱
(2)許可權列
使用者是先根據user表的內容獲得許可權,再根據db表的內容獲取許可權
例如,user表中某使用者的Select_priv欄位為‘N’,表示所有資料庫中的表它都無權查詢
但db表中這一使用者對student表的Select_priv欄位設為了‘Y’,表示它只有查詢student表的許可權
desc db; +-----------------------+---------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-----------------------+---------------+------+-----+---------+-------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Select_priv | enum('N','Y') | NO | | N | | | Insert_priv | enum('N','Y') | NO | | N | | | Update_priv | enum('N','Y') | NO | | N | | | Delete_priv | enum('N','Y') | NO | | N | | | Create_priv | enum('N','Y') | NO | | N | | | Drop_priv | enum('N','Y') | NO | | N | | | Grant_priv | enum('N','Y') | NO | | N | | | References_priv | enum('N','Y') | NO | | N | | | Index_priv | enum('N','Y') | NO | | N | | | Alter_priv | enum('N','Y') | NO | | N | | | Create_tmp_table_priv | enum('N','Y') | NO | | N | | | Lock_tables_priv | enum('N','Y') | NO | | N | | | Create_view_priv | enum('N','Y') | NO | | N | | | Show_view_priv | enum('N','Y') | NO | | N | | | Create_routine_priv | enum('N','Y') | NO | | N | | | Alter_routine_priv | enum('N','Y') | NO | | N | | | Execute_priv | enum('N','Y') | NO | | N | | | Event_priv | enum('N','Y') | NO | | N | | | Trigger_priv | enum('N','Y') | NO | | N | | +-----------------------+---------------+------+-----+---------+-------+
tables_priv表和columns_priv表
1. 同理,即便使用者有權對某一資料庫操作,那麼是不是對所有表都可以操作?對錶中的所有記錄都可以操作?
2. tables_priv表用來對單個表進行許可權設定
3. columns_priv表用來對單條記錄(列)進行許可權設定
4. 其包含的欄位主要有:
- Host 主機名
- Db 資料庫名
- User 使用者名稱
- Table_name 表名
- column_name 表示可以對哪些資料列進行操作
- Table_priv 對錶進行操作的許可權(select,insert,update,delete,create,drop,grant,references,index,alter)
- Column_priv 對記錄進行操作的許可權(select,insert,update,references)
- Timestamp 修改許可權的時間
- Grantor 許可權的設定者
mysql> desc tables_priv;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Grantor | char(77) | NO | MUL | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO | | | |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.01 sec)
mysql> desc columns_priv;
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Host | char(60) | NO | PRI | | |
| Db | char(64) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Table_name | char(64) | NO | PRI | | |
| Column_name | char(64) | NO | PRI | | |
| Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO | | | |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.00 sec)
procs_priv表
1. 對儲存過程和儲存函式進行許可權設定
2. 主要欄位:
- Host 主機名
- Db 資料庫名
- User 使用者名稱
- Routine_name 儲存過程/儲存函式的名字
- Routine_type 標識它是FUNCTION(儲存函式)還是PROCEDURE(儲存過程)
- Proc_priv 擁有的許可權(Execute、Alter Routine、Grant)
- Timestamp 更新的時間
- Grantor 許可權是誰設定的
mysql> desc procs_priv; +--------------+----------------------------------------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +--------------+----------------------------------------+------+-----+-------------------+-----------------------------+ | Host | char(60) | NO | PRI | | | | Db | char(64) | NO | PRI | | | | User | char(16) | NO | PRI | | | | Routine_name | char(64) | NO | PRI | | | | Routine_type | enum('FUNCTION','PROCEDURE') | NO | PRI | NULL | | | Grantor | char(77) | NO | MUL | | | | Proc_priv | set('Execute','Alter Routine','Grant') | NO | | | | | Timestamp | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +--------------+----------------------------------------+------+-----+-------------------+-----------------------------+ 8 rows in set (0.00 sec)
使用者的許可權分配規則
(1)Mysql的許可權分配是按照user表--->db表--->tables_priv表--->columns_priv表的順序進行分配的
(2)如果user表中某一許可權的值為Y,就不需要檢查往後的表了
(3)如果user表中某一許可權的值為N,則依次往後檢查每一張表
Mysql的各種許可權
許可權管理操作
1. 授權
Methods-1
> grant [許可權list] ——> 參考上表
on [datebase-name.table-name]
to ['username'@'hostname']
identified by ['password'] ——> 如果是新建立的使用者可以設定密碼
with [options]; ——> with關鍵字之後有5個可選項
options:
grant option:表示被授權的使用者可以將這些許可權賦予給別的使用者
max_queries_per_hour [count]:設定每小時可以允許執行count次查詢
max_updates_per_hour [count]:設定每小時可以允許執行count次更新
max_connections_per_hour [count]:設定每小時可以建立count連線
max_user_connections [count]:設定單個使用者可以同時具有的count個連線數
Methods-2 授予一個使用者全部許可權
> grant all privileges on [database-name.table-name] to 'username'@'hostname' with grant option;
2. 檢視許可權
Methods-1
> show grants for 'hostname'@'hostname' \G
Methods-2
> select * from mysql.user where User='username' and Host='hostname' \G
3. 取消許可權
> revoke [許可權list]
on [datebase-name.table.name]
from ['username'@'hostname'];
取消全部許可權:
> revoke all privileges,grant option
from 'username'@'hostname';
4. 重新整理(載入)許可權
> flush privileges;