1. 背景介绍
Memcached 和 Redis 类似,默认情况下没有配置任何认证鉴权措施,对所有网络可达的客户端可访问。
因此一般该类缓存服务多部署在可信的网络环境里,但是如果需要暴露给不可信的网络,同时也是为了安全合规的考虑,需要进行一些加固。
2. 加固方案
2.1 【方案一】配置监听地址仅限本地回环地址
在 memcached 的配置文件,或者启动参数中,使用 ** -l 127.0.0.1 ** 指定监听的 ip 地址
示例配置: (假设均通过发行版软件仓库安装)
* ** Red Hat 系: /etc/sysconfig/memcached **
1 2 3 4 5 6 |
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-l 127.0.0.1" |
- ** Debian 系: /etc/memcached.conf **
123456-d-m 64-p 11211-u memcache-l 127.0.0.1
2.2 【方案二】配置防火墙 ACL 策略
使用 iptables 等手段控制 memcached 的端口ACL策略,示例如下:
- 仅限来自指定 IP 段的访问
12iptables -t filter -A INPUT -p tcp -s 192.168.1.0/24 --dport 11211 -j ACCEPT
- 屏蔽任何其他 IP 对 Memcached 端口的访问
12iptables -t filter -A INPUT -p tcp --dport 11211 -j DROP
2.3 【方案三】配置认证鉴权策略
Memcached 1.4.3 及之后的版本,如果编译时开启了 --enable-sasl,则可以使用 sasl 配置认证。
2.3.1 安装 SASL 管理工具
- Red Hat 系:(CentOS 7)
12yum install cyrus-sasl
- Debian 系:
12apt install sasl2-bin
2.3.2 设置用于 Memcached 的 SASL 用户名密码
- 运行以下命令,指定需要的用户名,然后输入两次密码即可
12saslpasswd2 -a memcached -c [customized username]
-
- 由于 SASL 账户密码默认保存在 /etc/sasldb2 文件里,但是该文件权限为 0640 或者 0660,对于运行 Memcached 的 user/group 不可读,因此需要做一些权限上面的修改。
** 注意: 修改 sasldb2 的属组是一个简单讨巧的方法,但请确认是否有其他服务依赖该文件的权限配置**
- 配置该文件的属组为 Memcached 运行所用的 group。
-
-
Red Hat 系:
sudo chown :memcached /etc/sasldb2
-
-
-
Debian 系:
sudo chown :memcache /etc/sasldb2
-
2.3.3 配置 Memcached 启用 SASL 认证
在 memcached 的配置文件,或者启动参数中,使用 ** -S ** 即可开启 SASL 认证
示例配置: (假设均通过发行版软件仓库安装)
* ** Red Hat 系: /etc/sysconfig/memcached **
1 2 3 4 5 6 |
PORT="11211" USER="memcached" MAXCONN="1024" CACHESIZE="64" OPTIONS="-S" |
- ** Debian 系: /etc/memcached.conf **
1234567-d-m 64-p 11211-u memcache-l 0.0.0.0-S
2.3.4 测试验证
使用支持 SASL 认证的 Memcached 客户端程序进行测试,下面我们使用 python 的 bmemcached 模块进行验证:
- 安装 bmemcached
12pip install python-binary-memcached --user
- 运行以下 python 代码
1234import bmemcachedc = bmemcached.Client(['127.0.0.1:11211'], 'username', 'password')c.stats()
- 如果密码错误,会报错
12MemcachedException: Code: 32 Message: Auth failure