Skip to content
survior edited this page Mar 5, 2018 · 19 revisions

参考文章:

1.http://lguan.iteye.com/blog/1279537

2.http://blog.csdn.net/qwssd/article/details/77198839?utm_source=5ibc.net&utm_medium=referral

3.https://bbs.aliyun.com/read/566283.html?spm=5176.10695662.1996646101.searchclickresult.57c144d5haSSBe

阿里云也是使用SASL作为memcache认证(memcache本身不支持支认证)。

一.linux 下安装memcached并启用SASL功能

(1).默认情况下,linux会自动安装Cyrus-SASL认证包。可使用下面的命令检查系统是否已经安装了Cyrus-SASL认证包或查看已经安装了何种版本。

rpm -qa | grep sasl

最全的是: 1.cyrus-sasl-plain-2.1.23-8.el6.i686
2.cyrus-sasl-devel-2.1.23-8.el6.i686
3.cyrus-sasl-2.1.23-8.el6.i686
4.cyrus-sasl-lib-2.1.23-8.el6.i686
5.cyrus-sasl-gssapi-2.1.23-8.el6.i686
6.cyrus-sasl-md5-2.1.23-8.el6.i686

查看密码验证机制,输入:saslauthd -v
saslauthd 2.1.23 authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap

为简单起见,这里准备采用shadow验证方法,也就是直接用/etc/shadow文件中的用户账户及密码进行验证。因此,在配置文件/etc/sysconfig/saslauthd中,应修改当前系统所采用的密码验证机制为shadow,即: MECH=shadow

重启saslauthd进程: /etc/init.d/saslauthd restart

/etc/init.d/saslauthd status 或者 ps aux | grep saslauthd 查看是否启动。

为memcache-sasl添加专有用户:saslpasswd2 -a memcached -c testmemuser 要求输入密码,简单起见:123456。添加的用户必须是系统中的用户,上面命令的意思就是,给memcached服务添加可访问的用户,没有添加的系统用户仍然是不可以访问该服务的。

用户是否work: testsaslauthd –u testmemuser –p pwd(特别注意,这个pwd不是上边的那个123456密码,而是testmemuser这个用户登录Linux的密码!这里坑死我了!)

若提示失败:0: NO "authentication failed",需要开启allow_saslauthd_read_shadow: setsebool -P allow_saslauthd_read_shadow 1

**有可能提示:setsebool: SELinux is disabled. 说明selinux被关闭了,需要打开:vi /etc/selinux/config更改为:SELINUX=1,必须重启linux,不重启是没办法立刻开启selinux的。这个慎重搞,不到万不得以别玩重启机器。

再次testsaslauthd –u testmemuser –p pwd提示:0: OK "Success."。

要能够使用SASL服务应要确保有cyrus-sasl-devel和cyrus-sasl-lib两个包,如果缺少这两个包,在安装带—enable-sasl参数的Memcached时会有错误提示: configure: error: Failed to locate the library containing sasl_server_init

最终生成的DB文件在/etc/下:-rw-r—– 1 root root 12288 Mar 6 11:52 /etc/sasldb2,如果sasl启动有问题,注意这个文件的权限。

可以查看当前的SASL用户:sasldblistusers2

qa1:启动memcached,/var/log/messages日志报错:ldapdb_canonuser_plug_init() failed in sasl_canonuser_add_plugin(): invalid parameter supplied

rpm -e cyrus-sasl-ldap

qa2:sql_select option missing;

解决办法是:查找资料后发现,该错误应该有由于安装了cyrus-sasl-sql套件导致的:

rpm -qa|grep cyrus-sasl-sql cyrus-sasl-sql-2.1.19-5.EL4.1AX 当安装该套件的时候,启动cyrus-sasl就会调用该库文件。但由于我并没有配置使用它,所以就报一个ERROR等级的信息咯。 解决办法好简单,卸载即可: rpm -e cyrus-sasl-sql

qa3:auxpropfunc error invalid parameter supplied

则应该是cyrus-sasl-ldap的问题,若并没有使用ldap,而安装了该包的话,就会报类似的信息。卸载它吧。

http://www.blog.chinaunix.net/uid-447479-id-3812253.html

(2).如何验证memcached-sasl生效:

用python,java太重,php太坑。调试类,辅助类,建议最好用python,省事&快。参考:https://redislabs.com/lp/python-memcached/

使用python的bmemcached插件,安装:pip install python-binary-memcached。如果提示pip版本低,用pip install --upgrade pip先升级。

然后如下步骤验证:

[root@ops-dt03 python-memcached-1.58]# python

Python 2.7.5 (default, Aug 4 2017, 00:39:18)

[GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2

Type "help", "copyright", "credits" or "license" for more information.

import bmemcached

mc = bmemcached.Client('127.0.0.1:11211', 'zl', '111111') //注意这里的111111是用saslauthd配置时的密码

print mc.set('k1', 'v1')

True

print mc.get('k1')

v1

mc2 = bmemcached.Client('127.0.0.1:11211', 'zl', '111')

print mc2.get('k1')

Traceback (most recent call last):

File "", line 1, in

File "/usr/lib/python2.7/site-packages/bmemcached/client.py", line 110, in get

value, cas = server.get(key)

File "/usr/lib/python2.7/site-packages/bmemcached/protocol.py", line 406, in get

self._send(data)

File "/usr/lib/python2.7/site-packages/bmemcached/protocol.py", line 219, in _send

self._open_connection()

File "/usr/lib/python2.7/site-packages/bmemcached/protocol.py", line 131, in _open_connection

self._send_authentication()

File "/usr/lib/python2.7/site-packages/bmemcached/protocol.py", line 294, in _send_authentication

raise MemcachedException('Code: %d Message: %s' % (status, extra_content))

bmemcached.exceptions.MemcachedException: Code: 32 Message: Auth failure.

(3).安装memcache:这个不写了,套路。

(4).很坑的坑:

4.1.sasl添加的认证用户有两个密码,千万不要搞混。

为memcache-sasl添加专有认证用户:saslpasswd2 -a memcached -c testmemuser 要求输入密码,比如:pwd-mem-sasl,这个密码是给memcache-client用的,比如python-client, java-client, 用户名是testmuser(这个用户必须是服务器存在的)

检查认证用户的sasl机制是否增加成功:testsaslauthd –u testmemuser –p pwd-sys,这个pwd-sys是服务器系统用户testmemuser在这台机器的密码,是操作服务器用的。两回事。

4.2.在环境解决后,我们可能会在memcache服务端看到如下报错(memcached启动时加-vvv看详细日志)

authenticated() in cmd 0x01 is false

38 Writing an error: Auth failure.

这个是正常的,他是telnet-client,或者python-client等非认证访问时报的。那个 "cmd 0x01" 就是client传递过来的命令。这个很容易误认为memcached-sasl环境问题。

(5).非常重要的辅助手段:

5.1.系统日志:/var/log/messages,这个可以看到sasl,memcached系统级别的日志。

5.2.memcached 启动时加-vvv参数,看memcached的详细运行时日志。

5.3.用python去验证memcache-sasl.

5.4.鉴于sasl升级可能带来的问题,建议用supervisor做保活监控。

二.相关命令:

(1).启动memcached-sasl认证:

/opt/blueix/memcached/bin/memcached -d -m 1000 -u zl -S -p 11211 -c 1500 -P /opt/blueix/run/memcached1.pid

Clone this wiki locally