在轻量应用服务器(如腾讯云轻量、阿里云SAE轻量版、AWS Lightsail等)上安全配置 MySQL 和 Redis 共存,需兼顾资源限制(CPU/内存通常仅1–2核、1–4GB)、安全性、稳定性与最小化攻击面。以下是经过生产验证的分步安全实践指南:
✅ 一、前提确认(轻量服务器适配)
| 项目 | 建议值 | 说明 |
|---|---|---|
| 系统 | Ubuntu 22.04 LTS / CentOS Stream 9 | 长期支持、软件源稳定 |
| 内存 | ≥ 2GB(推荐3GB+) | MySQL(InnoDB缓冲池)+ Redis(maxmemory)需预留足够内存,避免OOM |
| 磁盘 | SSD,≥ 40GB | 日志、备份、临时文件需空间 |
| 防火墙 | 默认关闭网络端口(3306/6379) | 关键!所有服务默认仅限本地访问 |
⚠️ 轻量服务器通常无内置安全组精细控制,必须手动配置
ufw或firewalld+ 绑定地址。
✅ 二、安全安装与初始化(最小权限原则)
▶️ MySQL(推荐使用 mysql-server 官方包,非 MariaDB)
# Ubuntu 示例
sudo apt update && sudo apt install -y mysql-server
# 1. 运行安全初始化(强制修改root密码、禁用匿名用户、移除test库等)
sudo mysql_secure_installation
# → 按提示:设强密码、Y/Y/Y/Y
# 2. 编辑配置(/etc/mysql/mysql.conf.d/mysqld.cnf),强化安全:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
# 🔒 网络与访问控制
bind-address = 127.0.0.1 # ❗仅监听本地,禁止网络
skip-networking = OFF # 保持启用(但bind已限制)
require_secure_transport = ON # 强制SSL连接(若应用支持)
# 🔐 认证与权限
default_authentication_plugin = caching_sha2_password
validate_password.policy = STRONG # 启用密码强度检查
# 📦 资源限制(防DoS)
max_connections = 50 # 轻量场景足够,避免耗尽内存
wait_timeout = 60
interactive_timeout = 60
# 🧹 安全加固
sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION"
local_infile = OFF # 禁用LOAD DATA LOCAL INFILE(高危)
▶️ Redis(推荐 redis-server 官方包,禁用默认配置)
sudo apt install -y redis-server
# 编辑主配置 /etc/redis/redis.conf
sudo nano /etc/redis/redis.conf
# 🔒 绑定与端口
bind 127.0.0.1 ::1 # 仅本地IPv4/v6
port 6379
protected-mode yes # 必须开启(Redis 3.2+默认)
# 🔐 认证(必须设置!)
requirepass your_strong_redis_password_here # 生成:openssl rand -base64 24
# 🧩 安全限制
rename-command FLUSHDB "" # 禁用危险命令(可选,按需)
rename-command FLUSHALL "" # 同上
rename-command CONFIG "" # 防止信息泄露
rename-command EVAL "" # 若不用Lua脚本
# 📦 内存与性能(轻量关键!)
maxmemory 512mb # 根据总内存合理分配(例:3GB内存 → MySQL 1.5G + Redis 0.5G)
maxmemory-policy allkeys-lru # 内存满时LRU淘汰
# 🛡️ 其他加固
dir /var/lib/redis # 确保目录权限为 redis:redis
appendonly yes # 开启AOF持久化(比RDB更安全可靠)
save "" # 关闭RDB自动保存(由AOF保证)
✅ 重启服务并验证绑定:
sudo systemctl restart mysql redis-server ss -tlnp | grep -E ':(3306|6379)' # 应只显示 127.0.0.1:3306 和 127.0.0.1:6379
✅ 三、创建专用应用账户(严禁 root/redis 默认账号)
▶️ MySQL(最小权限原则)
-- 登录:sudo mysql -u root -p
CREATE DATABASE myapp DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'myapp_user'@'localhost' IDENTIFIED BY '强密码_12Char+';
GRANT SELECT, INSERT, UPDATE, DELETE ON myapp.* TO 'myapp_user'@'localhost';
FLUSH PRIVILEGES;
▶️ Redis(无需创建用户,但应用必须用密码连接)
- 连接字符串示例(PHP/Node.js/Python):
redis://:your_strong_redis_password_here@127.0.0.1:6379/0
✅ 四、防火墙(ufw)终极防护(必做!)
sudo ufw enable
sudo ufw default deny incoming # 默认拒绝所有入站
sudo ufw allow OpenSSH # 保留SSH(端口22)
# ❌ 不开放 3306 / 6379 给公网!
# 如需远程管理MySQL(不推荐),仅限可信IP:
# sudo ufw allow from 203.0.113.10 to any port 3306
✅ 验证:
sudo ufw status verbose→ 确保 3306/6379 未出现在允许列表中
✅ 五、应用层安全对接(关键!)
| 组件 | 安全实践 |
|---|---|
| Web应用(如Nginx+PHP) | • PHP连接MySQL:使用 mysqli 或 PDO,*禁用 `mysql_(已废弃)**<br>• 连接字符串中 **不硬编码密码** → 使用环境变量或配置文件(权限600):<br> chmod 600 /etc/myapp/.env` |
| Redis客户端 | • 使用 redis-py(Python)、ioredis(Node)等支持密码认证的库• 禁用 redis-cli 直连生产环境(仅调试用) |
| 日志与监控 | • MySQL:启用 general_log = OFF(仅调试开),审计日志需专业版(轻量不建议)• Redis: loglevel notice(避免debug级日志填满磁盘) |
✅ 六、轻量服务器专属优化建议
| 场景 | 方案 |
|---|---|
| 内存紧张 | • MySQL:调小 innodb_buffer_pool_size(建议总内存的 50%~60%,如2GB内存→设 1G)• Redis:严格设 maxmemory,避免触发OOM Killer(sudo dmesg -T | tail 查OOM) |
| 备份自动化 | • MySQL:每日 mysqldump + gzip + rsync 到对象存储(如腾讯COS)• Redis:AOF已开启,定期 BGREWRITEAOF 并压缩备份 |
| 更新维护 | • 仅通过 apt upgrade 更新,禁用 apt dist-upgrade(可能升级内核/大版本)• 更新后验证服务状态: sudo systemctl is-active --quiet mysql && echo OK |
✅ 七、快速安全检查清单(部署后执行)
# 1. 端口暴露检查
nmap -sT -p 3306,6379 127.0.0.1 # 应仅显示 open(本地)
nmap -sT -p 3306,6379 YOUR_SERVER_IP # 应全部 filtered/closed!
# 2. MySQL是否禁用远程root
mysql -h 127.0.0.1 -u root -p -e "SELECT USER(), CURRENT_USER();"
# 3. Redis是否启用密码
redis-cli ping 2>/dev/null || echo "❌ Redis未运行或密码未生效"
redis-cli -a "wrong" ping 2>&1 | grep "NOAUTH" && echo "✅ 密码保护生效"
# 4. 文件权限
ls -l /etc/mysql/mysql.conf.d/mysqld.cnf /etc/redis/redis.conf # 应为 root:root 644
❌ 绝对禁止的操作(轻量常见陷阱)
- ☠️ 将
bind-address = 0.0.0.0或注释掉 → 直接暴露数据库到公网! - ☠️ 使用空密码或
123456等弱密码 → 扫描器10分钟内攻破 - ☠️ 在
/var/www下存放.env文件 → 可能被Web服务器误当作静态文件返回 - ☠️ 同时开启 MySQL 的
skip-grant-tables和 Redis 的protected-mode no→ 彻底裸奔
✅ 总结:轻量共存安全黄金法则
🔐 “双本地 + 双密码 + 单防火墙 + 最小权限”
- ✅ 服务均
bind 127.0.0.1- ✅ MySQL 应用账号 + Redis
requirepass- ✅
ufw默认拒绝所有入站,仅放行 SSH- ✅ 应用账号权限精确到库/表,绝不给
GRANT ALL- ✅ 每月更新系统、备份验证、检查日志异常
如需进一步自动化(Ansible脚本 / Docker Compose轻量方案),我可为你定制。是否需要? 😊
云计算HECS