在阿里云 ECS 服务器上安全地安装和配置 MySQL,需兼顾系统安全、MySQL 本身安全、网络访问控制及运维规范。以下是针对生产环境的详细、分步指南(以 Ubuntu 22.04 / CentOS Stream 9 为例,推荐使用官方 MySQL APT/YUM 仓库安装 MySQL 8.0+,避免系统默认低版本):
✅ 一、前期准备:安全加固基础环境
# 1. 更新系统并升级
sudo apt update && sudo apt upgrade -y # Ubuntu/Debian
# 或
sudo dnf update -y # CentOS Stream/RHEL
# 2. 创建专用系统用户(非 root 运行 MySQL)
sudo adduser --system --group --home /var/lib/mysql --shell /bin/false mysql
# 3. 配置防火墙(启用且仅放行必要端口)
# Ubuntu (UFW)
sudo ufw enable
sudo ufw allow OpenSSH
sudo ufw deny 3306 # 先禁止,后续按需授权(见第四步)
# CentOS (firewalld)
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --remove-port=3306/tcp
sudo firewall-cmd --reload
⚠️ 注意:绝不暴露 3306 端口到公网! 生产环境应通过 VPC 内网访问或跳板机 + SSH 隧道。
✅ 二、安全安装 MySQL(推荐官方源)
▶ Ubuntu/Debian(MySQL 8.0+)
# 下载并安装 MySQL APT 配置包(获取最新稳定版)
wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb # 安装时选择 MySQL Server 8.0
sudo apt update
sudo apt install mysql-server -y
# 安装后立即运行安全脚本(关键!)
sudo mysql_secure_installation
# 按提示操作:
# - 设置 root 密码强度(选 2:STRONG)
# - 修改 root 密码(强密码,如:Mysql@2024!P@ss)
# - 删除匿名用户 → Y
# - 禁止 root 远程登录 → Y(必须!)
# - 删除 test 数据库 → Y
# - 重新加载权限表 → Y
▶ CentOS Stream / RHEL(MySQL 8.0+)
# 添加 MySQL 官方 YUM 仓库
sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm -y
sudo dnf config-manager --disable mysql57-community
sudo dnf config-manager --enable mysql80-community
sudo dnf install mysql-community-server -y
# 启动并启用开机自启
sudo systemctl enable mysqld
sudo systemctl start mysqld
# 获取临时 root 密码(首次启动生成)
sudo grep 'temporary password' /var/log/mysqld.log
# 运行安全初始化(自动执行类似 secure_installation)
sudo mysql_secure_installation
# 同上:设强密码、禁远程 root、删匿名用户/test库等
✅ 三、核心安全配置(编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf)
[mysqld]
# 1. 绑定地址:仅监听内网/本地(绝对禁止 0.0.0.0)
bind-address = 127.0.0.1 # 仅本地访问(推荐)
# 或绑定到 ECS 内网 IP(如 172.16.0.10),确保安全组只允许可信内网IP访问
# bind-address = 172.16.0.10
# 2. 强制 TLS 加密(生产必备)
ssl-mode = REQUIRED
ssl-ca = /var/lib/mysql/ca.pem
ssl-cert = /var/lib/mysql/server-cert.pem
ssl-key = /var/lib/mysql/server-key.pem
# 3. 密码策略(MySQL 8.0+ 默认启用)
default_authentication_plugin = caching_sha2_password
validate_password.policy = STRONG
validate_password.length = 12
validate_password.mixed_case_count = 2
validate_password.number_count = 2
validate_password.special_char_count = 2
# 4. 安全增强
skip_symbolic_links = ON
local_infile = OFF # 禁用 LOAD DATA LOCAL INFILE(防文件读取攻击)
sql_mode = STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
max_connect_errors = 10
wait_timeout = 300
interactive_timeout = 300
# 5. 日志审计(可选但推荐)
log_error = /var/log/mysql/error.log
general_log = OFF
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
🔐 生成自签名 SSL 证书(测试环境可用,生产建议用可信 CA):
sudo mkdir -p /var/lib/mysql sudo mysql_ssl_rsa_setup --datadir=/var/lib/mysql --uid=mysql sudo chown -R mysql:mysql /var/lib/mysql/*.pem
✅ 四、创建应用账号(禁止使用 root!)
-- 登录 MySQL(本地)
sudo mysql -u root -p
-- 创建专用数据库与用户(示例:app_db)
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- 创建用户(仅允许内网IP,如 172.16.0.0/16 或具体应用服务器IP)
CREATE USER 'app_user'@'172.16.0.20' IDENTIFIED BY 'StrongPass!2024'
REQUIRE X509; -- 强制客户端提供有效证书(如启用SSL)
-- 授权最小权限(不给 DROP/CREATE/GRANT 等高危权限)
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_user'@'172.16.0.20';
-- 刷新权限
FLUSH PRIVILEGES;
✅ 验证连接(从应用服务器测试):
mysql -h <ECS内网IP> -u app_user -p --ssl-mode=REQUIRED app_db
✅ 五、ECS 云平台层安全加固
| 项目 | 推荐配置 |
|---|---|
| 安全组 | 仅放行:SSH(22)、MySQL(3306) → 源IP限制为应用服务器内网IP段(如 172.16.0.0/16),禁止 0.0.0.0/0 |
| 实例登录 | 关闭密码登录,强制使用 SSH 密钥对;禁用 root 远程登录 |
| 数据盘 | MySQL 数据目录(/var/lib/mysql)挂载独立云盘,并开启 云盘加密(KMS) |
| 备份 | 开启阿里云 RDS 自动备份(若迁至 RDS)或自建 mysqldump + OSS 定时备份(加密上传) |
| 监控告警 | 配置 CloudMonitor:CPU >80%、连接数 >300、慢查询 >100 次/小时 → 短信/钉钉告警 |
✅ 六、定期维护清单(自动化脚本推荐)
# 1. 每周检查账户权限(发现异常账号)
mysql -Nse "SELECT user,host FROM mysql.user WHERE host != 'localhost' AND user NOT IN ('mysql.session','mysql.sys','healthchecker');"
# 2. 检查过期密码(MySQL 8.0+)
mysql -e "SELECT user,host,password_last_changed FROM mysql.user WHERE password_lifetime > 0;"
# 3. 自动化备份(添加到 crontab)
0 2 * * * /usr/bin/mysqldump -u backup_user -p'Pass' --all-databases --single-transaction | gzip > /backup/mysql-$(date +%F).sql.gz
❌ 绝对禁止的操作
- ✖ 使用
root账户连接应用(必须创建最小权限账号) - ✖ 将 MySQL 绑定到
0.0.0.0并开放安全组至公网 - ✖ 关闭
mysql_secure_installation或跳过密码强度校验 - ✖ 在 SQL 中拼接用户输入(必须用预处理语句)
- ✖ 将 MySQL 配置文件(含密码)提交至 Git 或共享存储
📌 进阶建议(生产强烈推荐)
- ✅ 迁移到阿里云 RDS MySQL:自动打补丁、高可用、透明加密、审计日志、一键备份,比自建更安全省心。
- ✅ 使用 Vault 或阿里云 KMS 管理数据库密码,避免明文写入配置。
- ✅ 部署 WAF + 数据库审计插件(如 Percona Audit Log Plugin)记录所有 DDL/DML 操作。
- ✅ 容器化部署:用 Docker +
mysql:8.0镜像,配合--read-only、--tmpdir挂载内存盘等加固。
如需我为你生成:
- ✅ 完整的
my.cnf安全模板(适配你的 OS 版本) - ✅ 自动化安装 + 安全配置 Bash 脚本
- ✅ 阿里云 RDS 迁移方案对比(自建 vs RDS)
- ✅ MySQL 8.0 SSL 双向认证详细配置步骤
欢迎随时告诉我你的具体环境(OS 版本、MySQL 版本、是否已上线),我会为你定制输出 👇
安全无小事,每一步加固都是对数据生命的负责。🔐
云小栈