開放MySQL白名單
可以通過iptables-save命令確認對應客戶端ip是否可以訪問MySQL服務:
test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.17/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.9.16/32 -p tcp -m tcp --dport 3306 -j ACCEPT |
新增用戶以及授權
創建只讀用戶,并授權特定的表:
-- 創建用戶以及設置密碼,其中%表示任意客戶端 CREATE USER 'read_admin'@'%' IDENTIFIED BY 'Admin123!@#'; -- 授予特定表的SELECT權限 GRANT SELECT ON aa.t_terminal TO 'read_admin'@'%'; GRANT SELECT ON aa.t_assert TO 'read_admin'@'%'; GRANT SELECT ON bb.t_user TO 'read_admin'@'%'; GRANT SELECT ON bb.t_user_group TO 'read_admin'@'%'; -- 為了支持聯表,建議始終授權臨時表的權限 GRANT CREATE TEMPORARY TABLES ON *.* TO 'read_admin'@'%'; -- 刷新權限 FLUSH PRIVILEGES; |
在過程中主要遇到兩個問題:
1、在服務器上已經增加了用戶和授權,但是客戶仍被拒絕
????????這是因為會話沒有更新,最新的授權需要重新登錄獲取
2、所有表的授權已經增加,但是客戶無法聯表查詢
????????這一點之前是沒有想到的,后續增加了臨時表權限解決。也很好理解,聯表查詢的實現是MySQL內部生成臨時表處理,所以需要授權該權限。
另外,可以通過以下命令查詢某個用戶的權限,以下是沒有授權臨時表和授權了臨時表的權限查詢結果對比:
- 未授權臨時表權限
mysql> SHOW GRANTS FOR 'read_admin'@'%'; +----------------------------------------------------------------+ | Grants for read_admin@%??????????????????????????????????????? | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'read_admin'@'%'???????????????????????? | | GRANT SELECT ON `nm`.`t_assert` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user_group` TO 'read_admin'@'%'???? | | GRANT SELECT ON `aas`.`t_user` TO 'read_admin'@'%'?????????? | | GRANT SELECT ON `nm`.`t_terminal` TO 'read_admin'@'%'???? | +----------------------------------------------------------------+ |
- 已授權臨時表權限
mysql> SHOW GRANTS FOR 'read_admin'@'%'; +----------------------------------------------------------------+ | Grants for read_admin@%??????????????????????????????????????? | +----------------------------------------------------------------+ | GRANT CREATE TEMPORARY TABLES ON *.* TO 'read_admin'@'%'?????? | | GRANT SELECT ON `nm`.`t_assert` TO 'read_admin'@'%' | | GRANT SELECT ON `aas`.`t_user_group` TO 'read_admin'@'%'???? | | GRANT SELECT ON `aas`.`t_user` TO 'read_admin'@'%'?????????? | | GRANT SELECT ON `nm`.`t_terminal` TO 'read_admin'@'%'???? | +----------------------------------------------------------------+ |
測試聯表查詢:
SELECT * FROM aa.t_terminal t LEFT JOIN bb.t_user a ON t.account = a.account limit 1;
注意事項總結:
- 如果是HA環境,需要主備數據庫上都執行,因為這類非業務數據是不會自動同步的!!!
- 在創建用戶和授權時,需要使用root賬戶
- 客戶端和服務端初次連接時,會將該用戶的權限信息保存在會話中,如果后續權限發生變化不會更新當前會話中的權限,所以做以上操作后,相關客戶端最好是重新登錄以獲取最新的權限。
- 建議始終授權臨時表的權限,防止客戶需要聯表查詢時候再次處理