作者:张华 发表于:2015-06-03
版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明
( http://blog.csdn.net/quqi99 )
用户系统一般分为用户认证与授权两大问题。keystone用一个SQL backend用作认证,它不是一个好的认证系统。
一般用户的密码被存储成MD5存储在DB里,但用户仍然需要输入clear text password去keystone server认证,所以这中间需要配置SSL/TLS来保护密码。
但是这样有可能由一个恶意的keystone管理员修改keystone或者从内存中得到用户的clear text password。所以基于密码的认证系统一般会对密码的强度、修改周期等做一些强制规定,但keystone没有做这些事情。
Keystone + LDAP可以代替Keystone + SQL来解决这个问题。大多数user和group信息是存储在中心化的LDAP服务器里。但是问题依旧,现有的keystone LDAP backend仍然将明文密码发给LDAP端,然后LDAP将密码转成MD5值去比较。所以Keystone与LDAP之间也应该通过SASL加密密码传输。遗憾的是,目前rabbitmq或LDAP都支持SASL,但keystone本身是不支持SASL的。
Keystone也支持通过设置REMOTE_USER环境变量通过Apache HTTP走外部非密码的认证系统(基于token,用户不再发密码到keystone,而是直接先发加密后的密码到外部认证系统获得token),如Kerberso或者X.509客户端证书, 这样密码不需要存储到keystone及LDAP里了,这时候Keystone仅仅用于授权。这样实现了认证提供者(Kernerso)服务提供者的解偶(Keystone),它们两者之间的SSO通信通过基于XML的SAML(安全断言标记语言,Security Assertion Markup Language)标准在不同的安全域之间交换认证和授权数据。这也适合用于Keystone Federation。
Apache HTTPD模块会通过mod_lookup_identity去调用Linux操作系统的SSSD deamon(一个认证的插件系统,它再和各种身份认证服务器打交道,如FreeIPA, Active Directory, LDAP),SSSD的引入大大减轻了keystone实现的复杂性。同理,使用mod_ssl代替mod_auth_kerb就可以改由支持X.509客户证书认证。使用mod_shib或者mod_mellon就可以改由支持SAML。
SSL/TLS是一种通信协议(一般用公钥加密私钥解密,用私钥加密公钥解密叫数字签名,那么采用非对称加密算法来加密对称加密算法的秘钥的叫SSL,见:http://blog.csdn.net/quqi99/article/details/24031201),而SASL是一个框架,集成了其他协议。他们都提供身份验证,数据签名和加密。SASL(Simple Authentication and Security Layer)的本质是一个插件系统在客户端和服务器标准化认证规范(它支持有:plain, 一次一密的otp, digest-md5客户端不在网上传密码只对服务器发过的密码的MD5作一个响应是否正确, 密码可以不用在网络上传输, 也就不用怕密码被窃听,kerberos),而SSL绑定是基于证书做认证. SASL中,您可以选择使用GSSAPI,则Kerberos,NTLM等。所以上面的情况需要在keystone与rabbitmq之间采用SASL以支持加密的密码方式传输(当时设置SSL可以做同样的事情,见:http://lingxiankong.github.io/blog/2014/02/06/openstack-ssl/),但遗憾的是,尽量rabbitmq支持SASL,但keystone不支持。