协议 | 二进制 SASL 认证 | 概述
目前,绝大多数 memcached 部署都运行在受信任的网络环境中,客户端可以随意连接任何服务器,且服务器不会对其加以限制。但有些场景下,memcached 被部署在不受信任的网络中,或者管理员希望更严格地控制接入的客户端。请注意,该机制不提供加密功能,但能提供身份认证。不要通过 Internet 使用它,而应主要用于保护大型(主要受信任的)网络内部免受邻居或误操作的影响。本页主要描述相关协议。
认证概念
认证功能从服务端抽象出来,使用简单认证与安全层(Simple Authentication and Security Layer,SASL)。此外,这使管理员能够进行与客户端认证服务基本独立的、统一的凭据管理。
协议定义
错误代码与状态码
SASL 协议提供两种状态码以支持认证:未授权(Unauthorized)
如果消息返回的状态码为 0x20,则视为认证或授权失败。这可能是对显式认证命令的响应,表明凭据未被接受,或者服务器未授予访问权限。
继续认证(Continue Authentication)
某些 SASL 机制要求客户端与服务器之间交换多条消息。如果服务器针对认证消息返回状态码 0x21,则表明客户端还需执行更多操作以完成认证协商。
不支持认证(Authentication Not Supported)
如果服务器对认证请求返回未知命令状态码(0x81),通常意味着该服务器不支持认证。对于不支持认证的服务器,客户端将其视为认证成功是可以接受的。
认证请求
列举机制
为了协商认证,客户端可能需要询问服务器支持哪些认证机制。发送一条不带额外字段、键或值的 0x20 命令,即可向服务器请求机制列表。返回的机制以空格分隔的值形式呈现。
发起认证
要发起认证请求,请发送一条命令,其操作码为 0x21,键为所需的认证机制,值则为所选机制所需的初始认证数据(如有)。
认证后续步骤
如果认证请求的响应是继续认证(状态码 0x21),其报文中将包含计算下一个认证协商值所需的数据。后续步骤的数据传输方式与初始步骤类似,但使用命令 0x22。注意,这与初始请求一样,键中也需要包含机制名称。
错误参考
| 状态码 | 含义 |
| 0x20 | 需要认证 / 认证失败 |
| 0x21 | 需要更多认证步骤 |
命令参考
| 命令 | 操作码 | 键 | 值 |
| 列举机制 | 0x20 | 无 | 无 |
| 开始认证 | 0x21 | 机制 | 认证数据 |
| 认证步骤 | 0x22 | 机制 | 认证数据 |
延伸阅读
memcached SASL 使用指南
HOWTO
介绍
如果在主要为受信任的网络中运行 memcached(例如云环境或企业内部云),您可能希望限制对该服务的访问。SASL 并非作为端到端加密实现。虽然它能方便地限制守护进程访问,但不会隐藏通信内容,因此不适合在 Internet 上使用。SASL(如 RFC2222 所述)是一种标准,用于以协议无关的方式为协议添加认证机制。
入门
要部署支持 SASL 的 memcached,你需要两个条件:
* 支持 SASL 的 memcached 服务器(1.4.3 及以上版本,且编译时使用 --enable-sasl 参数)
* 支持 SASL 的客户端
服务端必须支持客户端所使用的认证机制。有些客户端仅支持 plain 机制,而操作系统可能默认没有提供支持 plain 机制的库或包。
配置 SASL
大部分情况下,只需执行常规的 SASL 管理操作即可。
# 为 memcached 创建用户
saslpasswd2 -a memcached -c cacheuser
运行 memcached
要在服务端启用 SASL 支持,必须使用 -S 标志。-S 标志执行以下功能:
* 启用所有 SASL 命令。
* 仅要求使用二进制协议。
* 在连接上发出命令前,必须已成功完成认证。
SASL 常见问题解答
问:如何检查当前的 memcached 服务器是否构建了 SASL 支持?
答:您可以查看命令行帮助是否列出了该选项:
-S, --enable-sasl 开启 Sasl 认证
答:您可以以详细模式运行服务器,例如:
> memcached -S -vvvv
正在读取配置文件:<...memcached.conf>
已初始化 SASL。
答:在 Linux 上,您可以检查是否链接了 SASL 库,例如:
> ldd `which memcached` | grep -i sasl
libsasl2.so.3 => /lib64/libsasl2.so.3
问:配置选项 --enable-sasl-pwdb 不起作用
答:参见
问:Plain 认证不起作用,为什么?
答:运行 memcached 并加上 -vvvv 选项是否能提供有用的信息?
答:检查是否安装了实现该机制的 SASL 库,例如 /usr/lib64/sasl2/libplain.so(由 RPM 包 cyrus-sasl-plain 提供)。
答:检查密码文件的所有者是否仅为运行 memcached 的用户,且该用户具有读取权限。
答:检查客户端使用的用户名是否与密码文件中的一致。注意,有时客户端会在用户名后附加 @主机名,例如 myname@client_hostname:mypass
更多信息
阅读有关 memcached SASL 认证协议的更多资料。
二进制协议