# 登入
mysql -u root -p
# 建立帳號 + 指定密碼 + 授權特定庫
CREATE USER 'app_user'@'192.168.1.50' IDENTIFIED BY 'StrongPass#2024';
GRANT SELECT, INSERT, UPDATE, DELETE ON `app_db`.* TO 'app_user'@'192.168.1.50';
FLUSH PRIVILEGES;
| 需求 | SQL |
|---|---|
| 全庫全表最高權限(僅內網) | GRANT ALL PRIVILEGES ON *.* TO 'admin'@'192.168.1.%' IDENTIFIED BY 'Pass#2024' WITH GRANT OPTION; |
| 唯讀帳號(支援備份) | GRANT SELECT, LOCK TABLES, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO 'readonly'@'10.0.0.%' IDENTIFIED BY 'ReadOnly#2024'; |
| 開發帳號(含建表、索引) | GRANT CREATE, ALTER, DROP, INDEX, SELECT, INSERT, UPDATE, DELETE ON `dev_db`.* TO 'dev'@'%' IDENTIFIED BY 'DevPass#2024'; |
-- 撤銷特定權限
REVOKE UPDATE ON `app_db`.* FROM 'app_user'@'192.168.1.50';
-- 撤銷所有權限
REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'app_user'@'192.168.1.50';
-- 刪除帳號(同步清理關聯權限表)
DROP USER 'app_user'@'192.168.1.50';
FLUSH PRIVILEGES;
-- 列出所有帳號
SELECT User, Host FROM mysql.user ORDER BY Host, User;
-- 查看特定帳號權限
SHOW GRANTS FOR 'app_user'@'192.168.1.50';
-- 審計:空密碼、通配符過寬、無權限帳號
SELECT User, Host, authentication_string
FROM mysql.user
WHERE authentication_string = '' OR authentication_string IS NULL
OR Host = '%';
firewall-cmd --permanent --add-port=3306/tcp
# 僅允許特定 IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.50" port port="3306" protocol="tcp" accept'
firewall-cmd --reload
# 插入到 ICMP 規則之前(關鍵順序)
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
# 或限定來源
iptables -I INPUT -s 192.168.1.50 -p tcp --dport 3306 -j ACCEPT
service iptables save
# /etc/my.cnf
[mysqld]
bind-address = 0.0.0.0
# 或具體內網 IP
bind-address = 192.168.1.100
systemctl restart mysqld
# 主機 B 執行
mysql -h 192.168.1.100 -u app_user -p'StrongPass#2024' -e "SELECT VERSION();"
# 或測試連通性
telnet 192.168.1.100 3306
nc -zv 192.168.1.100 3306
FLUSH PRIVILEGES 5.7+ 大多操作自動生效,但手動執行無害。-I 插入頂部。root@%,使用專用帳號 + 最小權限 + 強密碼 + IP 限制。