在轻量应用服务器(如阿里云、腾讯云等)上同时部署 MySQL 和 Redis 时,安全配置的核心原则是:最小权限原则、网络隔离、访问控制、数据加密与备份。以下是具体、可操作的安全配置指南:
一、基础环境准备
-
使用非 root 用户运行服务
- 创建专用系统用户(如
mysql和redis),避免以 root 身份运行数据库。sudo useradd -r -s /bin/false mysql sudo useradd -r -s /bin/false redis
- 创建专用系统用户(如
-
安装最新稳定版本
- 优先使用官方包管理器或从源码编译,确保补丁到位。
# Ubuntu/Debian sudo apt update && sudo apt install mysql-server redis-server
CentOS/RHEL
sudo yum install mysql-server redis
- 优先使用官方包管理器或从源码编译,确保补丁到位。
-
关闭不必要的端口监听
- MySQL 默认监听 3306,Redis 默认 6379。仅绑定到 localhost 或内网 IP,除非必要不暴露公网。
二、MySQL 安全配置
1. 绑定地址限制
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf(路径因发行版而异):
[mysqld]
bind-address = 127.0.0.1
# 如需远程访问,绑定特定内网IP,如:
# bind-address = 192.168.1.100
2. 禁用远程 root 登录
ALTER USER 'root'@'localhost' IDENTIFIED BY 'StrongPassword!';
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost','127.0.0.1','::1');
FLUSH PRIVILEGES;
3. 创建最小权限应用账户
CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'AppStrongPass123!';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'app_user'@'localhost';
FLUSH PRIVILEGES;
4. 启用 SSL/TLS 连接(可选但推荐)
[mysqld]
ssl-ca=/path/to/ca.pem
ssl-cert=/path/to/server-cert.pem
ssl-key=/path/to/server-key.pem
require_secure_transport = ON
5. 定期备份 + 日志审计
- 启用 general log 或 slow query log(生产环境谨慎开启)。
- 设置 cron 自动备份:
0 2 * * * mysqldump --single-transaction --routines --triggers mydb | gzip > /backup/mydb_$(date +%F).sql.gz
三、Redis 安全配置
1. 绑定 localhost
编辑 /etc/redis/redis.conf:
bind 127.0.0.1 ::1
protected-mode yes
2. 设置强密码认证
requirepass YourStrongRedisPass123!
⚠️ 注意:Redis 6+ 支持 ACL,更细粒度控制。建议升级并使用 ACL。
3. 重命名危险命令(可选)
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command KEYS "keys"
4. 限制内存与持久化策略
maxmemory 256mb
maxmemory-policy allkeys-lru
save 900 1
save 300 10
save 60 10000
5. 以非 root 用户运行
确保 redis.conf 中:
daemonize yes
user redis
pidfile /var/run/redis/redis.pid
四、防火墙与安全组配置
1. 云服务器安全组(云厂商层面)
- 仅开放必要端口:
- SSH(22):仅限你的 IP 或跳板机
- HTTP/HTTPS(80/443):Web 服务用
- 禁止对外暴露 3306 和 6379!
2. 主机防火墙(iptables/firewalld)
# 允许本地回环通信(MySQL & Redis 内部调用)
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="3306" accept'
sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="127.0.0.1" port protocol="tcp" port="6379" accept'
# 如果应用在同一服务器,且通过 Unix Socket 或 localhost TCP 通信,则无需开放外部端口
sudo firewall-cmd --reload
五、应用层最佳实践
- 使用连接池:避免频繁建立连接,减少资源消耗和攻击面。
- 参数化查询:防止 SQL 注入。
- Redis 键前缀隔离:不同业务模块使用不同 key 前缀,避免冲突。
- 监控与告警:
- 使用 Prometheus + Grafana 监控 CPU、内存、连接数、慢查询。
- 设置异常登录/高频失败告警。
六、额外加固建议
| 项目 | 建议 |
|---|---|
| 操作系统 | 定期更新内核和安全补丁 |
| 文件权限 | MySQL 数据目录属主 mysql:mysql,权限 750;Redis 同理 |
| 日志集中 | 将 MySQL 和 Redis 日志发送至中央日志服务器 |
| 密钥管理 | 不使用硬编码密码,改用环境变量或 Vault/KMS |
| 容器化部署 | 考虑使用 Docker + Docker Compose,便于隔离和资源控制 |
七、验证测试
-
MySQL:
mysql -u app_user -p -h 127.0.0.1 # 尝试从其他机器连接应被拒绝 -
Redis:
redis-cli -h 127.0.0.1 -p 6379 auth YourStrongRedisPass123! ping # 应返回 PONG # 尝试无密码或错误密码应失败 -
端口扫描检查:
nmap -p 3306,6379 127.0.0.1 # 确认仅在 localhost 监听
✅ 总结:
在轻量服务器上共存 MySQL 和 Redis,关键在于网络隔离(只绑 localhost)、强认证+最小权限、防火墙严格限制、定期备份与监控。只要遵循上述步骤,即可在保证性能的同时实现高安全性。
如需进一步自动化或容器化方案,可结合 Ansible、Docker Swarm 或 Kubernetes(轻量级如 K3s)进行编排。
轻量云Cloud