mysql安全權(quán)限的講解
Mysql 默認(rèn)有個(gè)root用戶,但是這個(gè)用戶權(quán)限太大,一般只在管理數(shù)據(jù)庫時(shí)候才用。如果在項(xiàng)目中要連接 MySQL 數(shù)據(jù)庫,則建議新建一個(gè)權(quán)限較小的用戶來連接。
在 MySQL 命令行模式下輸入如下命令可以為 MySQL 創(chuàng)建一個(gè)新用戶:
1
CREATE? USER? username IDENTIFIED BY? 'password' ;
新用戶創(chuàng)建完成,但是此刻如果以此用戶登陸的話,會(huì)報(bào)錯(cuò),因?yàn)槲覀冞€沒有為這個(gè)用戶分配相應(yīng)權(quán)限,分配權(quán)限的命令如下:
1
GRANT? ALL? PRIVILEGES? ON? *.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;
授予username用戶在所有數(shù)據(jù)庫上的所有權(quán)限。
如果此時(shí)發(fā)現(xiàn)剛剛給的權(quán)限太大了,如果我們只是想授予它在某個(gè)數(shù)據(jù)庫上的權(quán)限,那么需要切換到root 用戶撤銷剛才的權(quán)限,重新授權(quán):
1
2
EVOKE ALL? PRIVILEGES? ON? *.* FROM? 'username' @ 'localhost' ;
GRANT? ALL? PRIVILEGES? ON? wordpress.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;
甚至還可以指定該用戶只能執(zhí)行 select 和 update 命令:
1
GRANT? SELECT , UPDATE? ON? wordpress.* TO? 'username' @ 'localhost'? IDENTIFIED BY? 'password' ;
這樣一來,再次以u(píng)sername登陸 MySQL,只有wordpress數(shù)據(jù)庫是對(duì)其可見的,并且如果你只授權(quán)它select權(quán)限,那么它就不能執(zhí)行delete 語句。
另外每當(dāng)調(diào)整權(quán)限后,通常需要執(zhí)行以下語句刷新權(quán)限:
1
FLUSH PRIVILEGES ;
刪除剛才創(chuàng)建的用戶:
1
DROP? USER? username@localhost;
仔細(xì)上面幾個(gè)命令,可以發(fā)現(xiàn)不管是授權(quán),還是撤銷授權(quán),都要指定響應(yīng)的host(即 @ 符號(hào)后面的內(nèi)容),因?yàn)橐陨霞案衩顚?shí)際上都是在操作mysql 數(shù)據(jù)庫中的user表,可以用如下命令查看相應(yīng)用戶及對(duì)應(yīng)的host:
1
SELECT? User , Host FROM? user ;
MySQL Study之--MySQL用戶及權(quán)限管理
MySQL服務(wù)器通過MySQL權(quán)限表來控制用戶對(duì)數(shù)據(jù)庫的訪問,MySQL權(quán)限表存放在mysql數(shù)據(jù)庫里,由mysql_install_db腳本初始化。這些MySQL權(quán)限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結(jié)構(gòu)和內(nèi)容:
user權(quán)限表:記錄允許連接到服務(wù)器的用戶帳號(hào)信息,里面的權(quán)限是全局級(jí)的。
db權(quán)限表:記錄各個(gè)帳號(hào)在各個(gè)數(shù)據(jù)庫上的操作權(quán)限。
table_priv權(quán)限表:記錄數(shù)據(jù)表級(jí)的操作權(quán)限。
columns_priv權(quán)限表:記錄數(shù)據(jù)列級(jí)的操作權(quán)限。
host權(quán)限表:配合db權(quán)限表對(duì)給定主機(jī)上數(shù)據(jù)庫級(jí)操作權(quán)限作更細(xì)致的控制。這個(gè)權(quán)限表不受GRANT和REVOKE語句的影響。
案例分析:
一、創(chuàng)建用戶并授權(quán)(root用戶)
[root@mysrv ~]# mysql -u root -poracle
mysql> select version()\g
+-------------------------------------------+
| version() |
+-------------------------------------------+
| 5.6.25-enterprise-commercial-advanced-log |
+-------------------------------------------+
1 row in set (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| prod |
| test |
+--------------------+
5 rows in set (0.01 sec)
1、建立tom用戶并授權(quán)(特權(quán)管理用戶)
mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;
Query OK, 0 rows affected (0.00 sec)
查看用戶創(chuàng)建是否成功:
mysql> select user,host from user ;
1
2
3
4
5
6
7
8
9
10
11
12
13
+ -------+-----------+
| user?? | host????? |
+ -------+-----------+
| tom?? | %???????? |
| root? | 127.0.0.1 |
| root? | ::1?????? |
|?????? | localhost |
| root? | localhost |
| scott | localhost |
|?????? | mysrv???? |
| root? | mysrv???? |
+ -------+-----------+
8 rows? in? set? (0.00 sec)
查看tom用戶的授權(quán):
mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+
GRANT 語法:
GRANT privileges (columns)
ON what
TO user IDENTIFIED BY "password"
WITH GRANT OPTION
權(quán)限列表:
ALTER: 修改表和索引。
CREATE: 創(chuàng)建數(shù)據(jù)庫和表。
DELETE: 刪除表中已有的記錄。
DROP: 拋棄(刪除)數(shù)據(jù)庫和表。
INDEX: 創(chuàng)建或拋棄索引。
INSERT: 向表中插入新行。
REFERENCE: 未用。
SELECT: 檢索表中的記錄。
UPDATE: 修改現(xiàn)存表記錄。
FILE: 讀或?qū)懛?wù)器上的文件。
PROCESS: 查看服務(wù)器中執(zhí)行的線程信息或殺死線程。
RELOAD: 重載授權(quán)表或清空日志、主機(jī)緩存或表緩存。
SHUTDOWN: 關(guān)閉服務(wù)器。
ALL: 所有權(quán)限,ALL PRIVILEGES同義詞。
USAGE: 特殊的 "無權(quán)限" 權(quán)限。
用 戶賬戶包括 "username" 和 "host" 兩部分,后者表示該用戶被允許從何地接入。tom@'%' 表示任何地址,默認(rèn)可以省略。還可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數(shù)據(jù)庫格式為 db@table,可以是 "test.*" 或 "*.*",前者表示 test 數(shù)據(jù)庫的所有表,后者表示所有數(shù)據(jù)庫的所有表。
子句 "WITH GRANT OPTION" 表示該用戶可以為其他用戶分配權(quán)限。
2、我們用 root 再創(chuàng)建幾個(gè)用戶,然后由 test 數(shù)據(jù)庫的管理員tom為他們分配權(quán)限。
mysql> create user 'tom1' identified by 'tom1' ,'tom2' identified by 'tom2';
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+ -------+-----------+
| user?? | host????? |
+ -------+-----------+
| tom?? | %???????? |
| tom1? | %???????? |
| tom2? | %???????? |
| root? | 127.0.0.1 |
| root? | ::1?????? |
|?????? | localhost |
| root? | localhost |
| scott | localhost |
|?????? | mysrv???? |
| root? | mysrv???? |
+ -------+-----------+
10 rows? in? set? (0.00 sec)
root用戶退出,tom登陸,并授權(quán)用戶訪問prod庫
[root@mysrv ~]# mysql -u tom -ptom
ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)
tom用戶竟不能登陸!!!
再對(duì)tom用戶授權(quán):
mysql> grant all on prod.* to 'tom'@'localhost' identified by 'tom' with grant option;;
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for tom;
+----------------------------------------------------------------------------------------------------+
| Grants for tom@% |
+----------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom'@'%' IDENTIFIED BY PASSWORD '*71FF744436C7EA1B954F6276121DB5D2BF68FC07' |
| GRANT ALL PRIVILEGES ON `prod`.* TO 'tom'@'%' WITH GRANT OPTION |
+----------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> use mysql;
Database changed
mysql> select user,host from user ;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
+ -------+-----------+
| user?? | host????? |
+ -------+-----------+
| tom?? | %???????? |
| tom1? | %???????? |
| tom2? | %???????? |
| root? | 127.0.0.1 |
| root? | ::1?????? |
|?????? | localhost |
| root? | localhost |
| scott | localhost |
| tom?? | localhost |
|?????? | mysrv???? |
| root? | mysrv???? |
+ -------+-----------+
11 rows? in? set? (0.00 sec)
tom登陸:
[root@mysrv ~]# mysql -u tom -ptom prod
mysql> select database();
+------------+
| database() |
+------------+
| prod |
+------------+
1 row in set (0.01 sec)
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| tom@localhost |
+----------------+
1 row in set (0.00 sec)
創(chuàng)建表:
mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1 |
+----------------+
1 row in set (0.00 sec)
mysql> create table t2 as select * from t1;
Query OK, 3 rows affected (0.15 sec)
Records: 3 Duplicates: 0 Warnings: 0
查看表信息:
mysql> desc t2;
+-------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id | int(11) | YES | | NULL | |
| name | varchar(10) | YES | | NULL | |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.01 sec)
mysql> show create table t2;
+-------+---------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table |
+-------+---------------------------------------------------------------------------------------------------------------------------+
| t2 | CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+---------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
mysql> show create table t2\G;
*************************** 1. row ***************************
Table: t2
Create Table: CREATE TABLE `t2` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
+------+-------+
3 rows in set (0.00 sec)
3、tom用戶為tom1,tom2授權(quán)
mysql> grant select on prod.* to tom1;
Query OK, 0 rows affected (0.00 sec)
mysql> grant select on prod.* to tom2;
Query OK, 0 rows affected (0.02 sec)
mysql> grant insert,update on prod.* to tom2;
Query OK, 0 rows affected (0.00 sec)
tom2登陸(從遠(yuǎn)程登陸):
C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2
mysql> select database();
+------------+
| database() |
+------------+
| NULL |
+------------+
1 row in set (0.00 sec)
mysql> use prod;
Database changed
mysql> select database();
+------------+
| database() |
+------------+
| prod |
+------------+
1 row in set (0.00 sec)
mysql> select current_user();
+----------------+
| current_user() |
+----------------+
| tom2@% |
+----------------+
1 row in set (0.00 sec)
mysql> show grants for tom2;
+------------------------------------------------------------------+
| Grants for tom2@% |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'tom2'@'%' IDENTIFIED BY PASSWORD?|
| GRANT SELECT, INSERT, UPDATE ON `prod`.* TO 'tom2'@'%' |
+------------------------------------------------------------------+
2 rows in set (0.00 sec)
mysql> show tables;
+----------------+
| Tables_in_prod |
+----------------+
| t1 |
| t2 |
+----------------+
2 rows in set (0.00 sec)
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
+------+-------+
3 rows in set (0.00 sec)
mysql> select * from t2;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
+------+-------+
3 rows in set (0.00 sec)
mysql> insert into t1 values (40,'john');
Query OK, 1 row affected (0.00 sec)
mysql> commit;
Query OK, 0 rows affected (0.09 sec)
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
| 40 | john |
+------+-------+
4 rows in set (0.00 sec)
mysql> update t1 set name='ellen' where id=40;
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
| 40 | ellen |
+------+-------+
4 rows in set (0.00 sec)
mysql> delete from t1;
ERROR 1142 (42000): DELETE command denied to user 'tom2'@'192.168.8.254' for tab
le 't1'
mysql> commit;
Query OK, 0 rows affected (0.05 sec)
mysql> select * from t1;
+------+-------+
| id | name |
+------+-------+
| 10 | tom |
| 20 | jerry |
| 30 | rose |
| 40 | ellen |
+------+-------+
4 rows in set (0.00 sec)
4、回收tom2的update權(quán)限:
mysql> revoke update on prod.* from tom2;
Query OK, 0 rows affected (0.00 sec)
tom2再重新登陸:
C:\Users\Administrator>mysql -h 192.168.8.240 -utom2 -ptom2
mysql> use prod;
Database changed
mysql> update t1 set name='lily' where id=10;
ERROR 1142 (42000): UPDATE command denied to user 'tom2'@'192.168.8.254' for tab
le 't1'
---update失敗!
二、修改用戶口令:
1、root用戶修改普通用戶口令
mysql> set password for tom1=password('oracle');
Query OK, 0 rows affected (0.01 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
tom1重新登陸:
C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1
Warning: Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'tom1'@'192.168.8.254' (using passwor
d: YES)
---舊口令登陸失敗!
C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle
mysql>
2、普通用戶修改自己密碼:
C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -poracle
mysql> set password=password('tom1');
Query OK, 0 rows affected (0.00 sec)
重新登陸:
C:\Users\Administrator>mysql -h 192.168.8.240 -utom1 -ptom1
mysql>
---新密碼登陸成功 !
三、刪除用戶:
1、回收用戶所有權(quán)限
mysql> revoke all on prod.* from tom2;
Query OK, 0 rows affected (0.01 sec)
2、刪除用戶
mysql> drop user tom2;
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> select user,host from user;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+ -------+-----------+
| user?? | host????? |
+ -------+-----------+
| jerry | %???????? |
| rose? | %???????? |
| tom?? | %???????? |
| tom1? | %???????? |
| root? | 127.0.0.1 |
| root? | ::1?????? |
|?????? | localhost |
| jerry | localhost |
| root? | localhost |
| rose? | localhost |
| scott | localhost |
| tom?? | localhost |
|?????? | mysrv???? |
| root? | mysrv???? |
+ -------+-----------+
14 rows? in? set? (0.00 sec)
------- 摘要 --------------------------------------
創(chuàng)建用戶:
GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
CREATE USER user2 IDENTIFIED BY 'password';
分配權(quán)限:
GRANT select ON testdb.* TO user2;
查看權(quán)限:
SHOW GRANTS FOR user1;
修改密碼:
SET PASSWORD FOR user1 = PASSWORD('newpwd');
SET PASSWORD = PASSWORD('newpwd');
移除權(quán)限:
REVOKE all ON *.* FROM user1;
刪除用戶:
DROP USER user1;
數(shù)據(jù)庫列表:
SHOW DATABASES;
數(shù)據(jù)表列表:
SHOW TABLES;
當(dāng)前數(shù)據(jù)庫:
SELECT DATABASE();
當(dāng)前用戶:
SELECT USER();
數(shù)據(jù)表結(jié)構(gòu):
DESCRIBE table1;
刷新權(quán)限:
FLUSH PRIVILEGES;
grant和revoke可以在幾個(gè)層次上控制訪問權(quán)限
1,整個(gè)服務(wù)器,使用 grant ALL 和revoke ALL
2,整個(gè)數(shù)據(jù)庫,使用on database.*
3,特點(diǎn)表,使用on database.table
4,特定的列
5,特定的存儲(chǔ)過程
user表中host列的值的意義
% 匹配所有主機(jī)
localhost localhost不會(huì)被解析成IP地址,直接通過UNIXsocket連接
127.0.0.1 會(huì)通過TCP/IP協(xié)議連接,并且只能在本機(jī)訪問;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
grant 普通數(shù)據(jù)用戶,查詢、插入、更新、刪除 數(shù)據(jù)庫中所有表數(shù)據(jù)的權(quán)利。
grant select on testdb.* to common_user@’%’
grant insert on testdb.* to common_user@’%’
grant update on testdb.* to common_user@’%’
grant delete on testdb.* to common_user@’%’
或者,用一條 MySQL 命令來替代:
grant select, insert, update, delete on testdb.* to common_user@’%’
grant 數(shù)據(jù)庫開發(fā)人員,創(chuàng)建表、索引、視圖、存儲(chǔ)過程、函數(shù)。。。等權(quán)限。
grant 創(chuàng)建、修改、刪除 MySQL 數(shù)據(jù)表結(jié)構(gòu)權(quán)限。
grant create on testdb.* to developer@’192.168.0.%’;
grant alter on testdb.* to developer@’192.168.0.%’;
grant drop on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 外鍵權(quán)限。
grant references on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 臨時(shí)表權(quán)限。
grant create temporary tables on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 索引權(quán)限。
grant index on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 視圖、查看視圖源代碼 權(quán)限。
grant create view on testdb.* to developer@’192.168.0.%’;
grant show view on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 存儲(chǔ)過程、函數(shù) 權(quán)限。
grant create routine on testdb.* to developer@’192.168.0.%’; -- now, can show procedure status
grant alter routine on testdb.* to developer@’192.168.0.%’; -- now, you can drop a procedure
grant execute on testdb.* to developer@’192.168.0.%’;
grant 普通 DBA 管理某個(gè) MySQL 數(shù)據(jù)庫的權(quán)限。
grant all privileges on testdb to dba@’localhost’
其中,關(guān)鍵字 “privileges” 可以省略。
grant 高級(jí) DBA 管理 MySQL 中所有數(shù)據(jù)庫的權(quán)限。
grant all on *.* to dba@’localhost’
MySQL grant 權(quán)限,分別可以作用在多個(gè)層次上。
1. grant 作用在整個(gè) MySQL 服務(wù)器上:
grant select on *.* to dba@localhost; -- dba 可以查詢 MySQL 中所有數(shù)據(jù)庫中的表。
grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數(shù)據(jù)庫
2. grant 作用在單個(gè)數(shù)據(jù)庫上:
grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。
3. grant 作用在單個(gè)數(shù)據(jù)表上:
grant select, insert, update, delete on testdb.orders to dba@localhost;
4. grant 作用在表中的列上:
grant select(id, se, rank) on testdb.apache_log to dba@localhost;
5. grant 作用在存儲(chǔ)過程、函數(shù)上:
grant execute on procedure testdb.pr_add to ’dba’@’localhost’
grant execute on function testdb.fn_add to ’dba’@’localhost’
注意:修改完權(quán)限以后 一定要刷新服務(wù),或者重啟服務(wù),刷新服務(wù)用:FLUSH PRIVILEGES。
MySQL權(quán)限級(jí)別介紹
MySQL權(quán)限級(jí)別
全局性的管理權(quán)限,作用于整個(gè)MySQL實(shí)例級(jí)別
數(shù)據(jù)庫級(jí)別的權(quán)限,作用于某個(gè)指定的數(shù)據(jù)庫上或者所有的數(shù)據(jù)庫上
數(shù)據(jù)庫對(duì)象級(jí)別的權(quán)限,作用于指定的數(shù)據(jù)庫對(duì)象上(表、視圖等)或 者所有的數(shù)據(jù)庫對(duì)象上
權(quán)限存儲(chǔ)在mysql庫的user, db, tables_priv, columns_priv, and procs_priv這幾個(gè)系統(tǒng)表中,待MySQL實(shí)例啟動(dòng)后就加載到內(nèi)存中
MySQL權(quán)限級(jí)別介紹
對(duì)比root用戶在幾個(gè)權(quán)限系統(tǒng)表中的數(shù)據(jù)
mysql> select * from user where user=‘root’ and host=‘localhost’; ##都是’Y’
mysql> select * from db where user=‘root’ and host=‘localhost’; ##無記錄
mysql> select * from tables_priv where host=‘localhost’ and user=‘root’; ##無記錄
mysql> select * from columns_priv where user=‘root’ and host=‘localhost’; ##無記錄
mysql> select * from procs_priv where user=‘root’ and host=‘localhost’; ##無記錄
MySQL權(quán)限詳解(1)
All/All Privileges權(quán)限代表全局或者全數(shù)據(jù)庫對(duì)象級(jí)別的所有權(quán)限
Alter權(quán)限代表允許修改表結(jié)構(gòu)的權(quán)限,但必須要求有create和insert權(quán) 限配合。如果是rename表名,則要求有alter和drop原表,create和 insert新表的權(quán)限
Alter routine權(quán)限代表允許修改或者刪除存儲(chǔ)過程、函數(shù)的權(quán)限
Create權(quán)限代表允許創(chuàng)建新的數(shù)據(jù)庫和表的權(quán)限
Createroutine權(quán)限代表允許創(chuàng)建存儲(chǔ)過程、函數(shù)的權(quán)限
Createtablespace權(quán)限代表允許創(chuàng)建、修改、刪除表空間和日志組的權(quán) 限
Create temporary tables權(quán)限代表允許創(chuàng)建臨時(shí)表的權(quán)限
Createuser權(quán)限代表允許創(chuàng)建、修改、刪除、重命名user的權(quán)限
Createview權(quán)限代表允許創(chuàng)建視圖的權(quán)限
MySQL權(quán)限詳解(2)
? Delete權(quán)限代表允許刪除行數(shù)據(jù)的權(quán)限
? Drop權(quán)限代表允許刪除數(shù)據(jù)庫、表、視圖的權(quán)限,包括truncatetable命令
? Event權(quán)限代表允許查詢,創(chuàng)建,修改,刪除MySQL事件
? Execute權(quán)限代表允許執(zhí)行存儲(chǔ)過程和函數(shù)的權(quán)限
? File權(quán)限代表允許在MySQL可以訪問的目錄進(jìn)行讀寫磁盤文件操作,可使用 的命令包括load data infile,select ... into outfile,load file()函數(shù)
? Grant option權(quán)限代表是否允許此用戶授權(quán)或者收回給其他用戶你給予的權(quán) 限
? Index權(quán)限代表是否允許創(chuàng)建和刪除索引
? Insert權(quán)限代表是否允許在表里插入數(shù)據(jù),同時(shí)在執(zhí)行analyze table,optimize table,repair table語句的時(shí)候也需要insert權(quán)限
? Lock權(quán)限代表允許對(duì)擁有select權(quán)限的表進(jìn)行鎖定,以防止其他鏈接對(duì)此表 的讀或?qū)?/p>
MySQL權(quán)限詳解(3)
? Process權(quán)限代表允許查看MySQL中的進(jìn)程信息,比如執(zhí)行showprocesslist,
? Reference權(quán)限是在5.7.6版本之后引入,代表是否允許創(chuàng)建外鍵
? Reload權(quán)限代表允許執(zhí)行flush命令,指明重新加載權(quán)限表到系統(tǒng)內(nèi)存中, refresh命令代表關(guān)閉和重新開啟日志文件并刷新所有的表
? Replication client權(quán)限代表允許執(zhí)行show master status,show slave status,show binary logs命令
? Replication slave權(quán)限代表允許slave主機(jī)通過此用戶連接master以便建立主從 復(fù)制關(guān)系
? Select權(quán)限代表允許從表中查看數(shù)據(jù),某些不查詢表數(shù)據(jù)的select執(zhí)行則不需 要此權(quán)限,如Select 1+1,Select PI()+2;而且select權(quán)限在執(zhí)行update/delete 語句中含有where條件的情況下也是需要的
? Showdatabases權(quán)限代表通過執(zhí)行showdatabases命令查看所有的數(shù)據(jù)庫名
? Show view權(quán)限代表通過執(zhí)行show create view命令查看視圖創(chuàng)建的語句mysqladmin processlist, show engine等命令
MySQL權(quán)限詳解(4)
? Shutdown權(quán)限代表允許關(guān)閉數(shù)據(jù)庫實(shí)例,執(zhí)行語句包括mysqladmin shutdown
? Super權(quán)限代表允許執(zhí)行一系列數(shù)據(jù)庫管理命令,包括kill強(qiáng)制關(guān)閉某個(gè)連接 命令,change master to創(chuàng)建復(fù)制關(guān)系命令,以及create/alter/drop server等命 令
? Trigger權(quán)限代表允許創(chuàng)建,刪除,執(zhí)行,顯示觸發(fā)器的權(quán)限
? Update權(quán)限代表允許修改表中的數(shù)據(jù)的權(quán)限
? Usage權(quán)限是創(chuàng)建一個(gè)用戶之后的默認(rèn)權(quán)限,其本身代表連接登錄權(quán)限
系統(tǒng)權(quán)限表
? 權(quán)限存儲(chǔ)在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個(gè)系統(tǒng)表中,待MySQL實(shí)例啟動(dòng)后就加載到內(nèi)存中
? User表:存放用戶賬戶信息以及全局級(jí)別(所有數(shù)據(jù)庫)權(quán)限,決定了 來自哪些主機(jī)的哪些用戶可以訪問數(shù)據(jù)庫實(shí)例,如果有全局權(quán)限則意味
著對(duì)所有數(shù)據(jù)庫都有此權(quán)限
? Db表:存放數(shù)據(jù)庫級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可以訪 問此數(shù)據(jù)庫
? Tables_priv表:存放表級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可以 訪問數(shù)據(jù)庫的這個(gè)表
? Columns_priv表:存放列級(jí)別的權(quán)限,決定了來自哪些主機(jī)的哪些用戶可 以訪問數(shù)據(jù)庫表的這個(gè)字段
? Procs_priv表:存放存儲(chǔ)過程和函數(shù)級(jí)別的權(quán)限
? User和db權(quán)限表結(jié)構(gòu)
? User權(quán)限表結(jié)構(gòu)中的特殊字段
? Plugin,password,authentication_string三個(gè)字段存放用戶認(rèn)證信息
? Password_expired設(shè)置成’Y’則表明允許DBA將此用戶的密碼設(shè)置成過期而 且過期后要求用戶的使用者重置密碼(alter user/set password重置密碼)
? Password_last_changed作為一個(gè)時(shí)間戳字段代表密碼上次修改時(shí)間,執(zhí) 行create user/alter user/set password/grant等命令創(chuàng)建用戶或修改用戶密 碼時(shí)此數(shù)值自動(dòng)更新
? Password_lifetime代表從password_last_changed時(shí)間開始此密碼過期的天 數(shù)
? Account_locked代表此用戶被鎖住,無法使用
? Tables_priv和columns_priv權(quán)限表結(jié)構(gòu)
? Timestamp和grantor兩個(gè)字段暫時(shí)沒用
? Tables_priv和columns_priv權(quán)限值
? procs_priv權(quán)限表結(jié)構(gòu)
? Routine_type是枚舉類型,代表是存儲(chǔ)過程還是函數(shù)
? Timestamp和grantor兩個(gè)字段暫時(shí)沒用
? 系統(tǒng)權(quán)限表字段長(zhǎng)度限制表
? 權(quán)限認(rèn)證中的大小寫敏感問題
? 字段user,password,authencation_string,db,table_name大小寫敏感
? 字段host,column_name,routine_name大小寫不敏感
? User用戶大小寫敏感
mysql> create user abc@localhost;
ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'
mysql> create user Abc@localhost;
Query OK, 0 rows affected (0.01 sec)
? Host主機(jī)名大小寫不敏感
mysql> create user abc@Localhost;
ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'
MySQL授權(quán)用戶
? MySQL的授權(quán)用戶由兩部分組成:用戶名和登錄主機(jī)名
? 表達(dá)用戶的語法為‘user_name’@‘host_name’
? 單引號(hào)不是必須,但如果其中包含特殊字符則是必須的
? ‘’@‘localhost’代表匿名登錄的用戶
? Host_name可以使主機(jī)名或者ipv4/ipv6的地址。Localhost代表本機(jī),127.0.0.1代表ipv4的 本機(jī)地址,::1代表ipv6的本機(jī)地址
? Host_name字段允許使用%和_兩個(gè)匹配字符,比如’%’代表所有主機(jī),’%.mysql.com’代表 來自mysql.com這個(gè)域名下的所有主機(jī),‘192.168.1.%’代表所有來自192.168.1網(wǎng)段的主機(jī)
MySQL修改權(quán)限的生效
? 執(zhí)行Grant,revoke,setpassword,renameuser命令修改權(quán)限之后,MySQL會(huì)自動(dòng)
將修改后的權(quán)限信息同步加載到系統(tǒng)內(nèi)存中
? 如果執(zhí)行insert/update/delete操作上述的系統(tǒng)權(quán)限表之后,則必須再執(zhí)行刷 新權(quán)限命令才能同步到系統(tǒng)內(nèi)存中,刷新權(quán)限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload
? 如果是修改tables和columns級(jí)別的權(quán)限,則客戶端的下次操作新權(quán)限就會(huì)生 效
? 如果是修改database級(jí)別的權(quán)限,則新權(quán)限在客戶端執(zhí)行use database命令后 生效
? 如果是修改global級(jí)別的權(quán)限,則需要重新創(chuàng)建連接新權(quán)限才能生效
? --skip-grant-tables可以跳過所有系統(tǒng)權(quán)限表而允許所有用戶登錄,只在特殊 情況下暫時(shí)使用
MySQL用戶連接
mysql --user=finley --password db_name
mysql -u finley -p db_name
mysql --user=finley --password=password db_name
shell> mysql -u finley -ppassword db_name
創(chuàng)建MySQL用戶
? 有兩種方式創(chuàng)建MySQL授權(quán)用戶
? 執(zhí)行createuser/grant命令(推薦方式)
? 通過insert語句直接操作MySQL系統(tǒng)權(quán)限表
mysql> CREATE USER 'finley'@'localhost' IDENTIFIED BY 'some_pass';
mysql>GRANTALLPRIVILEGESON*.*TO'finley'@'localhost' WITH
GRANT OPTION;
mysql> CREATE USER 'finley'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'finley'@'%‘ WITH GRANT OPTION;
mysql> CREATE USER 'admin'@'localhost' IDENTIFIED BY 'admin_pass';
mysql> GRANT RELOAD,PROCESS ON *.* TO 'admin'@'localhost';
mysql> grant select(id) on test.temp to cdq@localhost;
創(chuàng)建MySQL用戶
mysql> CREATE USER 'custom'@'localhost' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON bankaccount.*
-> TO 'custom'@'localhost';
mysql> CREATE USER 'custom'@'host47.example.com' IDENTIFIED BY 'obscure'; mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
-> ON expenses.*
-> TO 'custom'@'host47.example.com';
mysql> CREATE USER 'custom'@'%.example.com' IDENTIFIED BY 'obscure';
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
回收MySQL用戶權(quán)限
? 通過revoke命令收回用戶權(quán)限
mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;
刪除MySQL用戶
? 通過執(zhí)行drop user命令刪除MySQL用戶
mysql> DROP USER 'jeffrey'@'localhost';
設(shè)置MySQL用戶資源限制
? 通過設(shè)置全局變量max_user_connections可以限制所有用戶在同一時(shí) 間連接MySQL實(shí)例的數(shù)量,但此參數(shù)無法對(duì)每個(gè)用戶區(qū)別對(duì)待,所以 MySQL提供了對(duì)每個(gè)用戶的資源限制管理
? MAX_QUERIES_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以執(zhí)行查詢的次 數(shù)(基本包含所有語句)
? MAX_UPDATES_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以執(zhí)行修改的次 數(shù)(僅包含修改數(shù)據(jù)庫或表的語句)
? MAX_CONNECTIONS_PER_HOUR:一個(gè)用戶在一個(gè)小時(shí)內(nèi)可以連接 MySQL的時(shí)間
? MAX_USER_CONNECTIONS:一個(gè)用戶可以在同一時(shí)間連接MySQL實(shí)例 的數(shù)量
? 從5.0.3版本開始,對(duì)用戶‘user’@‘%.example.com’的資源限制是指所有 通過example.com域名主機(jī)連接user用戶的連接,而不是分別指從 host1.example.com和host2.example.com主機(jī)過來的連接
設(shè)置MySQL用戶資源限制
? 通過執(zhí)行createuser/alteruser設(shè)置/修改用戶的資源限制
mysql> CREATE USER 'francis'@'localhost' IDENTIFIED BY 'frank'
-> -> -> ->
WITH MAX_QUERIES_PER_HOUR 20 MAX_UPDATES_PER_HOUR 10 MAX_CONNECTIONS_PER_HOUR 5 MAX_USER_CONNECTIONS 2;
mysql> ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100;
? 取消某項(xiàng)資源限制既是把原先的值修改成0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;
? 當(dāng)針對(duì)某個(gè)用戶的max_user_connections非0時(shí),則忽略全局系統(tǒng)參數(shù) max_user_connections,反之則全局系統(tǒng)參數(shù)生效
設(shè)置MySQL用戶的密碼
? 執(zhí)行create user創(chuàng)建用戶和密碼
mysql> CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
? 修改用戶密碼的方式包括:
mysql> ALTER USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
mysql> SET PASSWORD FOR 'jeffrey'@'localhost' = PASSWORD('mypass');
mysql> GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
shell> mysqladmin -u user_name -h host_name password "new_password";
? 修改本身用戶密碼的方式包括:
mysql> ALTER USER USER() IDENTIFIED BY 'mypass';
mysql> SET PASSWORD = PASSWORD('mypass');
設(shè)置MySQL用戶密碼過期策略
? 設(shè)置系統(tǒng)參數(shù)default_password_lifetime作用于所有的用戶賬戶
? default_password_lifetime=180 設(shè)置180天過期
? default_password_lifetime=0 設(shè)置密碼不過期
? 如果為每個(gè)用戶設(shè)置了密碼過期策略,則會(huì)覆蓋上述系統(tǒng)參數(shù)
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INTERVAL90DAY;
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE INEVER;密碼不過期
ALTER USER‘jeffrey’@‘localhost’ PASSWORD EXPIRE DEFAULT;默認(rèn)過期策略
? 手動(dòng)強(qiáng)制某個(gè)用戶密碼過期
ALTER USER 'jeffrey'@'localhost' PASSWORD EXPIRE;
mysql> SELECT 1;
ERROR 1820 (HY000): You must SET PASSWORD before executing this statement
mysql> ALTER USER USER() IDENTIFIED BY 'new_password';
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT 1;
|1|
MySQL用戶lock
通過執(zhí)行create user/alter user命令中帶account lock/unlock子句設(shè) 置用戶的lock狀態(tài)
Createuser語句默認(rèn)的用戶是unlock狀態(tài)
mysql>create user abc2@localhost identified by 'mysql' account lock;
QueryOK,0rowsaffected(0.01sec)
Alter user語句默認(rèn)不會(huì)修改用戶的lock/unlock狀態(tài)
mysql>alter user 'mysql.sys'@localhost account lock;
Query OK,0 row saffected(0.00sec)
mysql>alter user 'mysql.sys'@localhost account unlock;
Query OK,0 row saffected(0.00sec)
-- 當(dāng)客戶端使用lock狀態(tài)的用戶登錄MySQL時(shí),會(huì)收到如此報(bào)錯(cuò) Access denied for user 'user_name'@'host_name'.
Account is locked.
企業(yè)應(yīng)用中的常規(guī)MySQL用戶
? 企業(yè)生產(chǎn)系統(tǒng)中MySQL用戶的創(chuàng)建通常由DBA統(tǒng)一協(xié)調(diào)創(chuàng)建,而且按需
創(chuàng)建
? DBA通常直接使用root用戶來管理數(shù)據(jù)庫
? 通常會(huì)創(chuàng)建指定業(yè)務(wù)數(shù)據(jù)庫上的增刪改查、臨時(shí)表、執(zhí)行存儲(chǔ)過程的權(quán)限給應(yīng) 用程序來連接數(shù)據(jù)庫
Create user app_full identified by ‘mysql’;
Grant select,update,insert,delete,create temporary tables,execute on esn.* to
app_full@’10.0.0.%’;
mysql>show grants for app_full@'10.0.0.%';
+------------------------------------------------------------------------------------------------------------+
|Grantsforapp_full@10.0.0.% |
+------------------------------------------------------------------------------------------------------------+
|GRANTUSAGEON*.*TO'app_full'@'10.0.0.%' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES, EXECUTE ON `esn`.* TO 'app_full'@'10.0.0.%' |
? 通常也會(huì)創(chuàng)建指定業(yè)務(wù)數(shù)據(jù)庫上的只讀權(quán)限給特定應(yīng)用程序或某些高級(jí)別人員 來查詢數(shù)據(jù),防止數(shù)據(jù)被修改
Create user app_readonly identified by ‘mysql’;
Grant select on esn.* to app_readonly identified by ‘mysq’;
MySQL 數(shù)據(jù)庫
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。