Skip to content

Memcached授权配置

访问控制策略

1. 网络层访问控制

最基本的授权方式是通过网络层控制谁可以访问Memcached服务:

绑定特定IP地址

bash
# 只监听本地回环地址
memcached -l 127.0.0.1

# 只监听内网IP
memcached -l 192.168.1.100

# 监听多个IP(通过多个-l参数)
memcached -l 127.0.0.1 -l 192.168.1.100

使用防火墙限制访问

iptables配置(Linux)
bash
# 允许特定IP访问Memcached端口
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 11211 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.1.0/24 --dport 11211 -j ACCEPT

# 拒绝其他所有IP
iptables -A INPUT -p tcp --dport 11211 -j DROP
iptables -A INPUT -p udp --dport 11211 -j DROP
Windows防火墙配置
  1. 打开Windows防火墙高级设置
  2. 创建入站规则
  3. 选择"端口",点击下一步
  4. 选择TCP,输入11211端口
  5. 选择"允许连接"
  6. 选择适用的网络类型
  7. 输入规则名称,如"Memcached访问"
  8. 在规则属性中,添加允许访问的IP地址

2. 第三方授权插件

可以使用第三方插件为Memcached添加授权功能:

SASL认证

Memcached支持SASL(Simple Authentication and Security Layer)认证,需要在编译时启用:

编译启用SASL
bash
# 安装SASL开发库
sudo apt-get install libsasl2-dev

# 编译Memcached时启用SASL
./configure --enable-sasl
make
make install
配置SASL
  1. 创建SASL配置文件
bash
sudo mkdir -p /etc/sasl2
sudo vi /etc/sasl2/memcached.conf

添加以下内容:

mech_list: plain
log_level: 5
sasldb_path: /etc/sasl2/memcached-sasldb2
  1. 创建SASL用户
bash
sudo saslpasswd2 -a memcached -c username
# 输入密码
  1. 确保权限正确
bash
sudo chown memcached:memcached /etc/sasl2/memcached-sasldb2
sudo chmod 600 /etc/sasl2/memcached-sasldb2
  1. 启动Memcached时启用SASL
bash
memcached -S -l 0.0.0.0

参数说明:

  • -S: 启用SASL认证

Memcached Authentication Proxy

使用代理服务器为Memcached添加认证功能:

使用memcproxy
bash
# 安装memcproxy
git clone https://github.com/bitly/memcproxy.git
cd memcproxy
make

# 配置memcproxy
vi memcproxy.conf

配置示例:

listen: 0.0.0.0:11212
backends: 127.0.0.1:11211
auth: on
users:
  - username: user1
    password: password1

启动代理:

bash
./memcproxy -c memcproxy.conf

容器环境中的授权

Docker环境

在Docker环境中,可以通过以下方式控制访问:

  1. 使用桥接网络:将Memcached容器连接到专用网络,只有同一网络中的容器才能访问
bash
# 创建专用网络
docker network create memcached-net

# 运行Memcached容器
docker run -d --name memcached --network memcached-net memcached

# 运行客户端容器,只有同一网络才能访问
docker run -it --network memcached-net alpine telnet memcached 11211
  1. 使用环境变量配置SASL
bash
docker run -d --name memcached \
  -e MEMCACHED_SASL_ENABLED=yes \
  -e MEMCACHED_USERNAME=user \
  -e MEMCACHED_PASSWORD=password \
  memcached:latest

Kubernetes环境

在Kubernetes环境中,可以通过以下方式控制访问:

  1. 使用ClusterIP服务:默认情况下,ClusterIP服务只能在集群内部访问
yaml
apiVersion: v1
kind: Service
metadata:
  name: memcached
spec:
  selector:
    app: memcached
  ports:
  - port: 11211
    targetPort: 11211
  type: ClusterIP  # 默认类型,仅集群内部访问
  1. 使用NetworkPolicy:限制特定Pod可以访问Memcached服务
yaml
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: memcached-access-policy
spec:
  podSelector:
    matchLabels:
      app: memcached
  policyTypes:
  - Ingress
  ingress:
  - from:
    - podSelector:
        matchLabels:
          app: allowed-app
    ports:
    - protocol: TCP
      port: 11211

授权最佳实践

1. 最小权限原则

  • 只允许必要的IP地址访问Memcached服务
  • 只开放必要的端口
  • 限制Memcached服务的网络可见性

2. 分层安全策略

采用多层安全策略,包括:

  • 网络层:防火墙、IP绑定
  • 传输层:TLS加密(配合第三方工具)
  • 应用层:SASL认证、代理认证

3. 定期审计

  • 定期检查Memcached的访问日志
  • 定期更新认证凭证
  • 定期审计网络访问控制规则

4. 监控访问模式

  • 监控异常的连接模式
  • 监控异常的命令执行模式
  • 设置访问频率限制

常见授权方案

方案1:本地开发环境

bash
# 仅本地访问
memcached -l 127.0.0.1 -p 11211

方案2:内网生产环境

bash
# 绑定内网IP + 防火墙限制
memcached -l 192.168.1.100 -p 11211

# 配合iptables限制特定IP段
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 11211 -j ACCEPT
iptables -A INPUT -p tcp --dport 11211 -j DROP

方案3:带SASL认证的生产环境

bash
# 启用SASL认证 + 绑定内网IP
memcached -S -l 192.168.1.100 -p 11211

# 配合iptables
iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 11211 -j ACCEPT
iptables -A INPUT -p tcp --dport 11211 -j DROP

常见问题(FAQ)

Q1: Memcached为什么没有内置的授权机制?

A1: Memcached设计理念是简单高效,内置授权机制会增加性能开销。Memcached的安全性设计依赖于网络隔离和外部安全机制,这符合其作为高性能缓存的定位。

Q2: 如何为Memcached添加密码认证?

A2: 可以通过以下方式:

  1. 启用SASL认证(需要编译时支持)
  2. 使用第三方代理服务器,如memcproxy、twemproxy等
  3. 使用云服务提供商的Memcached服务,通常带有内置认证

Q3: 如何限制特定客户端只能读取数据,不能写入?

A3: Memcached本身不支持读写分离的授权。可以通过以下方式实现:

  1. 使用第三方代理服务器,实现命令级别的访问控制
  2. 部署两个Memcached实例,一个用于读,一个用于写,分别配置不同的访问控制
  3. 在应用层实现访问控制逻辑

Q4: SASL认证会影响Memcached的性能吗?

A4: 启用SASL认证会带来一定的性能开销,主要在连接建立阶段。对于长连接场景,性能影响较小;对于短连接场景,影响可能较为明显。建议在性能测试后决定是否启用。

Q5: 如何监控Memcached的授权事件?

A5: 可以通过以下方式:

  1. 启用SASL日志,查看认证事件
  2. 使用网络监控工具,如tcpdump、Wireshark等,监控连接尝试
  3. 使用第三方监控工具,如Prometheus + Grafana,监控连接数和认证失败次数
  4. 配置防火墙日志,记录被拒绝的访问尝试