在轻量应用服务器上如何安全配置MySQL和Redis共存?

在轻量应用服务器(如腾讯云轻量、阿里云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:3306127.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 » 在轻量应用服务器上如何安全配置MySQL和Redis共存?