設定資料庫的權限與資料庫安全是息息相關的,如果給予不當的權限可能會有資安疑慮,所以我們必須對權限設置有一定的認識。
MySQL的權限系統是透過兩個階段進行認證的,首先會先對連接用戶的IP與用戶名稱進行身分認證,若驗證不合格將會拒絕連線,連結成功的用戶則可以在其擁有權限對資料庫進行操作。
MySQL帳戶是透過IP與用戶名稱結合而成的,譬如有一個用戶為andy@localhost,代表用戶andy只能透過本機連線到MySQL,
但也可以限制IP來源,只要建立用戶andy@%就可以了,不過這個方式會有資安問題,不太建議使用。
%是代表任何IP。
MySQL的權限表儲存在資料庫「mysql」中,其中資料表user與db最重要,我們就來看一下裡面的內容吧!
Table Name | User | db |
---|---|---|
使用者列 | Host | Host |
User | db | |
user | ||
權限列 | Select_priv | Select_priv |
Insert_priv | Insert_priv | |
Update_priv | Update_priv | |
Delete_priv | Delete_priv | |
Create_priv | Create_priv | |
Drop_priv | Drop_priv | |
Reload_priv | ||
Shutdown_priv | ||
Process_priv | ||
File_priv | ||
Grant_priv | Grant_priv | |
References_priv | References_priv | |
Index_priv | Index_priv | |
Alter_priv | Alter_priv | |
Show_db_priv | ||
Super_priv | ||
Create_tmp_table_priv | Create_tmp_table_priv | |
Lock_tables_priv | Lock_tables_priv | |
Execute_priv | ||
Repl_slave_priv | ||
Repl_client_priv | ||
Create_view_priv | Create_view_priv | |
Show_view_priv | Show_view_priv | |
Create_routine_priv | Create_routine_priv | |
Alter_routine_priv | Alter_routine_priv | |
Create_user_priv | ||
Event_priv | ||
Trigger_priv | ||
Create_tablespace_privc | ||
Execute_priv | ||
Event_priv | ||
Trigger_priv |
根據上方資料表欄位,若使用者有權限,值將會顯示Y,若無權限將會顯示N。
若在User表擁有權限,代表對於所有資料庫的權限,但若只是在db表有權限,則是只對目標資料庫擁有權限。
現在我們就建立一個新用戶Nini,限制只能從本機連線,再給他select全部資料庫的權限。
mysql> create user 'Nini'@'localhost' identified by '密碼';
mysql> grant select on *.* to 'Nini'@'localhost';
查看user表確認Nini擁有select權限。
如下圖,用戶Nini@localhost對所有資料庫已經擁有select權限。
我們再來測試建立一個新用戶chichi,也是限制只能從本機連線,但只給他select資料庫test01的權限。
mysql> create user 'chichi'@'localhost' identified by '密碼';
mysql> grant select on test01.* to 'chichi'@'localhost';
因為chichi只有針對test01資料庫有select權限,不是所有資料庫,所以在user表會顯示N。
查看db表,發現chichi已經有select權限。
當使用者連接時,會先從user表的host、user與authentication_string欄位判斷連結的IP、用戶名稱與密碼是否存在,通過驗證之後會依照下列順序取得資料庫權限。
User – db – tables_priv
在user表中有幾個比較重要的權限,File、Process與Super,這邊也要認識一下。
File:權限可以將資料庫資訊匯出到主機,所以如果有重要資訊,會有很大的安全問題。
Process:可以用來查看所有用戶運行的線程,包括設定與更改密碼。
Super:可以執行kill來終止其他用戶session。
我們在設置權限時一定要基於最小權限原則,否則如果給出不必要的權限,可能會造成資安的疑慮。