加油
努力

如何在ECS服务器上安全地安装和配置MySQL?

在阿里云 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 版本、是否已上线),我会为你定制输出 👇

安全无小事,每一步加固都是对数据生命的负责。🔐

云服务器