在轻量应用服务器(如阿里云、腾讯云等提供的 ECS/CVM 实例)上同时部署 MySQL 和 Redis 时,核心安全原则是:最小权限、网络隔离、访问控制、加密通信。以下是详细的安全配置指南:
一、基础环境准备
-
使用非 root 用户运行服务
- 创建专用系统用户(如
mysql、redis),避免以 root 身份运行数据库。 - 示例:
sudo useradd -r -s /bin/false mysql sudo useradd -r -s /bin/false redis
- 创建专用系统用户(如
-
设置文件权限
- MySQL 数据目录:
/var/lib/mysql→ 属主mysql:mysql,权限700 - Redis 配置文件和数据目录:属主
redis:redis,权限严格限制
- MySQL 数据目录:
二、MySQL 安全配置
1. 绑定地址与端口
- 默认只监听本地(
bind-address = 127.0.0.1) - 如需远程访问,仅允许特定 IP:
[mysqld] bind-address = 127.0.0.1 # 或指定内网 IP bind-address = 192.168.1.100 port = 3306
2. 禁用远程 root 登录
DROP USER IF EXISTS 'root'@'%';
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'StrongPassword!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
3. 启用 SSL/TLS 加密连接
[mysqld]
ssl-ca = /etc/mysql/ssl/ca.pem
ssl-cert = /etc/mysql/ssl/server-cert.pem
ssl-key = /etc/mysql/ssl/server-key.pem
require_secure_transport = ON
生成证书可使用 OpenSSL 或 Let’s Encrypt。
4. 安装安全脚本
sudo mysql_secure_installation
按提示完成:移除匿名账户、禁止远程 root、删除测试库、刷新权限。
5. 防火墙规则(iptables/firewalld)
# 仅允许本机访问
sudo iptables -A INPUT -p tcp --dport 3306 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP
三、Redis 安全配置
1. 绑定地址
bind 127.0.0.1
protected-mode yes
port 6379
2. 设置强密码
requirepass YourStrongRedisPassword123!
3. 重命名危险命令
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""
rename-command DEBUG ""
4. 使用 systemd 管理并限制资源
创建 /etc/systemd/system/redis.service.d/override.conf:
[Service]
LimitNOFILE=65535
MemoryLimit=512M
5. 防火墙规则
sudo iptables -A INPUT -p tcp --dport 6379 -s 127.0.0.1 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 6379 -j DROP
四、共存时的额外安全措施
1. 分离监听端口与网络接口
- MySQL 和 Redis 均绑定到
127.0.0.1,确保不暴露于公网。 - 若需外部访问(如通过 SSH 隧道或反向X_X),应通过应用层X_X而非直接开放端口。
2. 使用 Linux 用户隔离
- MySQL 和 Redis 分别以不同系统用户运行,防止进程间越权访问。
3. 定期更新与补丁
sudo apt update && sudo apt upgrade mysql-server redis-server
4. 日志审计与监控
- 启用 MySQL 通用日志或慢查询日志
- 启用 Redis 日志记录异常操作
- 使用
auditd或云厂商自带监控告警
5. 备份策略
- MySQL:
mysqldump+ 定时 cron 任务 - Redis:RDB/AOF 持久化 + 自动快照
- 备份文件加密存储,权限设为
600
五、推荐架构(高安全场景)
| 组件 | 部署方式 | 访问方式 |
|---|---|---|
| Web 应用 | 同一服务器或独立容器 | HTTP/HTTPS |
| MySQL | 本地实例,仅 localhost 访问 | 应用通过 Unix Socket |
| Redis | 本地实例,仅 localhost 访问 | 应用通过 localhost TCP |
| 外部访问 | 通过 Nginx + SSL + 认证网关 | 不直接暴露 DB 端口 |
✅ 最佳实践:除非必要,不要将 MySQL 或 Redis 直接暴露在公网。所有外部请求应通过 Web 服务器X_X,并在应用层进行身份验证和速率限制。
六、验证安全配置
-
尝试从外部 IP 连接 MySQL/Redis:
telnet <your-server-ip> 3306 # 应失败 telnet <your-server-ip> 6379 # 应失败 -
检查监听状态:
ss -tlnp | grep -E '3306|6379' # 输出应为:LISTEN 0 80 127.0.0.1:3306 ... -
使用
nmap扫描端口:nmap -p 3306,6379 <your-server-ip> # 应显示 filtered 或 closed
通过以上步骤,可在轻量应用服务器上实现 MySQL 与 Redis 的安全共存,显著降低被攻击风险。
云知识CLOUD