日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

第四章:4.2MySQL 权限系统介绍

發布時間:2025/4/9 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四章:4.2MySQL 权限系统介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

4.2.1 權限系統簡介
  MySQL 的權限系統在實現上比較簡單,相關權限信息主要存儲在幾個被稱為grant
tables 的系統表中,即: mysql.User,mysql.db,mysql.Host,mysql.table_priv 和
mysql.column_priv。由于權限信息數據量比較小,而且訪問又非常頻繁,所以Mysql 在啟
動的時候,就會將所有的權限信息都Load 到內存中保存在幾個特定的結構中。所以才有我
們每次手工修改了權限相關的表之后,都需要執行“FLUSH PRIVILEGES”命令重新加載MySQL
的權限信息。當然,如果我們通過GRANT,REVOKE 或者DROP USER 命令來修改相關權限,則
不需要手工執行FLUSH PRIVILEGES 命令,因為通過GRANT,REVOKE 或者DROP USER 命令所
做的權限修改在修改系統表的同時也會更新內存結構中的權限信息。在MySQL5.0.2 或更高
版本的時候,MySQL 還增加了CREATE USER 命令,以此創建無任何特別權限(僅擁有初始USAGE
權限)的用戶,通過CREATE USER 命令創建新了新用戶之后,新用戶的信息也會自動更新到
內存結構中。所以,建議讀者一般情況下盡量使用GRANT,REVOKE,CREATE USER 以及DROP
USER 命令來進行用戶和權限的變更操作,盡量減少直接修改grant tables 來實現用戶和權
限變更的操作。

4.2.2 權限授予與去除
  要為某個用戶授權,可以使用GRANT 命令,要去除某個用戶已有的權限則使用REVOKE
命令。當然,出了這兩者之外還有一種比較暴力的辦法,那就是直接更新grant tables 系
統表。當給某個用戶授權的時候,不僅需要指定用戶名,同時還要指定來訪主機。如果在授
權的時候僅指定用戶名,則MySQL 會自動認為是對'username'@'%'授權。要去除某個用戶的
的權限同樣也需要指定來訪主機。
  可能有些時候我們還會需要查看某個用戶目前擁有的權限,這可以通過兩個方式實現,
首先是通過執行“SHOW GRANTS FOR 'username'@'hostname'” 命令來獲取之前該用戶身上
的所有授權。另一種方法是查詢grant tables 里面的權限信息。

4.2.3 權限級別
MySQL 中的權限分為五個級別,分別如下:
1、Global Level:
  Global Level 的權限控制又稱為全局權限控制,所有權限信息都保存在mysql.user 表
中。Global Level 的所有權限都是針對整個mysqld 的,對所有的數據庫下的所有表及所有
字段都有效。如果一個權限是以Global Level 來授予的,則會覆蓋其他所有級別的相同權
限設置。比如我們首先給abc 用戶授權可以UPDATE 指定數據庫如test 的t 表,然后又在
全局級別REVOKE 掉了abc 用戶對所有數據庫的所有表的UPDATE 權限。則這時候的abc 用戶
將不再擁有用對test.t 表的更新權限。Global Level 主要有如下這些權限(見表4-1):

  要授予Global Level 的權限,則只需要在執行GRANT 命令的時候,用“*.*”來指定適
用范圍是Global 的即可,當有多個權限需要授予的時候,也并不需要多次重復執行GRANT
命令,只需要一次將所有需要的權限名稱通過逗號(“,”)分隔開即可,如下:
  

  root@localhost : mysql 05:14:35> GRANT SELECT,UPDATE,DELETE,INSERT ON *.*
TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)

?

2、Database Level

  Database Level 是在Global Level 之下,其他三個Level 之上的權限級別,其作用域
即為所指定整個數據庫中的所有對象。與Global Level 的權限相比,Database Level 主要
少了以下幾個權限:CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION
SLAVE,SHOW DATABASES,SHUTDOWN,SUPER 和USAGE 這幾個權限,沒有增加任何權限。之
前我們說過Global Level 的權限會覆蓋底下其他四層的相同權限,Database Level 也一樣,
雖然他自己可能會被Global Level 的權限設置所覆蓋,但同時他也能覆蓋比他更下層的
Table,Column 和Routine 這三層的權限。

如果要授予Database Level 的權限,則可以有兩種實現方式:
1、在執行GRANT 命令的時候,通過“database.*”來限定權限作用域為database 整個
數據庫,如下:
  

  root@localhost : mysql 06:06:26> GRANT ALTER ON test.* TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 06:12:45> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT ALTER ON `test`.* TO 'def'@'localhost' |
+------------------------------------------------------------------+

2、先通過USE 命令選定需要授權的數據庫,然后通過“*”來限定作用域,這樣授權的
作用域實際上就是當前選定的整個數據庫。
  root@localhost : mysql 06:14:05> USE test;
Database changed
root@localhost : test 06:13:10> GRANT DROP ON * TO 'def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 06:15:26> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT DROP, ALTER ON `test`.* TO 'def'@'localhost' |
+------------------------------------------------------------------+

  在授予權限的時候,如果有相同的權限需要授予多個用戶,我們也可以在授權語句中一
次寫上多個用戶信息,通過逗號(,)分隔開就可以了,如下:
root@localhost : mysql 05:22:32> grant create on perf.* to
'abc'@'localhost','def'@'localhost';
Query OK, 0 rows affected (0.00 sec)
root@localhost : mysql 05:22:46> SHOW GRANTS FOR def@localhost;
+------------------------------------------------------------------+
| Grants for def@localhost |
+------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'def'@'localhost' |
| GRANT DROP, ALTER ON `test`.* TO 'def'@'localhost' |
| GRANT CREATE ON `perf`.* TO 'def'@'localhost' |
+------------------------------------------------------------------
+

3 rows in set (0.00 sec)
root@localhost : mysql 05:23:13> SHOW GRANTS FOR abc@localhost;
+------------------------------------------------------------------+
| Grants for abc@localhost |
+------------------------------------------------------------------+
| GRANT CREATE ON `perf`.* TO 'abc'@'localhost' |
| GRANT SELECT ON `test`.* TO 'abc'@'localhost' |
+------------------------------------------------------------------+
3 rows in set (0.00 sec)

3、Table Level
  Database Level 之下就是Table Level 的權限了,Table Level 的權限可以被Global
Level 和Database Level 的權限所覆蓋,同時也能覆蓋Column Level 和Routine Level 的
權限。

  Table Level 的權限作用范圍是授權語句中所指定數據庫的指定表。如可以通過如下語
句給test 數據庫的t1 表授權:
root@localhost : test 12:02:15> GRANT INDEX ON test.t1 TO
'abc'@'%.jianzhaoyang.com';
Query OK, 0 rows affected, 1 warning (0.00 sec)
root@localhost : test 12:02:53> SHOW GRANTS FOR 'abc'@'%.jianzhaoyang.com';
+----------------------------------------------------------+
| Grants for abc@*.jianzhaoyang.com |
+----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%.jianzhaoyang.com' |
| GRANT INDEX ON `test`.`t1` TO 'abc'@'%.jianzhaoyang.com' |
+----------------------------------------------------------+

  上面的授權語句在測試給test 數據庫的t1 表授予Table Level 的權限的同時,還測試
了將權限授予含有通配符“%”的所有“.jianzhaoyang.com”主機。其中的USAGE 權限是每
個用戶都有的最基本權限。
  Table Level 的權限由于其作用域僅限于某個特定的表,所以權限種類也比較少,僅有
ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT UPDATE 這八種權限。

4、Column Level
  Column Level 的權限作用范圍就更小了,僅僅是某個表的指定的某個(活某些)列。
由于權限的覆蓋原則,Column Level 的權限同樣可以被Global,Database,Table 這三個
級別的權限中的相同級別所覆蓋,而且由于Column Level 所針對的權限和Routine Level
的權限作用域沒有重合部分,所以不會有覆蓋與被覆蓋的關系。針對Column Level 級別的
權限僅有INSERT,SELECT 和UPDATE 這三種。Column Level 的權限授權語句語法基本和Table
Level 差不多,只是需要在權限名稱后面將需要授權的列名列表通過括號括起來,如下:
   root@localhost : test 12:14:46> GRANT SELECT(id,value) ON test.t2 TO
'abc'@'%.jianzhaoyang.com';
Query OK, 0 rows affected(0.00 sec)
root@localhost : test 12:16:49> SHOW GRANTS FOR 'abc'@'%.jianzhaoyang.com';
+-----------------------------------------------------------------------+
| Grants for abc@*.jianzhaoyang.com |
+-----------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%.jianzhaoyang.com' |
| GRANT SELECT (value, id) ON `test`.`t2` TO 'abc'@'%.jianzhaoyang.com' |
| GRANT INDEX ON `test`.`t1` TO 'abc'@'%.jianzhaoyang.com' |
+-----------------------------------------------------------------------+

注意:當某個用戶在向某個表插入(INSERT)數據的時候,如果該用戶在該表中某列上
面沒有INSERT 權限,則該列的數據將以默認值填充。這一點和很多其他的數據庫都有一些
區別,是MySQL 自己在SQL 上面所做的擴展。

5、Routine Level
  Routine Level 的權限主要只有EXECUTE 和ALTER ROUTINE 兩種,主要針對的對象是
procedure 和function 這兩種對象,在授予Routine Level 權限的時候,需要指定數據庫
和相關對象,如:
  root@localhost : test 04:03:26> GRANT EXECUTE ON test.p1 to
  'abc'@'localhost';
  Query OK, 0 rows affected (0.00 sec)
除了上面幾類權限之外,還有一個非常特殊的權限GRANT,擁有GRANT 權限的用戶可以

  除了上面幾類權限之外,還有一個非常特殊的權限GRANT,擁有GRANT 權限的用戶可以
將自身所擁有的任何權限全部授予其他任何用戶,所以GRANT 權限是一個非常特殊也非常重
要的權限。GRANT 權限的授予方式也和其他任何權限都不太一樣,通常都是通過在執行GRANT
授權語句的時候在最后添加WITH GRANT OPTION 子句達到授予GRANT 權限的目的。

  此外,我們還可以通過GRANT ALL 語句授予某個Level 的所有可用權限給某個用戶,
如:
root@localhost : test 04:15:48> grant all on test.t5 to 'abc';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 04:27:39> grant all on perf.* to 'abc';
Query OK, 0 rows affected (0.00 sec)
root@localhost : test 04:27:52> show grants for 'abc';
+--------------------------------------------------+
| Grants for abc@% |
+--------------------------------------------------+
| GRANT USAGE ON *.* TO 'abc'@'%' |
| GRANT ALL PRIVILEGES ON `perf`.* TO 'abc'@'%' |
| GRANT ALL PRIVILEGES ON `test`.`t5` TO 'abc'@'%' |
+--------------------------------------------------+

  在以上五個Level 的權限中,Table、Column 和Routine 三者在授權中所依賴(或者引
用)的對象必須是已經存在的,而不像Database Level 的權限授予,可以在當前不存在該
數據庫的時候就完成授權。

4.2.4 MySQL訪問控制實現原理

  MySQL 訪問控制實際上由兩個功能模塊共同組成,從第一篇的第二章架構組成中可以看
到,一個是負責“看守MySQL 大門”的用戶管理模塊,另一個就是負責監控來訪者每一個動
作的訪問控制模塊。用戶管理模塊決定造訪客人能否進門,而訪問控制模塊則決定每個客人
進門能拿什么不能拿什么。下面是一張MySQL 中實現訪問控制的簡單流程圖(見圖4-2):

1、用戶管理
  我們先看看用戶管理模塊是如何工作的。在MySQL 中,用戶訪問控制部分的實現比較簡
單,所有授權用戶都存放在一個系統表中:mysql.user,當然這個表不僅僅存放了授權用戶
的基本信息,還存放有部分細化的權限信息。用戶管理模塊需要使用的信息很少,主要就是
Host,User,Password 這三項,都在mysql.user 表中,如下:

sky@localhost : (none) 12:35:04> USE mysql;
Database changed
sky@localhost : mysql 12:35:08> DESC user;
+---------------+--------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------------+------+-----+---------+-------+
| Host | char(60) | NO | PRI | | |
| User | char(16) | NO | PRI | | |
| Password | char(41) | NO | | | |
... ...
+---------------+--------------------+------+-----+---------+-------+

  一個用戶要想訪問MySQL,至少需要提供上面列出的這三項數據,MySQL 才能判斷是否
該讓他“進門”。這三項實際上由量部分組成:訪問者來源的主機名(或者主機IP 地址信息)
和訪問者的來訪“暗號”(登錄用戶名和登錄密碼),這兩部分中的任何一個沒有能夠匹配上
都無法讓看守大門的用戶管理模塊乖乖開門。其中Host 信息存放的是MySQL 允許所對應的
User 的信任主機,可以是某個具體的主機名(如:mytest)或域名(如:www.domain.com),
也可以是以“%”來充當通配符的某個域名集合(如:%.domain.com);也可以是一個具體的
IP 地址(如:1.2.3.4),同樣也可以是存在通配符的域名集合(如:1.2.3.%);還可以用“%”
來代表任何主機,就是不對訪問者的主機做任何限制。如以下設置:
root@localhost : mysql 01:18:12> SELECT host,user,password FROM user ORDER BY
user;

  但是這里有一個比較特殊的訪問限制,如果要通過localhost 訪問的話,必須要有一條
專門針對localhost 的授權信息,即使不對任何主機做限制也不行。如下例所示,存在def@%
的用戶設置,但是如果不使用-h 參數來訪問,則登錄會被拒絕,因為mysql 在默認情況下
會連接localhost:

sky@sky:~$ mysql -u def -p
Enter password:
ERROR 1045 (28000): Access denied for user 'def'@'localhost' (using
password: YES)

  但是當通過-h 參數,明確指定了訪問的主機地址之后就沒問題了,如下:
sky@sky:~$ mysql -u def -p -h 127.0.0.1
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 17
Server version: 5.0.51a-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
def@127.0.0.1 : (none) 01:26:04>

?

  如果我們有一條localhost 的訪問授權則可以不使用-h 參數來指定登錄host 而連接默
認的localhost:
sky@sky:~$ mysql -u abc -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.0.51a-log Source distribution
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
abc@localhost : (none) 01:27:19> exit
Bye

  如果MySQL 正在運行之中的時候,我們對系統做了權限調整,那調整之后的權限什么時
候會生效呢?
  我們先了解何時MySQL 存放于內存結構中的權限信息被更新:FLUSH PRIVILEGES 會強
行讓MySQL 更新Load 到內存中的權限信息;GRANT、REVOKE 或者CREATE USER 和DROP USER
操作會直接更新內存中俄權限信息;重啟MySQL 會讓MySQL 完全從grant tables 中讀取權
限信息。

  那內存結構中的權限信息更新之后對已經連接上的用戶何時生效呢?
  對于Global Level 的權限信息的修改,僅僅只有更改之后新建連接才會用到,對于已
經連接上的session 并不會受到影響。而對于Database Level 的權限信息的修改,只有當
客戶端請求執行了“USE database_name”命令之后,才會在重新校驗中使用到新的權限信
息。所以有些時候如果在做了比較緊急的Global 和Database 這兩個Level 的權限變更之后,
可能需要通過“KILL”命令將已經連接在MySQL 中的session 殺掉強迫他們重新連接以使
用更新后的權限。對于Table Level 和Column Level 的權限,則會在下一次需要使用到該
權限的Query 被請求的時候生效,也就是說,對于應用來講,這兩個Level 的權限,更新之
后立刻就生效了,而不會需要執行“KILL”命令。

2、訪問控制
  當客戶端連接通過用戶管理模塊的驗證,可連接上MySQL Server 之后,就會發送各種
Query 和Command 給MySQL Server,以實現客戶端應用的各種功能。當MySQL 接收到客戶
端的請求之后,訪問控制模塊是需要校驗該用戶是否滿足提交的請求所需要的權限。權限校
驗過程是從最大范圍的權限往最小范圍的權限開始依次校驗所涉及到的每個對象的每個權
限。

  在驗證所有所需權限的時候,MySQL 首先會查找存儲在內存結構中的權限數據,首先查
找Global Level 權限,如果所需權限在Global Level 都有定義(GRANT 或者REVOKE),
則完成權限校驗(通過或者拒絕),如果沒有找到所有權限的定義,則會繼續往后查找
Database Level 權限,進行Global Level 未定義的所需權限的校驗,如果仍然沒有能夠
找到所有所需權限的定義,MySQL 會繼續往更小范圍的權限定義域查找,也就是Table
Level,最后則是Column Level 或者Routine Level。

  下面我們就以客戶端通過abc@localhost 連接后請求如下Query 我為例:
SELECT id,name FROM test.t4 where status = 'deleted';

?

  在前面我們了解到MySQL 的grant tables 有mysql.user,mysql.db,mysql.host,
mysql.table_priv 和mysql.column_priv 這五個,我想出了mysql.host 之外的四個都是非
常容易理解的,每一個表針對MySQL 中的一種邏輯對象,存放某一特定Level 的權限,唯獨
mysql.host 稍有區別。我們現在就來看看mysql.host 權限表到底在MySQL 的訪問控制中充
當了一個什么樣的角色呢?

  mysql.host在MySQL 訪問控制模塊中所實現的功能比較特殊,和其他幾個grant tables
不太一樣。首先是mysql.host 中的權限數據不是(也不能)通過GRANT 或者REVOKE 來授予
或者去除,必須通過手工通過INSERT、UPDATE 和DELETE 命令來修改其中的數據。其次是
其中的權限數據無法單獨生效,必須通過和mysql.db 權限表的數據一起才能生效。而且僅
當mysql.db 中存在不完整(某些場景下的特殊設置)的時候,才會促使訪問控制模塊再結
合mysql.host 中查找是否有相應的補充權限數據實現以達到權限校驗的目的,就比如上圖
中所示。在mysql.db 中無法找到滿足權限校驗的所有條件的數據(db.User = 'abc' AND
db.host = 'localhost' AND db.Database_name = 'test'),則說明在mysql.db 中無法完
成權限校驗,所以也不會直接就校驗db.Select_priv 的值是否為'Y'。但是mysql.db 中有
db.User = 'abc' AND db.Database_name = 'test' AND db.host = '' 這樣一條權限信息
存在,大家可能注意到了這條權限信息中的db.host 中是空值,注意是空值而不是'%'這個
通配符哦。當MySQL 注意到有這樣一條權限信息存在的時候,就該是mysql.host 中所存放
的權限信息出場的時候了。這時候,MySQL 會檢測mysql.host 中是否存在滿足如下條件的
權限信息:host.Host = 'localhost' AND host.Db = 'test'。如果存在,則開始進行
Select_priv 權限的校驗。由于權限信息存在于mysql.db 和mysql.host 兩者之中,而且是
兩者信息合并才能滿足要求,所以Select_priv 的校驗也需要兩表都為'Y'才能滿足要求,
通過校驗。

  我們已經清楚,MySQL 的權限是授予“username@hostname”的,也就是說,至少需要
用戶名和主機名二者才能確定一個訪問者的權限。又由于hostname 可以是一個含有通配符
的域名,也可以是一個含有通配符的IP 地址段。那么如果同一個用戶有兩條權限信息,一
條是針對特定域名的,另外一個是含有通配符的域名,而且前者屬于后者包含。這時候MySQL
如何來確定權限信息呢?實際上MySQL 永遠優先考慮更精確范圍的權限。在MySQL 內部會按
照username 和hostname 作一個排序,對于相同username 的權限,其host 信息越接近訪問
者的來源host,則排序位置越靠前,則越早被校驗使用到。而且,MySQL 在權限校驗過程中,
只要找到匹配的權限之后,就不會再繼續往后查找是否還有匹配的權限信息,而直接完成校
驗過程。

  大家應該也看到了在mysql.user 這個權限表中有max_questions,max_updates,
max_connections,max_user_connections 這四列,前面三列是從MySQL4.0.2 版本才開始
有的,其功能是對訪問用戶進行每小時所使用資源的限制,而最后的max_user_connections
則是從MySQL5.0.3 版本才開始有的,他和max_connections 的區別是限制耽擱用戶的連接
總次數,而不是每小時的連接次數。而要使這四項限制生效,需要在創建用戶或者給用戶授
權的時候加上以下四種子句:
max_questions : WITH MAX_QUERIES_PER_HOUR n;
max_updates : WITH MAX_UPDATES_PER_HOUR n;
max_connections : WITH MAX_CONNECTIONS_PER_HOUR n;
max_user_connections: MAX_USER_CONNECTIONS。
四個子句可以同時使用,如:

“ WITH MAX_QUERIES_PER_HOUR 5000 MAX_CONNECTIONS_PER_HOUR 10
MAX_USER_CONNECTIONS 10000”。

?

4.3MySQL 訪問授權策略

  首先,需要了解來訪主機。

通過使用具體的主機名和IP 地址來限定來訪主機。

  其次,了解用戶需求。

了解用戶相對該系統扮演什么角色,比如是只讀的,還是讀寫兼用的等等。

  再次,要為工作分類。

  比如將執行備份工作、復制工作、常規應用訪問、只讀應用訪問和日常管理
工作分別分理出單獨的特定帳戶來授予各自所需權限。這樣,既可以讓安全風險盡量降低,
也可以讓同類同級別的相似權限合并在一起,不互相交織在一起。對于PROCESS,FILE 和
SUPER 這樣的特殊權限,僅僅只有管理類帳號才需要,不應該授予其他非管理帳號。

  最后,確保只有絕對必要者擁有GRANT OPTION 權限。
之前在權限系統介紹的時候我們已經了解到GRANT OPTION 權限的特殊性,和擁有該權
限之后的潛在風險,所以在這里也就不再累述了。總之,為了安全考慮,擁有GRANT OPTION
權限的用戶越少越好,盡可能只讓擁有超級權限的用戶才擁有GRANT OPTION 權限。

4.4 安全設置注意事項

僅僅提供本地訪問,禁止網絡服務,

啟動MySQL的時候通過使用“--skip-networking”參數選項,讓MySQL 不通過TCP/IP 監聽網絡請求,
而僅僅通過命名管道或共享內存(在Windows 中)或Unix 套接字文件(在Unix 中)來和客戶端
連接交互。

其次,在第二層防線主機上面也有以下一些需要注意的地方。

OS 安全方面。關閉MySQL Server 主機上面任何不需要的服務,這不僅能從安全方面減
少潛在隱患,還能減輕主機的部分負擔,盡可能提高性能。

  用非root 用戶運行MySQL。這在MySQL 官方文檔中也有非常明顯的提示,提醒用戶不
要使用root 用戶來運行MySQL。因為如果使用root 用戶運行MySQL,那么mysqld 的進程就
會擁有root 用戶所擁有的權限,任何具有FILE 權限的MySQL 用戶就可以在MySQL 中向系統
中的任何位置寫入文件。

  文件和進程安全。合理設置文件的權限屬性,MySQL 相關的數據和日志文件和所在的文
件夾屬主和所屬組都設置為mysql,且禁用其他所有用戶(除了擁有超級權限的用戶,如
root)的讀寫權限。以防止數據或者日志文件被竊取或破壞。因為如果一個用戶對MySQL
的數據文件有讀取權限的話,可以很容易將數據復制。binlog 文件也很容易還原整個數據
庫。而如果有寫權限的話就更糟了,因為有了寫權限,數據或者日志文件就有被破壞或者刪
除的風險存在。保護好socket 文件的安全,盡量不要使用默認的位置(如/tmp/mysql.sock),
以防止被有意或無意的刪除。

  再次,就是最后第三道防線MySQL 自身方面的安全設置注意事項。

用戶設置。我們必須確保任何可以訪問數據庫的用戶都有一個比較復雜的內容作為密
碼,而不是非常簡單或者比較有規律的字符,以防止被使用字典破解程序攻破。在MySQL
初始安裝完成之后,系統中可能存在一個不需要任何密碼的root 用戶,有些版本安裝完成
之后還會存在一個可以通過localhost 登錄的沒有用戶名和密碼的帳號。這些帳號會給系統
帶來極大的安全隱患,所以我們必須在正式啟用之前盡早刪除,或者設置一個比較安全的密
碼。對于密碼數據的存放,也不要存放在簡單的文本文件之中,而應該使用專業密碼管理軟
件來管理(如KeePass)。同時,就像之前在網絡安全注意事項部分講到的那樣,盡可能為
每一個帳戶限定一定范圍的可訪問主機。尤其是擁有超級權限的MySQL root 帳號,盡量確
保只能通過localhost 訪問。

安全參數

  在MySQL 官方參考手冊中也有說明,不論是從安全方面考慮還是從性能以及
功能穩定性方面考慮,不需要使用的功能模塊盡量都不要啟用。例如,如果不需要使用用戶
自定義函數,就不要在啟動的時候使用“--allow-suspicious-udfs”參數選項,以防止被
別有居心的潛在威脅者利用此功能而對MySQL 的安全造成威脅;不需要從本地文件中Load
數據到數據庫中,就使用“--local-infile=0”禁用掉可以從客戶端機器上Load 文件到數
據庫中;使用新的密碼規則和校驗規則(不要使用“--old-passwords”啟動數據庫),這項
功能是為了兼容舊版本的密碼校驗方式的,如無額數必要,不要使用該功能,舊版本的密碼
加密方式要比新的方式在安全方面弱很多。

  除了以上這三道防線,我們還應該讓連接MySQL 數據庫的應用程序足夠安全,以防止入
侵者通過應用程序中的漏洞而入侵到應用服務器,最終通過應用程序中的數據庫相關關配置
而獲取數據庫的登錄口令。

轉載于:https://www.cnblogs.com/isoftware/p/3706436.html

總結

以上是生活随笔為你收集整理的第四章:4.2MySQL 权限系统介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。