当前位置:网站首页>MySQL21-用戶與權限管理
MySQL21-用戶與權限管理
2022-07-06 10:37:00 【保護我方阿遙】
一 . 用戶管理
1.1. 登錄MySQL服務器
啟動MySQL服務後,可以通過mysql命令來登錄MySQL服務器,命令如下:
mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL語句"
下面詳細介紹命令中的參數:
- -h參數 後面接主機名或者主機IP,hostname為主機,hostIP為主機IP。
- -P參數 後面接MySQL服務的端口,通過該參數連接到指定的端口。MySQL服務的默認端口是3306,不使用該參數時自動連接到3306端口,port為連接的端口號。
- -u參數 後面接用戶名,username為用戶名。
- -p參數 會提示輸入密碼。
- DatabaseName參數 指明登錄到哪一個數據庫中。如果沒有該參數,就會直接登錄到MySQL數據庫中,然後可以使用USE命令來選擇數據庫。
- -e參數 後面可以直接加SQL語句。登錄MySQL服務器以後即可執行這個SQL語句,然後退出MySQL服務器。
mysql -uroot -p -hlocalhost -P3306 mysql -e 'select user,host from user'
1.2. 創建用戶
CREATE USER語句的基本語法形式如下:
CREATE USER 用戶名 [IDENTIFIED BY '密碼'][,用戶名 [IDENTIFIED BY '密碼']];
- 用戶名參數錶示新建用戶的賬戶,由 用戶(User) 和 主機名(Host) 構成;
- “[ ]”錶示可選,也就是說,可以指定用戶登錄時需要密碼驗證,也可以不指定密碼驗證,這樣用戶可以直接登錄。不過,不指定密碼的方式不安全,不推薦使用。如果指定密碼值,這裏需要使用IDENTIFIED BY指定明文密碼值。
- CREATE USER語句可以同時創建多個用戶。
create user 'zhang3' identified by '123456';# 默認host是 %
create user 'kangshifu'@'localhost' identified by '123456';
1.3. 修改用戶
修改用戶名:
update mysql.user set user=li4 where user='kangshifu';
flush privileges;
1.4. 删除用戶
方式1:使用DROP方式删除(推薦)
使用DROP USER語句來删除用戶時,必須用於DROP USER權限。DROP USER語句的基本語法形式如下:
DROP USER user[,user]...;
舉例:
DROP USER li4 ; # 默認删除host為%的用戶
DROP USER 'kangshifu'@'localhost';
方式2:使用DELETE方式删除
DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;
執行完DELETE命令後要使用FLUSH命令來使用戶生效,命令如下:
FLUSH PRIVILEGES;
注意:不推薦通過 DELETE FROM USER u WHERE USER=‘li4’ 進行删除,系統會有殘留信息保留。而drop user命令會删除用戶以及對應的權限,執行命令後你會發現mysql.user錶和mysql.db錶的相應記錄都消失了。
1.5. 設置當前用戶密碼
舊的寫法如下 :
# 修改當前用戶的密碼:(MySQL5.7測試有效)
SET PASSWORD = PASSWORD('123456');
這裏介紹 推薦的寫法 :
- 使用ALTER USER命令來修改當前用戶密碼 用戶可以使用ALTER命令來修改自身密碼,如下語句代錶修改當前登錄用戶的密碼。基本語法如下:
ALTER USER USER() IDENTIFIED BY 'new_password';
- 使用SET語句來修改當前用戶密碼 使用root用戶登錄MySQL後,可以使用SET語句來修改密碼,具體SQL語句如下:
SET PASSWORD='new_password';
該語句會自動將密碼加密後再賦給當前用戶。
1.6. 修改其它用戶密碼
- 使用ALTER語句來修改普通用戶的密碼 可以使用ALTER USER語句來修改普通用戶的密碼。基本語法形式如下:
ALTER USER user [IDENTIFIED BY '新密碼']
[,user[IDENTIFIED BY '新密碼']]...;
- 使用SET命令來修改普通用戶的密碼 使用root用戶登錄到MySQL服務器後,可以使用SET語句來修改普通用戶的密碼。SET語句的代碼如下:
SET PASSWORD FOR 'username'@'hostname'='new_password';
- 使用UPDATE語句修改普通用戶的密碼(不推薦)
UPDATE MySQL.user SET authentication_string=PASSWORD("123456")
WHERE User = "username" AND Host = "hostname";
1.7. MySQL8密碼管理(了解)
1.7.1. 密碼過期策略
- 在MySQL中,數據庫管理員可以 手動設置 賬號密碼過期,也可以建立一個 自動 密碼過期策略。
- 過期策略可以是 全局的 ,也可以為 每個賬號 設置單獨的過期策略。
ALTER USER user PASSWORD EXPIRE;
alter user 'zhang3' password expire;
- 方式①:使用SQL語句更改該變量的值並持久化
set persist default_password_lifetime =360; # 建立全局策略,設置密碼每隔180天過期
- 方式②:配置文件my.cnf中進行維護
mysqld]
default_password_lifetime=180 #建立全局策略,設置密碼每隔180天過期
- 手動設置指定時間過期方式2:單獨設置
每個賬號既可延用全局密碼過期策略,也可單獨設置策略。在 CREATE USER 和 ALTER USER 語句上加入 PASSWORD EXPIRE 選項可實現單獨設置策略。下面是一些語句示例。
#設置kangshifu賬號密碼每90天過期:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE INTERVAL 90 DAY;
#設置密碼永不過期:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE NEVER;
#延用全局密碼過期策略:
CREATE USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT;
ALTER USER 'kangshifu'@'localhost' PASSWORD EXPIRE DEFAULT
1.7.2. 密碼重用策略
- 手動設置密碼重用方式1:全局
方式①:使用SQL
SET PERSIST password_history = 6; #設置不能選擇最近使用過的6個密碼
SET PERSIST password_reuse_interval = 365; #設置不能選擇最近一年內的密碼
方式②:my.cnf配置文件
[mysqld]
password_history=6
password_reuse_interval=365
- 手動設置密碼重用方式2:單獨設置
#不能使用最近5個密碼:
CREATE USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
ALTER USER 'kangshifu'@'localhost' PASSWORD HISTORY 5;
#不能使用最近365天內的密碼:
CREATE USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'kangshifu'@'localhost' PASSWORD REUSE INTERVAL 365 DAY;
#既不能使用最近5個密碼,也不能使用365天內的密碼
CREATE USER 'kangshifu'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;
ALTER USER 'kangshifu'@'localhost'
PASSWORD HISTORY 5
PASSWORD REUSE INTERVAL 365 DAY;
二. 權限管理
2.1. 權限列錶
MySQL到底都有哪些權限呢?
show privileges;
- CREATE和DROP權限 ,可以創建新的數據庫和錶,或删除(移掉)已有的數據庫和錶。如果將MySQL數據庫中的DROP權限授予某用戶,用戶就可以删除MySQL訪問權限保存的數據庫。
- SELECT、INSERT、UPDATE和DELETE權限 允許在一個數據庫現有的錶上實施操作。
- SELECT權限只有在它們真正從一個錶中檢索行時才被用到。
- INDEX權限 允許創建或删除索引,INDEX適用於已有的錶。如果具有某個錶的CREATE權限,就可以在CREATE TABLE語句中包括索引定義。
- ALTER權限 可以使用ALTER TABLE來更改錶的結構和重新命名錶。
- CREATE ROUTINE權限 用來創建保存的程序(函數和程序),ALTER ROUTINE權限用來更改和删除保存的程序, EXECUTE權限 用來執行保存的程序。
- GRANT權限 允許授權給其他用戶,可用於數據庫、錶和保存的程序。
- FILE權限 使用戶可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE語句讀或寫服務器上的文件,任何被授予FILE權限的用戶都能讀或寫MySQL服務器上的任何文件(說明用戶可以讀任何數據庫目錄下的文件,因為服務器可以訪問這些文件)。
2.2. 授予權限的原則
權限控制主要是出於安全因素,因此需要遵循以下幾個 經驗原則 :
- 只授予能 滿足需要的最小權限 ,防止用戶幹壞事。比如用戶只是需要查詢,那就只給select權限就可以了,不要給用戶賦予update、insert或者delete權限。
- 創建用戶的時候 限制用戶的登錄主機 ,一般是限制成指定IP或者內網IP段。
- 為每個用戶 設置滿足密碼複雜度的密碼 。
- 定期清理不需要的用戶 ,回收權限或者删除用戶。
2.3. 授予權限
給用戶授權的方式有 2 種,分別是通過把 角色賦予用戶給用戶授權 和 直接給用戶授權 。用戶是數據庫的使用者,我們可以通過給用戶授予訪問數據庫中資源的權限,來控制使用者對數據庫的訪問,消除安全隱患。
授權命令:
GRANT 權限1,權限2,...權限n ON 數據庫名稱.錶名稱 TO 用戶名@用戶地址 [IDENTIFIED BY ‘密碼口令’];
該權限如果發現沒有該用戶,則會直接新建一個用戶。
比如:
給zhang3用戶用本地命令行方式,授予MYSQLTEST這個庫下的所有錶的插删改查的權限。
GRANT SELECT,INSERT,DELETE,UPDATE ON MYSQLTEST.* TO zhang3;
授予通過網絡方式登錄的joe用戶 ,對所有庫所有錶的全部權限,密碼設為123。注意這裏唯獨不包括grant的權限
GRANT ALL PRIVILEGES ON *.* TO [email protected]'%' IDENTIFIED BY '123456';
我們在開發應用的時候,經常會遇到一種需求,就是要根據用戶的不同,對數據進行橫向和縱向的分組。
- 所謂橫向的分組,就是指用戶可以接觸到的數據的範圍,比如可以看到哪些錶的數據;
- 所謂縱向的分組,就是指用戶對接觸到的數據能訪問到什麼程度,比如能看、能改,甚至是删除。
2.4. 查看權限
- 查看當前用戶權限
SHOW GRANTS;
# 或
SHOW GRANTS FOR CURRENT_USER;
# 或
SHOW GRANTS FOR CURRENT_USER();
- 查看某用戶的全局權限
SHOW GRANTS FOR 'user'@'主機地址' ;
2.5. 收回權限
收回權限就是取消已經賦予用戶的某些權限。收回用戶不必要的權限可以在一定程度上保證系統的安全性。MySQL中使用 REVOKE語句 取消用戶的某些權限。使用REVOKE收回權限之後,用戶賬戶的記錄將從db、host、tables_priv和columns_priv錶中删除,但是用戶賬戶記錄仍然在user錶中保存(删除user錶中的賬戶記錄使用DROP USER語句)。
注意:在將用戶賬戶從user錶删除之前,應該收回相應用戶的所有權限。
- 收回權限命令:
REVOKE 權限1,權限2,...權限n ON 數據庫名稱.錶名稱 FROM 用戶名@用戶地址;
- 舉例
#收回全庫全錶的所有權限
REVOKE ALL PRIVILEGES ON *.* FROM [email protected]'%';
#收回mysql庫下的所有錶的插删改查權限
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM [email protected];
注意: 須用戶重新登錄後才能生效
三. 權限錶
3.1. user錶
user錶是MySQL中最重要的一個權限錶, 記錄用戶賬號和權限信息 ,有49個字段。如下圖:
這些字段可以分成4類,分別是範圍列(或用戶列)、權限列、安全列和資源控制列。
3.1. 1. 範圍列(或用戶列)
- host : 錶示連接類型
- % 錶示所有遠程通過 TCP方式的連接。
- IP 地址 如 (192.168.1.2、127.0.0.1) 通過制定ip地址進行的TCP方式的連接。
- 機器名 通過制定網絡中的機器名進行的TCP方式的連接。
- ::1 IPv6的本地ip地址,等同於IPv4的 127.0.0.1
- localhost 本地方式通過命令行方式的連接 ,比如mysql -u xxx -p xxx 方式的連接。
- user : 錶示用戶名,同一用戶通過不同方式鏈接的權限是不一樣的。
- password : 密碼
- 所有密碼串通過 password(明文字符串) 生成的密文字符串。MySQL 8.0 在用戶管理方面增加了角色管理,默認的密碼加密方式也做了調整,由之前的 SHA1 改為了 SHA2 ,不可逆 。同時加上 MySQL 5.7 的禁用用戶和用戶過期的功能,MySQL 在用戶管理方面的功能和安全性都較之前版本大大的增强了。
- mysql 5.7 及之後版本的密碼保存到 authentication_string 字段中不再使用password 字段。
3.1.2. 權限列
- Grant_priv字段:錶示是否擁有GRANT權限。
- Shutdown_priv字段:錶示是否擁有停止MySQL服務的權限。
- Super_priv字段:錶示是否擁有超級權限。
- Execute_priv字段:錶示是否擁有EXECUTE權限。擁有EXECUTE權限,可以執行存儲過程和函數。
- Select_priv , Insert_priv等:為該用戶所擁有的權限。
3.1.3. 安全列
安全列只有6個字段,其中兩個是ssl相關的(ssl_type、ssl_cipher),用於 加密 ;兩個是x509相關的(x509_issuer、x509_subject),用於 標識用戶 ;另外兩個Plugin字段用於 驗證用戶身份 的插件,該字段不能為空。如果該字段為空,服務器就使用內建授權驗證機制驗證用戶身份。
3.1.4. 資源控制列
資源控制列的字段用來 限制用戶使用的資源 ,包含4個字段,分別為:
①max_questions,用戶每小時允許執行的查詢操作次數;
②max_updates,用戶每小時允許執行的更新操作次數;
③max_connections,用戶每小時允許執行的連接操作次數;
④max_user_connections,用戶允許同時建立的連接次數。
查看字段:
DESC mysql.user;
查看用戶, 以列的方式顯示數據:
SELECT * FROM mysql.user \G;
查詢特定字段:
SELECT host,user,authentication_string,select_priv,insert_priv,drop_priv
FROM mysql.user;
3.2. db錶
使用DESCRIBE查看db錶的基本結構:
DESCRIBE mysql.db;
- 用戶列 db錶用戶列有3個字段,分別是Host、User、Db。這3個字段分別錶示主機名、用戶名和數據庫名。錶示從某個主機連接某個用戶對某個數據庫的操作權限,這3個字段的組合構成了db錶的主鍵。
- 權限列 Create_routine_priv和Alter_routine_priv這兩個字段决定用戶是否具有創建和修改存儲過程的權限。
3.3. tables_priv錶和columns_priv錶
tables_priv錶用來 對錶設置操作權限 ,columns_priv錶用來對錶的 某一列設置權限 。tables_priv錶和columns_priv錶的結構分別如圖:
desc mysql.tables_priv;
tables_priv錶有8個字段,分別是Host、Db、User、Table_name、Grantor、Timestamp、Table_priv和Column_priv,各個字段說明如下:
- Host 、 Db 、 User 和 Table_name 四個字段分別錶示主機名、數據庫名、用戶名和錶名。
- Grantor錶示修改該記錄的用戶。
- Timestamp錶示修改該記錄的時間。
- Table_priv 錶示對象的操作權限。包括Select、Insert、Update、Delete、Create、Drop、Grant、References、Index和Alter。
- Column_priv字段錶示對錶中的列的操作權限,包括Select、Insert、Update和References。
desc mysql.columns_priv;
3.4. procs_priv錶
procs_priv錶可以對 存儲過程和存儲函數設置操作權限 ,錶結構如圖:
desc mysql.procs_priv;
四. 訪問控制(了解)
4.1. 連接核實階段
當用戶試圖連接MySQL服務器時,服務器基於用戶的身份以及用戶是否能提供正確的密碼驗證身份來確定接受或者拒絕連接。即客戶端用戶會在連接請求中提供用戶名、主機地址、用戶密碼,MySQL服務器接收到用戶請求後,會使用user錶中的host、user和authentication_string這3個字段匹配客戶端提供信息。
服務器只有在user錶記錄的Host和User字段匹配客戶端主機名和用戶名,並且提供正確的密碼時才接受連接。如果連接核實沒有通過,服務器就完全拒絕訪問;否則,服務器接受連接,然後進入階段2等待用戶請求。
4.2. 請求核實階段
一旦建立了連接,服務器就進入了訪問控制的階段2,也就是請求核實階段。對此連接上進來的每個請求,服務器檢查該請求要執行什麼操作、是否有足够的權限來執行它,這正是需要授權錶中的權限列發揮作用的地方。這些權限可以來自user、db、table_priv和column_priv錶。
確認權限時,MySQL首先 檢查user錶 ,如果指定的權限沒有在user錶中被授予,那麼MySQL就會繼續 檢查db錶 ,db錶是下一安全層級,其中的權限限定於數據庫層級,在該層級的SELECT權限允許用戶查看指定數據庫的所有錶中的數據;如果在該層級沒有找到限定的權限,則MySQL繼續 檢查tables_priv錶 以及 columns_priv錶 ,如果所有權限錶都檢查完畢,但還是沒有找到允許的權限操作,MySQL將 返回錯誤信息 ,用戶請求的操作不能執行,操作失敗。
提示: MySQL通過向下層級的順序(從user錶到columns_priv錶)檢查權限錶,
但並不是所有的權限都要執行該過程。例如,一個用戶登錄到MySQL服務器之
後只執行對MySQL的管理操作,此時只涉及管理權限,因此MySQL只檢查user錶。
另外,如果請求的權限操作不被允許,MySQL也不會繼續檢查下一層級的錶。
五. 角色管理
5.1. 角色的理解
引入角色的目的是 方便管理擁有相同權限的用戶 。恰當的權限設定,可以確保數據的安全性,這是至關重要的。
5.2. 創建角色
創建角色使用 CREATE ROLE 語句,語法如下:
CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...
角色名稱的命名規則和用戶名類似。如果 host_name省略,默認為% , role_name不可省略 ,不可為空。
練習:我們現在需要創建一個經理的角色,就可以用下面的代碼:
create role 'manager'@'localhost';
5.3. 給角色賦予權限
創建角色之後,默認這個角色是沒有任何權限的,我們需要給角色授權。給角色授權的語法結構是:
GRANT privileges ON table_name TO 'role_name'[@'host_nam
上述語句中privileges代錶權限的名稱,多個權限以逗號隔開。可使用SHOW語句查詢權限名稱,圖11-43列出了部分權限列錶。
SHOW PRIVILEGES\G;
5.4. 查看角色的權限
賦予角色權限之後,我們可以通過 SHOW GRANTS 語句,來查看權限是否創建成功了:
只要你創建了一個角色,系統就會自動給你一個“ USAGE ”權限,意思是 連接登錄數據庫的權限 。
GRANT all PRIVILEGES ON *.* TO 'manager'@'localhost';
5.5. 回收角色的權限
角色授權後,可以對角色的權限進行維護,對權限進行添加或撤銷。添加權限使用GRANT語句,與角色授權相同。撤銷角色或角色權限使用REVOKE語句。
修改了角色的權限,會影響擁有該角色的賬戶的權限。
撤銷角色權限的SQL語法如下:
REVOKE privileges ON tablename FROM 'rolename';
5.6. 删除角色
我們需要對業務重新整合的時候,可能就需要對之前創建的角色進行清理,删除一些不會再使用的角色。删除角色的操作很簡單,你只要掌握語法結構就行。
DROP ROLE role [,role2]...
注意, 如果你删除了角色,那麼用戶也就失去了通過這個角色所獲得的所有權限 。
5.7. 給用戶賦予角色
角色創建並授權後,要賦給用戶並處於 激活狀態 才能發揮作用。給用戶添加角色可使用GRANT語句,語法形式如下:
GRANT role [,role2,...] TO user [,user2,...];
在上述語句中,role代錶角色,user代錶用戶。可將多個角色同時賦予多個用戶,用逗號隔開即可。
練習:給kangshifu用戶添加角色school_read權限。
(1)使用GRANT語句給kangshifu添加school_read權限,SQL語句如下。
GRANT 'school_read' TO 'kangshifu'@'localhost';
(2)添加完成後使用SHOW語句查看是否添加成功,SQL語句如下。
SHOW GRANTS FOR 'kangshifu'@'localhost';
(3)使用kangshifu用戶登錄,然後查詢當前角色,如果角色未激活,結果將顯示NONE。SQL語句如下。
SELECT CURRENT_ROLE();
5.8. 激活角色
方式1:使用set default role 命令激活角色
舉例:
SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';
舉例:使用 SET DEFAULT ROLE 為下面4個用戶默認激活所有已擁有的角色如下:
SET DEFAULT ROLE ALL TO
'dev1'@'localhost',
'read_user1'@'localhost',
'read_user2'@'localhost',
'rw_user1'@'localhost';
方式2:將activate_all_roles_on_login設置為ON
- 默認情况:
設置:
SET GLOBAL activate_all_roles_on_login=ON;
這條 SQL 語句的意思是,對 所有角色永久激活 。運行這條語句之後,用戶才真正擁有了賦予角色的所有權限。
5.9. 撤銷用戶的角色
撤銷用戶角色的SQL語法如下:
REVOKE role FROM user;
5.10. 設置强制角色(mandatory role)
方式1:服務啟動前設置
[mysqld]
mandatory_roles='role1,[email protected],[email protected]%.zyy.com'
方式2:運行時設置
SET PERSIST mandatory_roles = 'role1,[email protected],[email protected]%.example.com'; #系統重啟後仍然
有效
SET GLOBAL mandatory_roles = 'role1,[email protected],[email protected]%.example.com'; #系統重啟後失效
边栏推荐
- MySQL實戰優化高手08 生產經驗:在數據庫的壓測過程中,如何360度無死角觀察機器性能?
- MySQL storage engine
- 软件测试工程师必备之软技能:结构化思维
- What is the difference between TCP and UDP?
- How to change php INI file supports PDO abstraction layer
- MySQL30-事务基础知识
- Texttext data enhancement method data argument
- Global and Chinese market of operational amplifier 2022-2028: Research Report on technology, participants, trends, market size and share
- MySQL25-索引的创建与设计原则
- Not registered via @EnableConfigurationProperties, marked(@ConfigurationProperties的使用)
猜你喜欢
[C language] deeply analyze the underlying principle of data storage
[after reading the series] how to realize app automation without programming (automatically start Kwai APP)
软件测试工程师必备之软技能:结构化思维
基于Pytorch的LSTM实战160万条评论情感分类
Implement context manager through with
Mysql27 - Optimisation des index et des requêtes
Solve the problem of remote connection to MySQL under Linux in Windows
Record the first JDBC
MySQL实战优化高手11 从数据的增删改开始讲起,回顾一下Buffer Pool在数据库里的地位
MySQL real battle optimization expert 11 starts with the addition, deletion and modification of data. Review the status of buffer pool in the database
随机推荐
C language string function summary
How to make shell script executable
评估方法的优缺点
[unity] simulate jelly effect (with collision) -- tutorial on using jellysprites plug-in
Export virtual machines from esxi 6.7 using OVF tool
Sed text processing
[C language] deeply analyze the underlying principle of data storage
Opencv uses freetype to display Chinese
What is the current situation of the game industry in the Internet world?
MySQL实战优化高手11 从数据的增删改开始讲起,回顾一下Buffer Pool在数据库里的地位
Chrome浏览器端跨域不能访问问题处理办法
How to change php INI file supports PDO abstraction layer
Mysql35 master slave replication
MySQL实战优化高手04 借着更新语句在InnoDB存储引擎中的执行流程,聊聊binlog是什么?
MySQL combat optimization expert 07 production experience: how to conduct 360 degree dead angle pressure test on the database in the production environment?
Emotional classification of 1.6 million comments on LSTM based on pytoch
MySQL learning diary (II)
解决在window中远程连接Linux下的MySQL
February 13, 2022-2-climbing stairs
[paper reading notes] - cryptographic analysis of short RSA secret exponents