Memcached 未授权访问防护实战:缓存服务安全加固指南

适用场景

Memcached 未授权访问防护适用于以下场景:使用 Memcached 缓存 Session、商品信息等数据的 Web 业务系统;云服务器或物理机直接暴露在公网的部署环境;安全检查与等保合规整改中需要收敛高危端口的场景;以及多租户或混合网络环境下需要明确访问边界的内网服务。Memcached 以高性能著称,但设计上默认不提供认证,若忽视端口暴露问题,极易成为攻击者横向移动与 DDoS 反射攻击的跳板。

前置条件

  • 一台运行 Memcached 的 Linux 服务器(本文以 Ubuntu 22.04 / Debian 12 为例)
  • 具备 root 或 sudo 权限,可修改服务配置与防火墙规则
  • 已确认业务对 Memcached 的访问方式(同机回环或跨机内网访问)

原理说明

Memcached 监听默认端口 11211,其协议极为简单:客户端连接后直接发送 statsgetset 等明文命令,服务端不做任何身份校验。这意味着任何人都可以读取缓存中的全部键值、覆盖已有数据,甚至通过 flush_all 清空缓存导致业务雪崩。更严重的是,Memcached 默认开启 UDP 11211 端口,且支持无源地址伪造的放大响应(单字节请求可放大至数百倍响应),曾被大规模利用发起 UDRP 反射型 DDoS 攻击。因此加固的核心思路是:最小暴露(仅内网可访问)+ 身份认证(SASL)+ 关闭危险通道(UDP)。

操作步骤

1. 确认暴露状态

先检查服务监听地址与端口开放情况:

# 查看监听地址与端口,0.0.0.0:11211 即表示全网卡暴露
ss -lntup | grep 11211

# 从外部视角确认端口是否公网可达(授权测试环境执行)
nmap -sU -p 11211 <服务器公网IP>

2. 绑定内网地址

编辑配置文件,将监听地址从 0.0.0.0 改为回环或内网地址:

# /etc/memcached.conf:同机业务仅回环访问
-l 127.0.0.1

# 跨机内网访问则绑定内网 IP(禁止绑定公网 IP)
-l 10.0.0.5
# 重启生效
systemctl restart memcached
ss -lntup | grep 11211   # 确认监听地址已收敛

3. 防火墙封禁外部访问

# iptables:仅允许内网网段访问 11211
iptables -A INPUT -p tcp --dport 11211 -s 10.0.0.0/8 -j ACCEPT
iptables -A INPUT -p tcp --dport 11211 -j DROP
iptables -A INPUT -p udp --dport 11211 -j DROP

# 保存规则(Debian/Ubuntu 用 netfilter-persistent)
netfilter-persistent save

4. 关闭 UDP 监听

UDP 端口仅用于反射攻击,业务几乎用不到,直接关闭:

# 在 memcached 启动参数中加 -U 0 关闭 UDP
# /etc/memcached.conf 追加:
-U 0

# 重启后验证 UDP 端口已不再监听
ss -lunp | grep 11211

5. 启用 SASL 认证(可选加固)

若缓存中包含敏感数据且无法完全依赖网络隔离,可启用 SASL 认证。需使用带 SASL 支持的编译版本:

# 安装 SASL 相关组件
apt install -y libsasl2-dev sasl2-bin memcached

# 创建认证数据库用户
saslpasswd2 -a memcached -c cacheuser
# 输入并确认密码(如 Strong@2026)

# 配置 /etc/memcached.conf 追加:
-S

# 重启并验证
systemctl restart memcached
printf 'stats\r\n' | nc 127.0.0.1 11211   # 未认证应返回 ERROR

6. 定期升级与监控

# 升级到最新稳定版,修复已知漏洞
apt update && apt upgrade memcached

# 接入监控,观察连接来源与异常命令
memcached-tool 127.0.0.1:11211 stats | grep -E 'curr_connections|cmd_flush|total_connections'

配置验证

# 1. 验证监听地址:应只显示 127.0.0.1 或内网 IP
ss -lntup | grep 11211

# 2. 验证 UDP 已关闭:无输出即为成功
ss -lunp | grep 11211

# 3. 验证防火墙规则生效
iptables -L INPUT -n | grep 11211

# 4. 从外部机器测试:应无法连接(超时或拒绝)
nc -vz <服务器IP> 11211

# 5. 业务连通性回归:确认应用仍可正常读写缓存
memcached-tool 127.0.0.1:11211 stats | grep -E 'get_hits|get_misses'

验证要点:监听地址收敛UDP 关闭外部不可达三项为硬性指标;启用 SASL 后需同步在客户端配置用户名密码,并回归测试 get_hits 命中率无明显下降。

常见问题

Q1:业务服务器与缓存服务器不在同一网段,绑定内网后连不上怎么办?

不要直接绑定公网地址。正确做法是:将监听地址绑定到业务可达的内网网卡 IP,并在防火墙中仅放行业务服务器所在网段(如 172.16.0.0/12),其余来源一律 DROP。若必须跨公网,应改用 VPN 或专线,并在两端启用 SASL 认证。

Q2:开启 SASL 认证后客户端报 “authentication not supported” 怎么办?

说明服务端二进制未编译 SASL 支持。检查 memcached -h | grep sasl 是否有输出;若无,需重新编译安装带 --enable-sasl 的版本,或直接使用发行版官方仓库中支持 SASL 的包。客户端侧需在连接时传入 用户名与密码(如 PHP memcached 扩展的 setSaslAuthData)。

总结

Memcached 未授权访问是典型的“配置型高危风险”,修复成本低但防护价值高。通过绑定内网地址、防火墙白名单、关闭 UDP、启用 SASL 认证四层措施,可将风险收敛至可控范围。建议将 11211 端口纳入日常端口巡检清单,配合连接数、cmd_flush 等指标监控,及时发现异常访问。若缓存已暴露过,应同时排查是否有数据被读取或篡改,必要时轮换缓存中的敏感数据。