认证高可用
为了识别用户和防止中间人攻击,ceph提供了cephx 认证系统来认证用户和进程。
注:cephx不提供对地址数据的加密和 rest的加密。
Cephx是通过共享秘钥来实现认证的,也就是说,客户端和服务端拥有相同的秘钥。认证协议是这样的,交互的双方能够相互证明彼此有秘钥的副本而不把它暴露出来。这样就能提供相互认证,即:客户端确信用户拥有秘钥,用户也确信客户端也有一个秘钥的副本。
Ceph key 的可伸缩特性是避免ceph 对象存储的接口集中,也就是说ceph client必须可以直接与osd交互。为了保护数据,ceph提供了cephx认证系统,它主要认证用户操作的客户端。Cephx协议操作在某种意义上类似于kerberos。
用户或者角色通过client来联系monitor。这个跟kerberos不同,每个moniter都能够认证用户和分发秘钥,所以使用cephx认证系统就不会有单点故障和瓶颈。Monitor会返回一个结构类似于kerberos ticket的认证数据,里面包含使用ceph service的时候需要的session key。Session key是经用户的秘钥加密过得,所以只有用户本身可以从monitors请求服务。Client使用session key从monitor那请求需要的服务,monitors会发送给客户端一个key,这个key用于client和osd之间的认证。Ceph的monitors和osd共享一个秘钥,所以客户端可以在集群中和osd ,metadata server共同使用这个monitors提供的key。类似于kerberos,ceph ticket是有期限的,所以攻击者不能够使用过期的ticket或者session key。这种认证方式可以防止攻击者中间伪造用户消息,或者篡改用户消息,只要用户的密码没有暴露出来。
使用cephx,首先管理员必须要先建立一个用户。下面这张图展示了,用户client.admin调用命令ceph auth get-or-create-key 创建一个用户和秘钥。Ceph的子系统auth会产生一个用户名和秘钥,在monitor中保存一个副本,然后把用户的秘钥传给client.admin用户。这意味着client和monitor共用同一个密码。
在使用monitors认证的时候,客户端要把用户名提供给monitor,monitor产生一个session key,而且使用用户的秘钥对session key加密,然后,monitor把加了密的session key传递给client,客户端使用共享的秘钥对接收到的包解密得到session key。Session key是用来鉴别正在会话的用户。Client 然后使用session key向monitor请求一个代表用户签名的ticket。Monitor就会为用户产生一个ticket,使用用户的秘钥对其进行加密,然后再传送给client。Client再对ticket解密,然后使用ticket签署对osd和metadata server的请求。
使用cephx协议在client和ceph sever之间交互的时候,在经过认证之后,client 和server之间的消息都要经 monitor,osd和metadata 使用共享秘钥审查的ticket签名。
认证只存在于client和server之间,对于对client的访问是没有认证机制的,用户主机到client主机之间的认证是无效的。