1 概述
MySQL用戶和權限管理 遵循最小權限授權法則,保證系統的安全性
本文主要講解關於用戶MySQL用戶和權限管理的相關概念和操作
3 MySQL權限類別
庫級別:對某些庫擁有對應的權限
表級別:對某些表擁有相關權限
字段級別:
管理類:如super
程序類:如調用一個函數,或者執行一個函數
管理類:
CREATE USER:創建用戶賬號
RELOAD:重新載入
LOCK TABLES:鎖定表
REPLICATION CLIENT, REPLICATION SLAVE:複製功能
SHUTDOWN:關閉數據庫服務器
FILE:從文件中加載內容裝入
SHOW DATABASES:查看數據庫
PROCESS :和進程相關
SUPER:不便歸類的其他權限,僅次於root的擁有其他管理功能的用戶
程序類:組合爲12中權限(3*4)
FUNCTION:函數
PROCEDURE:存儲過程
TRIGGER:觸發器
操作:對以上的三個程序類都擁有四個操作CREATE,ALTER,DROP,EXECUTE
庫和表級別:
CREATE,ALTER,DROP:對庫和表創建,修改和刪除
INDEX:索引
CREATE VIEW:創建視圖的語句的權限
SHOW VIEW:查看視圖的權限
GRANT:能夠把自己獲得的權限生成一個副本轉贈給其它用戶;轉贈的權限不能回收,一般不建議授予這個權限
OPTION:其他權限相關的選項
數據操作:
表:
INSERT/DELETE/UPDATE/SELECT
字段:
SELECT(col1,col2,...)
UPDATE(col1,col2,...)
INSERT(col1,col2,...)
注意,delete是整行刪除,因此不能用於刪除字段
所有權限:ALL, ALL PRIVILEGES
元數據數據庫(數據字典):mysql庫,保存了當前系統的相關數據,如當前數據庫上對象的定義
MySQL用戶管理
用戶賬號組成:user@host
user:賬戶名稱;
host:此賬戶可通過哪些客戶端主機請求創建連接線程;
%:任意長度的任意字符;
_:任意單個字符;
mysql默認會將登錄的ip解析成主機名,比如有主機ip爲192.168.1.71的主機名是CentOS7A.sunny.com,那麼在mysql服務器上授權的是[email protected].%的賬號訪問,沒有授權CentOS7A.sunny.com,當mysql服務器沒有關閉名稱解析時,192.168.1.71要遠程連接mysql服務器,會被識別爲賬號[email protected],由於沒有授權[email protected]登錄mysql服務器,因此不能登錄mysql服務器
授權主機名和ip是不等同的,
skip_name_resolve=ON #關閉名稱解析功能
創建用戶:
CREATE USER 'user'@'host' [IDENTIFIED BY [PASSWORD] 'password'] [,'user'@'host' [IDENTIFIED BY [PASSWORD] 'password']...]
重命名:RENAME USER
RENAME USER old_user TO new_user[, old_user TO new_user] ...
刪除用戶:沒有回收站,除非有備份,否則刪掉就不能恢復
DROP USER 'user'@'host' [, 'user'@'host'] ...
讓MySQL重新加載授權表:用update更改數據要手動執行flush
FLUSH PRIVILEGES
授權
db, host, user三個級別的上進行授權
mysql庫中權限相關的表:tables_priv, column_priv, procs_priv, proxies_priv
語法如下
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...ON [object_type] priv_level TO user_specification [, user_specification] ... [REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}] [WITH with_option ...]
相關解釋如下
[REQUIRE {NONE | ssl_option [[AND] ssl_option] ...}]:基於ssl連接
object_type:
TABLE:表
| FUNCTION:函數
| PROCEDURE:過程
priv_level:權限級別
*表示所有庫所有表
| *.*表示所有者的所有表
| db_name.*表示指定庫的所有表
| db_name.tbl_name表示指定庫的指定表
| tbl_name表示所有庫的特定表
| db_name.routine_name:存儲歷程之一
ssl_option:
SSL
| X509 格式的證書
| CIPHER 'cipher':指明加密算法
| ISSUER 'issuer':要求證書頒發者爲指定的頒發者
| SUBJECT 'subject':證書裏的其他信息
with_option:以下數值爲0表示不限制
GRANT OPTION:表示得到的權限可以轉贈
| MAX_QUERIES_PER_HOUR count:一個賬號每小時最多發起多少次的操作
| MAX_UPDATES_PER_HOUR count:一小時內發起更新的次數
| MAX_CONNECTIONS_PER_HOUR count:一小時發起多少次短連接請求
| MAX_USER_CONNECTIONS count:一個賬號可以同時發起多少次的連接。
查看授權:SHOW GRANTS;查看自己的權限
SHOW GRANTS [FOR 'user'@'host']
取消授權:REVOKE
REVOKE priv_type [(column_list)][, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM 'user'@'host' [, 'user'@'host'] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
例子
授權賬號'test'@'192.168.1.%'
MariaDB [sunny]> grant select on sunny.students to 'test'@'192.168.1.%' identified by "Pass1234";
額外授權是追加,直接授權即可,如再增加delete權限
MariaDB [sunny]> grant delete on sunny.students to 'test'@'192.168.1.%' identified by "Pass1234";
授權對應字段擁有相關權限
如授權test賬號對錶sunny.students的字段major擁有update的權限,則針對其他字段就沒有update權限
MariaDB [sunny]> grant update(major) on sunny.students to 'test'@'192.168.1.%' identified by "Pass1234";
回收權限
MariaDB [(none)]> revoke update(major) on sunny.students from 'test'@'192.168.1.%';