iT邦幫忙

2021 iThome 鐵人賽

DAY 4
0
Software Development

MYSQL-相關實務操作學習紀錄系列 第 4

Day.4 針對使用者做管理 - 權限管理&資安 (Power)

在資料庫管理上,root 相當於擁有所有權限的最大管理者,針對不同使用者規劃給予相應的權限是很重要的。總不能讓所有使用者都有能隨意變更操作系統內容的權限,在資料庫管理安全上勢必會有疑慮和影響。

在資安DB管理上,除了審視建立使用者時是否給予適當權限,同時定期更換帳密也是很重要的一部分。


  • 權限表位置:
    db: mysql -> table: user (紀錄允許連接到服務的帳戶內容)

從頭開始寫文章才發現這個地方有更動XDD -Mysql5.7版後不再使用password作為密碼字段,而是改成authentication_string 所以在之前的圖1這句語法是無法生效的,會噴沒有字段password錯誤。
https://ithelp.ithome.com.tw/upload/images/20210801/201308800lPJFg7lZj.png

還記得安裝完預設root是沒使用密碼登入的嗎!首先來設定重要的root密碼~

  • 瀏覽用戶表
SELECT User, Host, authentication_string, plugin FROM mysql.user;

https://ithelp.ithome.com.tw/upload/images/20210801/201308800uiyLEo22u.png
這邊注意到root地方密碼目前空的沒問題,但plugin欄位使用 auth_socket 這會導致我們用修改密碼SQL語法時無法生效(對於auth_socket 密碼是沒有作用的)!!所以要配置密碼,需要在同一命令中(同時)更改插件和設置密碼。

  • 修改指令
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '1234';

在查詢一次就會看到是正常的了,試著以新密碼登入看看!

  • 修改使用者密碼有以下幾種SQL指令 (示範更改使用者:root)
***  ALTER USER 'root'@'localhost' IDENTIFIED BY '新密碼';
***  SET PASSWORD FOR 'root'@'localhost' = PASSWORD("新密碼");

***  UPDATE mysql.user SET authentication_string = PASSWORD("新密碼") where User = 'root' and Host = 'localhost';
     FLUSH PRIVILEGES; (UPDATE完後要執行這句刷新MySQL的系統權限相關表)

這邊會注意到指令同樣都是更改密碼為何update那句還要flush權限才會生效呢??

透過FLUSH PRIVILEGES會將數據表的數據重建一份內存權限資料,如果內存的權限數據和磁盤數據的權限數據相同,則無需執行FLUSH PRIVILEGES,使用在權限數據可能存在不一致的情況下使用。

使用上來說:

  • 如果用GRANT/REVOKE語句執行的話,內存和數據表的數據應該會保持同步更新的,所以在正常情況下,執行指令後沒必要執行FLUSH PRIVILEGES命令。
  • 當數據表的權限與內存中的權限數據不一致,使用FLUSH PRIVILEGES來重建內存數據。
    解釋:不一致狀態可能由DML操作(EX: UPDATE / DELETE)產生。
    (直接用DML语句操作系統權限表 ex.mysql.user表)

不過在重要的更改root密碼上還是建議flush一下保險~

Q: root密碼出問題忘記登不進去怎麼辦?

A: 在設定檔中配置參數-> skip-grant-tables
(功能:mysql啟動登入時不使用權限表認證,也就是所有使用者都可以不打密碼就做登入!! 所以記得修改完密碼後要去設定檔改回來。)


使用部分呢讓我們用例子解釋常用語法 ex.要新增一個專門給開發人員寫入資料的使用者

  • 新增新使用者 ex.限制使用者連線MYSQL所用ip 172.8.X.X , % = 任何ip
CREATE USER 'dev_write'@'172.8.%' IDENTIFIED BY 'Only2Write' 
  • 看使用者所擁有的權限
SHOW GRANTS FOR 'dev_write'@'172.8.%';
  • 給予使用者特定資料庫powers 的特定操作權限。
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE ON powers.* TO 'dev_write'@'172.8.%' ;

補充: *.* 等於全部資料庫
  • 移除使用者存取資料庫powers的所有權限
REVOKE ALL PRIVILEGES ON powers.* FROM 'dev_write'@'172.8.%';
  • 移除使用者帳號
DROP USER 'dev_write'@'172.8.%';

詳細解釋 權限意義與分類級別參考官方文件這部分-> Privileges Supported by MySQL
https://dev.mysql.com/doc/refman/8.0/en/grant.html

下一篇來帶大家認識 MYSQL系統層相關紀錄日誌~


上一篇
Day.3 環境部署 - 從安裝開始 (GCP & Percona Mysql )
下一篇
Day.5 留個紀錄好辦事 - Mysql Log (日誌紀錄)-上
系列文
MYSQL-相關實務操作學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言