在轻量应用服务器(如腾讯云轻量、阿里云Lighthouse、AWS Lightsail等)上安全配置 MySQL 和 Redis 共存,需兼顾资源限制(CPU/内存通常仅1–2核、1–4GB RAM)、安全性、稳定性与最小化攻击面。以下是经过生产验证的分步安全配置指南:
✅ 一、前置原则(务必遵守)
| 项目 | 推荐做法 |
|---|---|
| 资源评估 | 轻量服务器(如2C4G)建议:MySQL分配≤1.5GB内存,Redis ≤512MB,预留≥512MB给系统+OS |
| 不共用端口/用户 | MySQL(3306)、Redis(6379)必须绑定 127.0.0.1,禁止监听 0.0.0.0 |
| 非 root 运行 | MySQL 用 mysql 用户,Redis 用 redis 用户(禁用 root 启动) |
| 防火墙强制启用 | 仅放行必要端口(如 SSH 22、Web 80/443),MySQL/Redis 端口绝不开放公网 |
✅ 二、安全安装与初始化(以 Ubuntu 22.04 为例)
1. 安装(使用官方源,避免第三方包)
# 更新 & 安装
sudo apt update
sudo apt install -y mysql-server redis-server
# ⚠️ 关键:立即禁用 Redis 默认配置中的危险命令(防止远程代码执行)
sudo sed -i 's/^#.*rename-command.*$/rename-command FLUSHDB ""nrename-command FLUSHALL ""nrename-command EVAL ""nrename-command EVALSHA ""/' /etc/redis/redis.conf
2. MySQL 安全加固
# 运行安全脚本(自动移除匿名用户、禁用远程root、删除test库等)
sudo mysql_secure_installation
# → 按提示:设root密码(强密码)、Y/Y/Y/Y
# 创建专用应用用户(替代root)
sudo mysql -u root -p -e "
CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongPass!2024';
GRANT SELECT,INSERT,UPDATE,DELETE ON myapp_db.* TO 'appuser'@'localhost';
FLUSH PRIVILEGES;
"
3. Redis 安全加固
# 编辑配置(关键项)
sudo nano /etc/redis/redis.conf
# ✅ 必须修改:
bind 127.0.0.1 ::1 # 仅本地访问(禁用IPv4/6公网监听)
protected-mode yes # 开启保护模式(默认已开)
port 6379 # 保持默认,但确保不被防火墙暴露
requirepass YourRedisPass!2024 # 设置强密码(必加!)
dir /var/lib/redis # 确保目录权限为 redis:redis
appendonly yes # 启用AOF持久化(更安全)
maxmemory 512mb # 防止OOM(根据内存调整)
maxmemory-policy allkeys-lru # 内存满时LRU淘汰
4. 权限与服务加固
# 修复 Redis 目录权限
sudo chown -R redis:redis /var/lib/redis
sudo chmod 755 /var/lib/redis
# 禁用 MySQL/Redis 的开机自启(按需启动,减少攻击面)
sudo systemctl disable mysql redis-server
# 启动并设为当前用户服务(推荐用 systemd user service 或 supervisor)
sudo systemctl enable --now mysql redis-server
✅ 三、防火墙与网络隔离(关键!)
# 启用 UFW(Ubuntu 默认防火墙)
sudo ufw enable
sudo ufw default deny incoming
sudo ufw allow OpenSSH
sudo ufw allow 80,443/tcp
# ❌ 绝对禁止以下规则(常见错误!)
# sudo ufw allow 3306 # 错误!MySQL 不应暴露公网
# sudo ufw allow 6379 # 错误!Redis 同理
# ✅ 正确做法:应用通过本地 socket 或 127.0.0.1 访问
# PHP/Node.js 连接示例:
# MySQL: host=127.0.0.1, port=3306, user=appuser
# Redis: host=127.0.0.1, port=6379, password=YourRedisPass!2024
✅ 四、应用层安全连接(PHP/Python/Node.js 示例)
✅ PHP (PDO) —— 使用 Unix Socket 更安全(可选)
// MySQL 推荐用 TCP + 本地地址(比 socket 更易监控)
$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=myapp_db',
'appuser', 'StrongPass!2024', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_SSL_MODE => PDO::MYSQL_ATTR_SSL_MODE_REQUIRED // 若启用SSL(见下文)
]);
// Redis(PHPRedis 扩展)
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$redis->auth('YourRedisPass!2024');
✅ 启用 MySQL SSL(轻量服务器也建议,防本地嗅探)
# 生成自签名证书(仅内网有效,但提升传输安全)
sudo mkdir -p /var/lib/mysql-ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048
-keyout /var/lib/mysql-ssl/server-key.pem
-out /var/lib/mysql-ssl/server-cert.pem
-subj "/CN=localhost"
sudo chown mysql:mysql /var/lib/mysql-ssl/*
sudo chmod 600 /var/lib/mysql-ssl/server-key.pem
# 配置 MySQL 启用 SSL
sudo mysql -u root -p -e "
INSTALL PLUGIN sha256_password SONAME 'sha256_password.so';
SET GLOBAL require_secure_transport = ON;
"
🔔 注:轻量服务器无需复杂 CA,自签名足够防御本地进程窃听。
✅ 五、监控与告警(轻量级方案)
# 1. 检查服务状态与资源
sudo systemctl status mysql redis-server
sudo htop # 观察内存/CPU 占用
# 2. 日志审计(关键!)
sudo tail -f /var/log/mysql/error.log
sudo tail -f /var/log/redis/redis-server.log
# 3. 简单健康检查脚本(crontab 每5分钟运行)
echo '*/5 * * * * /usr/bin/mysql -uappuser -pStrongPass!2024 -e "SELECT 1" >/dev/null 2>&1 || systemctl restart mysql' | sudo crontab -
✅ 六、备份策略(轻量必备)
# MySQL 备份(每日压缩加密,保留7天)
0 2 * * * /usr/bin/mysqldump -u appuser -pStrongPass!2024 myapp_db | gzip > /backup/mysql_$(date +%F).sql.gz && find /backup -name "mysql_*.sql.gz" -mtime +7 -delete
# Redis 备份(RDB快照已开启,补充定时拷贝)
0 3 * * * cp /var/lib/redis/dump.rdb /backup/redis_$(date +%F).rdb
⚠️ 常见高危错误(务必规避)
| 错误行为 | 风险 | 正确做法 |
|---|---|---|
bind 0.0.0.0 in Redis/MySQL |
公网可直连,秒变肉鸡 | bind 127.0.0.1 + 防火墙封锁 |
Redis 无密码 + protected-mode no |
任意人可 FLUSHALL 删除数据 |
设 requirepass + protected-mode yes |
MySQL root 允许 % 远程登录 |
弱口令即沦陷 | 仅 localhost,用专用用户 |
不限制 Redis maxmemory |
OOM 导致服务器宕机 | 显式设置 maxmemory 512mb |
| 备份文件权限为 644 | 敏感密码泄露 | chmod 600 backup.sql.gz |
✅ 最终验证清单
- [ ]
netstat -tuln | grep ':3306|:6379'→ 仅显示127.0.0.1:3306和127.0.0.1:6379 - [ ]
sudo ss -tuln | grep -E '3306|6379'→ 确认无*:3306 - [ ]
ufw status→ 3306/6379 不在列表中 - [ ]
mysql -uappuser -p -h127.0.0.1 -e "SELECT 1"→ 成功 - [ ]
redis-cli -h 127.0.0.1 -p 6379 -a 'YourRedisPass!2024' ping→ 返回PONG - [ ]
sudo -u redis redis-cli CONFIG GET requirepass→ 返回密码(非空)
如需进一步自动化部署,可提供:
- ✅ 完整的 Bash 一键安全初始化脚本
- ✅ Docker Compose 轻量版(含 MySQL+Redis+PHP-FPM 三容器隔离)
- ✅ Telegraf + Grafana 轻量监控模板
欢迎告知你的具体环境(OS版本、云厂商、应用框架),我可为你定制化脚本 👇
云知道CLOUD