首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 安全安裝腳本 mysql_secure_installation 逐步詳解與最佳實踐

     編輯:MySQL 資料庫相關知識

腳本功能概覽

`mysql_secure_installation` 是 MySQL 官方提供的安全強化腳本,執行以下五項關鍵操作:

  1. 為 root 用戶設定強密碼
  2. 刪除匿名用戶(`User=''`)
  3. 禁止 root 遠程登入(僅允許 `localhost`/`127.0.0.1`/`::1`)
  4. 刪除測試資料庫 `test` 及其訪問權限
  5. 刷新授權表使變更即時生效

互動式執行完整流程(含預設值與建議選項)

[root@server ~]# mysql_secure_installation

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MySQL
SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY!

Enter current password for root (enter for none): 
# 初次安裝 root 無密碼,直接按 Enter

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MySQL
root user without the proper authorisation.
Set root password? [Y/n] Y
New password: 強密碼(≥12位,大小寫數字特殊字元)
Re-enter new password: 再次輸入
Password updated successfully!
Reloading privilege tables.. Success!

By default, a MySQL installation has an anonymous user...
Remove anonymous users? [Y/n] Y
... Success!

Normally, root should only be allowed to connect from 'localhost'...
Disallow root login remotely? [Y/n] Y  # 如需遠程管理請選 N 並配置防火牆/VPN
... Success!

By default, MySQL comes with a database named 'test'...
Remove test database and access to it? [Y/n] Y
- Dropping test database... Success!
- Removing privileges on test database... Success!

Reloading the privilege tables will ensure that all changes made so far
will take effect immediately.
Reload privilege tables now? [Y/n] Y
... Success!

Cleaning up...
All done! If you've completed all of the above steps, your MySQL
installation should now be secure.
Thanks for using MySQL!

各步驟底層 SQL 等價操作(便於自動化腳本)

-- 1. 設定 root 密碼 (5.7+)
ALTER USER 'root'@'localhost' IDENTIFIED BY '強密碼';
-- 5.6 及以下
SET PASSWORD FOR 'root'@'localhost' = PASSWORD('強密碼');

-- 2. 刪除匿名用戶
DELETE FROM mysql.user WHERE User = '';

-- 3. 禁止 root 遠程登入(保留 localhost/127.0.0.1/::1)
DELETE FROM mysql.user WHERE User = 'root' AND Host NOT IN ('localhost','127.0.0.1','::1');

-- 4. 刪除 test 資料庫及權限
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db = 'test' OR Db = 'test\\_%';

-- 5. 刷新權限
FLUSH PRIVILEGES;

非互動式自動化部署(Shell 腳本範例)

#!/bin/bash
# 適用於 CI/CD 流水線、Ansible、Docker 初始化
ROOT_PWD="$(openssl rand -base64 24)"  # 生成隨機強密碼

mysql -u root -p"${OLD_PWD:-}" <

生產環境額外加固建議(超出腳本範圍)

加固項目實施方式效益
綁定本地回環介面`my.cnf: bind-address = 127.0.0.1`阻斷所有外部網路連線
啟用 SSL/TLS 傳輸加密`require_secure_transport=ON` + 配置憑證防止中間人竊聽/篡改
強制密碼策略安裝 `validate_password` 元件,設長度/複雜度/過期杜絕弱密碼
最小權限原則業務帳號僅授予特定庫/表 SELECT/INSERT/UPDATE縮小洩露影響面
審計日誌啟用 `audit_log` 插件記錄所有查詢/登入/失敗合規與事後追溯
定期輪換密碼腳本配合 `ALTER USER ... PASSWORD EXPIRE`降低長期洩露風險
關閉不需的功能`skip-show-database`、`local_infile=OFF`、`symbolic-links=0`減少攻擊面

常見問題 FAQ

Q: 執行腳本後應用連不上了?
A: 檢查應用使用的帳號是否為 root 且從遠程連線。腳本預設刪除 root 遠程權限。解決:建立專用業務帳號 `CREATE USER 'app'@'%' IDENTIFIED BY 'pwd'; GRANT SELECT,INSERT,UPDATE ON db.* TO 'app'@'%';`
Q: 匿名用戶有什麼危害?
A: 允許無帳密登入,可枚舉資料庫結構、發起 DoS 攻擊、繞過審計。
Q: test 資料庫預設誰能訪問?
A: 所有用戶(含匿名)擁有 `test` 庫及 `test_%` 庫的全部權限,極不安全。
Q: 腳本能重複執行嗎?
A: 可重複執行,第二次會提示 root 密碼已設定,跳過或重設。

總結

`mysql_secure_installation` 是 MySQL 上線前的**必執行基準動作**,耗時不足 1 分鐘卻能消除 80%+ 的預設配置風險。生產環境請結合「非互動式自動化」納入標準化部署流程,並疊加上述「額外加固」構建纵深防禦體系。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved