基于滴滴云搭建安全稳定的 Memcached 服务器

介绍

Memcached 是一种内存 cache 系统,通过将一些高频使用和最近经常访问的信息储存在内存中,可以明显地优化访问后端数据库的性能。

直观上来看,借助于 Memcached 组件,可以大量减少访问数据库的请求数量。但是,如果不合理地配置 Memcached Server,有可能会使得系统受到大量的攻击。基于此,有必要创建安全稳定的 Memcached 服务器,加固 Memcached 配置。

本文将为您提供一种将 Memcached 实例绑定到本地或者私有网络的方法,来提升 Memcached Server 的稳定性。相应地,访问 Memcached Server 也需要创建授权用户。

先决条件

准备工作:

1 台滴滴云 DC2 服务器

操作系统:Linux CentOS7.4

规格:2CPU 4GB内存 40GB SSD系统盘

防火墙配置:配置系统开机启动 firewalld 服务

安装 Memcached

首先安装 Memcached 组件包:

sudo yum install memcached

为了方便管理 Memcached Servers,我们还可以安装 Libmemcached,它提供了一系列 Memcached 管理工具:

sudo yum install libmemcached

安装好 Memcached 基本环境以后,我们可以着手开始加固配置的工作。

加固 Memcached 配置

我们需要配置 Memcached 实例监听本地的 127.0.0.1 地址,修改配置文件 /etc/sysconfig/memcached 。为了保证避免大量攻击,也需要禁用 UDP Listener。

打开 /etc/sysconfig/memcached

sudo vi /etc/sysconfig/memcached

将该配置文件修改成如下所示:

/etc/sysconfig/memcached

PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1 -U 0" 

接下来重启服务使配置生效:

sudo systemctl restart memcached

为了验证配置的正确性,比如 Memcached Servers 只绑定到了本地端口,而且只监听 TCP 连接,可以通过如下命令查看:

sudo netstat -plunt

可以看到输出结果:

Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:11211         0.0.0.0:*               LISTEN      121465/memcached

添加用户认证

给 Memcached 服务添加认证用户,可以使用 Simple Authentication 和 Security Layer (SASL)。

SASL 是一个用于将认证过程与应用解耦的协议。通过在 Memcached 配置文件中加入 SASL 配置项,可以使用户具备认证功能。

配置 SASL

首先我们可以通过 memstat 命令来验证 Memcached 实例的网络连通性,此后在配置 SASL 和用户认证完成时,我们都可以通过该命令来验证配置的可用性:

sudo memstat --servers="127.0.0.1"`

Server: 127.0.0.1 (11211)
pid: 121465
uptime: 1120
time: 1546180153
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.035928
rusage_system: 0.051700
curr_connections: 1
total_connections: 2
connection_structures: 2
......省略部分显示

打开 /etc/sysconfig/memcached 配置文件,加入 -S 和-vv 配置项。-S 目的是打开 SASL 功能,-vv 作用是提供更详细的日志,在 Debug Memcached 时会得到较大方便。修改后配置为:

OPTIONS="-l 127.0.0.1 -U 0 -S -vv"

重启服务使配置生效:

sudo systemctl restart memcached

通过查看 log 可以看到 SASL 是否启用:

sudo journalctl -u memcached

可以看到:

12月 30 22:10:35 10-255-20-131 systemd[1]: Started Memcached.
12月 30 22:10:35 10-255-20-131 systemd[1]: Starting Memcached...
12月 30 22:36:36 10-255-20-131 systemd[1]: Stopping Memcached...
12月 30 22:36:36 10-255-20-131 systemd[1]: Started Memcached.
12月 30 22:36:36 10-255-20-131 systemd[1]: Starting Memcached...
12月 30 22:36:36 10-255-20-131 memcached[122283]: Initialized SASL.

添加一位认证用户

首先需要安装 Cyrus SASL 库,借助于 cyrus-sasl-devel 和 cyrus-sasl-plain 包我们可以实现认证机制:

sudo yum install cyrus-sasl-devel cyrus-sasl-plain

接下来,我们来创建一个目录,编辑 SASL 的配置文件,如下所示:

sudo mkdir -p /etc/sasl2
sudo vi /etc/sasl2/memcached.conf

mech_list: plain
log_level: 5
sasldb_path: /etc/sasl2/memcached-sasldb2

将 mech_list 设置为 plain,目的是使 Memcached 使用自己的密码认证文件,并且验证一个明码文本。

接下来,我们使用用户认证的方式来创建一个 SASL 数据库。

使用 saslpasswd2 命令来生成一个用户登录准入入口。这里,我们选用 didi 作为 user,当然 user 的名称可以自由设置:

sudo saslpasswd2 -a memcached -c -f /etc/sasl2/memcached-sasldb2 didi

最后我们设置 SASL 数据库为 Memcached 用户和用户组:

sudo chown memcached:memcached /etc/sasl2/memcached-sasldb2

重启服务后,使用上面提到过的 memstat 命令来验证认证机制是否生效:

memstat --servers="127.0.0.1" --username=didi --password=your_password

如果认证成功,你将看到如下的显示:

Server: 127.0.0.1 (11211)
pid: 122283
uptime: 2785
time: 1546183379
version: 1.4.15
libevent: 2.0.21-stable
pointer_size: 64
rusage_user: 0.107040
rusage_system: 0.113777
......省略部分显示

这样,我们就成功将 Memcached 服务配置为支持 SASL 协议与用户认证功能。

通过私有网络访问 Memcached 服务

在上面的安装配置完成后,我们将 Memcached 服务绑定到本地的接口,这样就避免了大量的外部攻击。

实际使用中,我们还需要接受一些其他 Server 的访问。所以在下面我们将配置 Memcached 服务,将其绑定到特定的私有网络,接受一些外部服务器的访问。

通过 Firewall 限制 IP 权限

在应用配置前,最好为连接到 Memcached 服务的 Server 设置一些 firewall 规则。我们将通过 firewall-cmd 命令来修改 firewall 的默认配置,以达到放开对特定 IP 的访问权限。

添加一个 Memcached zone 到 firewalld policy 文件中:

sudo firewall-cmd --permanent --new-zone=memcached

放开11211端口的访问权限,同样是先定在 Memcached zone内部:

sudo firewall-cmd --permanent --zone=memcached --add-port=11211/tcp

接下来,添加客户端私有 IP 地址,即设置哪些机器可以访问 Memcached 服务:

sudo firewall-cmd --permanent --zone=memcached --add-source=client_server_private_IP

Reload firewall 服务使上述配置生效:

sudo firewall-cmd --reload

通过上述配置工作,可以做到你自己客户端的 IP 地址能够访问 Memcached 服务,其他的 IP 连接将会被默认的 public zone 阻止访问。

将 Memcached 服务绑定到私有网络

修改/etc/sysconfig/memcached 配置文件。

将 127.0.0.1 替换为我们 Memcached Server 的私有 IP:

OPTIONS="-l memcached_servers_private_IP -U 0 -S -vv"

重启服务后验证:

sudo netstat -plunt

	Active Internet connections (only servers)
	Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
	tcp        0      0 10.255.20.131:11211     0.0.0.0:*               LISTEN      124612/memcached

接下来,可以验证在防火墙配置的 Client IP 能否访问到 Memcached 服务,作为比对,也可以验证其他未开放权限的 IP 能否访问到 Memcached 服务。

总结

本文主要包括如何配置将本地或者私有网络绑定到 Memcached 服务,以及如何在 Memcached 服务中启用 SASL 认证机制。

有兴趣了解更多技术细节,请关注滴滴云博客。

猜你喜欢

转载自blog.csdn.net/java060515/article/details/85617874
今日推荐