mysql安全权限的讲解
MySQL 默認有個root用戶,但是這個用戶權限太大,一般只在管理數據庫時候才用。如果在項目中要連接 MySQL 數據庫,則建議新建一個權限較小的用戶來連接。
在 MySQL 命令行模式下輸入如下命令可以為 MySQL 創建一個新用戶:
| 1 | CREATE?USER?username IDENTIFIED BY?'password'; |
新用戶創建完成,但是此刻如果以此用戶登陸的話,會報錯,因為我們還沒有為這個用戶分配相應權限,分配權限的命令如下:
| 1 | GRANT?ALL?PRIVILEGES?ON?*.* TO?'username'@'localhost'?IDENTIFIED BY?'password'; |
授予username用戶在所有數據庫上的所有權限。
如果此時發現剛剛給的權限太大了,如果我們只是想授予它在某個數據庫上的權限,那么需要切換到root 用戶撤銷剛才的權限,重新授權:
| 12 | EVOKE ALL?PRIVILEGES?ON?*.* FROM?'username'@'localhost';GRANT?ALL?PRIVILEGES?ON?wordpress.* TO?'username'@'localhost'?IDENTIFIED BY?'password'; |
甚至還可以指定該用戶只能執行 select 和 update 命令:
| 1 | GRANT?SELECT, UPDATE?ON?wordpress.* TO?'username'@'localhost'?IDENTIFIED BY?'password'; |
這樣一來,再次以username登陸 MySQL,只有wordpress數據庫是對其可見的,并且如果你只授權它select權限,那么它就不能執行delete 語句。
另外每當調整權限后,通常需要執行以下語句刷新權限:
| 1 | FLUSH PRIVILEGES; |
刪除剛才創建的用戶:
| 1 | DROP?USER?username@localhost; |
仔細上面幾個命令,可以發現不管是授權,還是撤銷授權,都要指定響應的host(即 @ 符號后面的內容),因為以上及格命令實際上都是在操作mysql 數據庫中的user表,可以用如下命令查看相應用戶及對應的host:
| 1 | SELECT?User, Host FROM?user; |
?
?
?
MySQL Study之--MySQL用戶及權限管理
MySQL服務器通過MySQL權限表來控制用戶對數據庫的訪問,MySQL權限表存放在mysql數據庫里,由mysql_install_db腳本初始化。這些MySQL權限表分別user,db,table_priv,columns_priv和host。下面分別介紹一下這些表的結構和內容:
user權限表:記錄允許連接到服務器的用戶帳號信息,里面的權限是全局級的。
db權限表:記錄各個帳號在各個數據庫上的操作權限。
table_priv權限表:記錄數據表級的操作權限。
columns_priv權限表:記錄數據列級的操作權限。
host權限表:配合db權限表對給定主機上數據庫級操作權限作更細致的控制。這個權限表不受GRANT和REVOKE語句的影響。
案例分析:
一、創建用戶并授權(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用戶并授權(特權管理用戶)
mysql> grant all on prod.* to 'tom'@'%' identified by 'tom' with grant option;
Query OK, 0 rows affected (0.00 sec)
查看用戶創建是否成功:
mysql> select user,host from user ;
| 12345678910111213 | +-------+-----------+| 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用戶的授權:
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
權限列表:
ALTER: 修改表和索引。
CREATE: 創建數據庫和表。
DELETE: 刪除表中已有的記錄。
DROP: 拋棄(刪除)數據庫和表。
INDEX: 創建或拋棄索引。
INSERT: 向表中插入新行。
REFERENCE: 未用。
SELECT: 檢索表中的記錄。
UPDATE: 修改現存表記錄。
FILE: 讀或寫服務器上的文件。
PROCESS: 查看服務器中執行的線程信息或殺死線程。
RELOAD: 重載授權表或清空日志、主機緩存或表緩存。
SHUTDOWN: 關閉服務器。
ALL: 所有權限,ALL PRIVILEGES同義詞。
USAGE: 特殊的 "無權限" 權限。
用 戶賬戶包括 "username" 和 "host" 兩部分,后者表示該用戶被允許從何地接入。tom@'%' 表示任何地址,默認可以省略。還可以是 "tom@192.168.1.%"、"tom@%.abc.com" 等。數據庫格式為 db@table,可以是 "test.*" 或 "*.*",前者表示 test 數據庫的所有表,后者表示所有數據庫的所有表。
子句 "WITH GRANT OPTION" 表示該用戶可以為其他用戶分配權限。?
2、我們用 root 再創建幾個用戶,然后由 test 數據庫的管理員tom為他們分配權限。
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 ;
| 123456789101112131415 | +-------+-----------+| 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登陸,并授權用戶訪問prod庫
[root@mysrv ~]# mysql -u tom -ptom?
ERROR 1045 (28000): Access denied for user 'tom'@'localhost' (using password: YES)
tom用戶竟不能登陸!!!
再對tom用戶授權:
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 ;
| 12345678910111213141516 | +-------+-----------+| 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)
創建表:
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授權
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登陸(從遠程登陸):
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權限:
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、回收用戶所有權限
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;
| 12345678910111213141516171819 | +-------+-----------+| 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) |
------- 摘要 --------------------------------------?
創建用戶:
GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
CREATE USER user2 IDENTIFIED BY 'password';
分配權限:
GRANT select ON testdb.* TO user2;
查看權限:
SHOW GRANTS FOR user1;
修改密碼:
SET PASSWORD FOR user1 = PASSWORD('newpwd');
SET PASSWORD = PASSWORD('newpwd');
移除權限:
REVOKE all ON *.* FROM user1;
刪除用戶:
DROP USER user1;
數據庫列表:
SHOW DATABASES;
數據表列表:
SHOW TABLES;
當前數據庫:
SELECT DATABASE();
當前用戶:
SELECT USER();
數據表結構:
DESCRIBE table1;
刷新權限:
FLUSH PRIVILEGES;
grant和revoke可以在幾個層次上控制訪問權限
1,整個服務器,使用 grant ALL 和revoke ALL
2,整個數據庫,使用on database.*
3,特點表,使用on database.table
4,特定的列
5,特定的存儲過程
user表中host列的值的意義
% 匹配所有主機
localhost localhost不會被解析成IP地址,直接通過UNIXsocket連接
127.0.0.1 會通過TCP/IP協議連接,并且只能在本機訪問;
::1 ::1就是兼容支持ipv6的,表示同ipv4的127.0.0.1
grant 普通數據用戶,查詢、插入、更新、刪除 數據庫中所有表數據的權利。
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 數據庫開發人員,創建表、索引、視圖、存儲過程、函數。。。等權限。
grant 創建、修改、刪除 MySQL 數據表結構權限。
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 外鍵權限。
grant references on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 臨時表權限。
grant create temporary tables on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 索引權限。
grant index on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 視圖、查看視圖源代碼 權限。
grant create view on testdb.* to developer@’192.168.0.%’;
grant show view on testdb.* to developer@’192.168.0.%’;
grant 操作 MySQL 存儲過程、函數 權限。
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 管理某個 MySQL 數據庫的權限。
grant all privileges on testdb to dba@’localhost’
其中,關鍵字 “privileges” 可以省略。
grant 高級 DBA 管理 MySQL 中所有數據庫的權限。
grant all on *.* to dba@’localhost’
MySQL grant 權限,分別可以作用在多個層次上。
1. grant 作用在整個 MySQL 服務器上:
grant select on *.* to dba@localhost; -- dba 可以查詢 MySQL 中所有數據庫中的表。
grant all on *.* to dba@localhost; -- dba 可以管理 MySQL 中的所有數據庫
2. grant 作用在單個數據庫上:
grant select on testdb.* to dba@localhost; -- dba 可以查詢 testdb 中的表。
3. grant 作用在單個數據表上:
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 作用在存儲過程、函數上:
grant execute on procedure testdb.pr_add to ’dba’@’localhost’
grant execute on function testdb.fn_add to ’dba’@’localhost’
注意:修改完權限以后 一定要刷新服務,或者重啟服務,刷新服務用:FLUSH PRIVILEGES。
MySQL權限級別介紹
- MySQL權限級別
- 全局性的管理權限,作用于整個MySQL實例級別
- 數據庫級別的權限,作用于某個指定的數據庫上或者所有的數據庫上
- 數據庫對象級別的權限,作用于指定的數據庫對象上(表、視圖等)或 者所有的數據庫對象上
- 權限存儲在mysql庫的user, db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啟動后就加載到內存中
MySQL權限級別介紹
對比root用戶在幾個權限系統表中的數據
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權限詳解(1)
- All/All Privileges權限代表全局或者全數據庫對象級別的所有權限
- Alter權限代表允許修改表結構的權限,但必須要求有create和insert權 限配合。如果是rename表名,則要求有alter和drop原表,create和 insert新表的權限
- Alter routine權限代表允許修改或者刪除存儲過程、函數的權限
- Create權限代表允許創建新的數據庫和表的權限
- Createroutine權限代表允許創建存儲過程、函數的權限
- Createtablespace權限代表允許創建、修改、刪除表空間和日志組的權 限
- Create temporary tables權限代表允許創建臨時表的權限
- Createuser權限代表允許創建、修改、刪除、重命名user的權限
- Createview權限代表允許創建視圖的權限
MySQL權限詳解(2)
? Delete權限代表允許刪除行數據的權限
? Drop權限代表允許刪除數據庫、表、視圖的權限,包括truncatetable命令
? Event權限代表允許查詢,創建,修改,刪除MySQL事件
? Execute權限代表允許執行存儲過程和函數的權限
? File權限代表允許在MySQL可以訪問的目錄進行讀寫磁盤文件操作,可使用 的命令包括load data infile,select ... into outfile,load file()函數
? Grant option權限代表是否允許此用戶授權或者收回給其他用戶你給予的權 限
? Index權限代表是否允許創建和刪除索引
? Insert權限代表是否允許在表里插入數據,同時在執行analyze table,optimize table,repair table語句的時候也需要insert權限
? Lock權限代表允許對擁有select權限的表進行鎖定,以防止其他鏈接對此表 的讀或寫
MySQL權限詳解(3)
? Process權限代表允許查看MySQL中的進程信息,比如執行showprocesslist,
? Reference權限是在5.7.6版本之后引入,代表是否允許創建外鍵
? Reload權限代表允許執行flush命令,指明重新加載權限表到系統內存中, refresh命令代表關閉和重新開啟日志文件并刷新所有的表
? Replication client權限代表允許執行show master status,show slave status,show binary logs命令
? Replication slave權限代表允許slave主機通過此用戶連接master以便建立主從 復制關系
? Select權限代表允許從表中查看數據,某些不查詢表數據的select執行則不需 要此權限,如Select 1+1,Select PI()+2;而且select權限在執行update/delete 語句中含有where條件的情況下也是需要的
? Showdatabases權限代表通過執行showdatabases命令查看所有的數據庫名
? Show view權限代表通過執行show create view命令查看視圖創建的語句mysqladmin processlist, show engine等命令
MySQL權限詳解(4)
? Shutdown權限代表允許關閉數據庫實例,執行語句包括mysqladmin shutdown
? Super權限代表允許執行一系列數據庫管理命令,包括kill強制關閉某個連接 命令,change master to創建復制關系命令,以及create/alter/drop server等命 令
? Trigger權限代表允許創建,刪除,執行,顯示觸發器的權限
? Update權限代表允許修改表中的數據的權限
? Usage權限是創建一個用戶之后的默認權限,其本身代表連接登錄權限
系統權限表
? 權限存儲在mysql庫的user,db, tables_priv, columns_priv, and procs_priv這幾個系統表中,待MySQL實例啟動后就加載到內存中
? User表:存放用戶賬戶信息以及全局級別(所有數據庫)權限,決定了 來自哪些主機的哪些用戶可以訪問數據庫實例,如果有全局權限則意味
著對所有數據庫都有此權限
? Db表:存放數據庫級別的權限,決定了來自哪些主機的哪些用戶可以訪 問此數據庫
? Tables_priv表:存放表級別的權限,決定了來自哪些主機的哪些用戶可以 訪問數據庫的這個表
? Columns_priv表:存放列級別的權限,決定了來自哪些主機的哪些用戶可 以訪問數據庫表的這個字段
? Procs_priv表:存放存儲過程和函數級別的權限
? User和db權限表結構
? User權限表結構中的特殊字段
? Plugin,password,authentication_string三個字段存放用戶認證信息
? Password_expired設置成’Y’則表明允許DBA將此用戶的密碼設置成過期而 且過期后要求用戶的使用者重置密碼(alter user/set password重置密碼)
? Password_last_changed作為一個時間戳字段代表密碼上次修改時間,執 行create user/alter user/set password/grant等命令創建用戶或修改用戶密 碼時此數值自動更新
? Password_lifetime代表從password_last_changed時間開始此密碼過期的天 數
? Account_locked代表此用戶被鎖住,無法使用
? Tables_priv和columns_priv權限表結構
? Timestamp和grantor兩個字段暫時沒用
? Tables_priv和columns_priv權限值
? procs_priv權限表結構
? Routine_type是枚舉類型,代表是存儲過程還是函數
? Timestamp和grantor兩個字段暫時沒用
? 系統權限表字段長度限制表
? 權限認證中的大小寫敏感問題
? 字段user,password,authencation_string,db,table_name大小寫敏感
? 字段host,column_name,routine_name大小寫不敏感
? User用戶大小寫敏感
? Host主機名大小寫不敏感
mysql> create user abc@Localhost; ERROR 1396 (HY000): Operation CREATE USER failed for 'abc'@'localhost'MySQL授權用戶
? MySQL的授權用戶由兩部分組成:用戶名和登錄主機名
? 表達用戶的語法為‘user_name’@‘host_name’
? 單引號不是必須,但如果其中包含特殊字符則是必須的
? ‘’@‘localhost’代表匿名登錄的用戶
? Host_name可以使主機名或者ipv4/ipv6的地址。Localhost代表本機,127.0.0.1代表ipv4的 本機地址,::1代表ipv6的本機地址
? Host_name字段允許使用%和_兩個匹配字符,比如’%’代表所有主機,’%.mysql.com’代表 來自mysql.com這個域名下的所有主機,‘192.168.1.%’代表所有來自192.168.1網段的主機
MySQL修改權限的生效
? 執行Grant,revoke,setpassword,renameuser命令修改權限之后,MySQL會自動
將修改后的權限信息同步加載到系統內存中
? 如果執行insert/update/delete操作上述的系統權限表之后,則必須再執行刷 新權限命令才能同步到系統內存中,刷新權限命令包括:flush privileges/mysqladmin flush-privileges/mysqladmin reload
? 如果是修改tables和columns級別的權限,則客戶端的下次操作新權限就會生 效
? 如果是修改database級別的權限,則新權限在客戶端執行use database命令后 生效
? 如果是修改global級別的權限,則需要重新創建連接新權限才能生效
? --skip-grant-tables可以跳過所有系統權限表而允許所有用戶登錄,只在特殊 情況下暫時使用
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創建MySQL用戶
? 有兩種方式創建MySQL授權用戶
? 執行createuser/grant命令(推薦方式)
? 通過insert語句直接操作MySQL系統權限表
創建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用戶權限
? 通過revoke命令收回用戶權限
mysql> revoke select on `sys`.`sys_config` from 'mysql.sys'@localhost;刪除MySQL用戶
? 通過執行drop user命令刪除MySQL用戶
mysql> DROP USER 'jeffrey'@'localhost';設置MySQL用戶資源限制
? 通過設置全局變量max_user_connections可以限制所有用戶在同一時 間連接MySQL實例的數量,但此參數無法對每個用戶區別對待,所以 MySQL提供了對每個用戶的資源限制管理
? MAX_QUERIES_PER_HOUR:一個用戶在一個小時內可以執行查詢的次 數(基本包含所有語句)
? MAX_UPDATES_PER_HOUR:一個用戶在一個小時內可以執行修改的次 數(僅包含修改數據庫或表的語句)
? MAX_CONNECTIONS_PER_HOUR:一個用戶在一個小時內可以連接 MySQL的時間
? MAX_USER_CONNECTIONS:一個用戶可以在同一時間連接MySQL實例 的數量
? 從5.0.3版本開始,對用戶‘user’@‘%.example.com’的資源限制是指所有 通過example.com域名主機連接user用戶的連接,而不是分別指從 host1.example.com和host2.example.com主機過來的連接
設置MySQL用戶資源限制
? 通過執行createuser/alteruser設置/修改用戶的資源限制
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;? 取消某項資源限制既是把原先的值修改成0
mysql> ALTER USER 'francis'@'localhost' WITH MAX_CONNECTIONS_PER_HOUR 0;? 當針對某個用戶的max_user_connections非0時,則忽略全局系統參數 max_user_connections,反之則全局系統參數生效
設置MySQL用戶的密碼
? 執行create user創建用戶和密碼
? 修改用戶密碼的方式包括:
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');設置MySQL用戶密碼過期策略
? 設置系統參數default_password_lifetime作用于所有的用戶賬戶
? default_password_lifetime=180 設置180天過期
? default_password_lifetime=0 設置密碼不過期
? 如果為每個用戶設置了密碼過期策略,則會覆蓋上述系統參數
? 手動強制某個用戶密碼過期
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
通過執行create user/alter user命令中帶account lock/unlock子句設 置用戶的lock狀態
Createuser語句默認的用戶是unlock狀態
企業應用中的常規MySQL用戶
? 企業生產系統中MySQL用戶的創建通常由DBA統一協調創建,而且按需
創建
? DBA通常直接使用root用戶來管理數據庫
? 通常會創建指定業務數據庫上的增刪改查、臨時表、執行存儲過程的權限給應 用程序來連接數據庫
? 通常也會創建指定業務數據庫上的只讀權限給特定應用程序或某些高級別人員 來查詢數據,防止數據被修改
Create user app_readonly identified by ‘mysql’; Grant select on esn.* to app_readonly identified by ‘mysq’;總結
以上是生活随笔為你收集整理的mysql安全权限的讲解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库教程-张晨光-专题视频
- 下一篇: EA强大的画图工具---设计数据库表格