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

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