Kerberos简介
Kerberos是一种基于对称密钥的身份认证协议,它作为一个独立的第三方的身份认证服务,可以为其它服务提供身份认证功能,且支持SSO(即客户端身份认证后,可以访问多个服务如HBase/HDFS等)。
Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-granting ticket)访问多个服务,即SSO(Single Sign On)。由于Kerberos协议在每个Client和Service之间具有共享密钥,使得该协议具有相当的安全性。
知识储备
- Kerberos是一种客户端/服务端架构。
- KDC:密钥分发中心(Key distribution Center),由三部分构成:Kerberos数据库、认证服务(Authentication service,AS)和票据授予服务(ticket-granting service,TGS)
- principal:主体,Kerberos中的身份标识称为主体。
- realm:域,确定了管理边界,所有主体均属于特定的Kerberos域。
- 主体和域的信息存储在Kerberos数据库中。
- TGT:票据授予票据,AS认证成功后授予用户的一种特殊票据
Kerberos服务端
安装
服务端安装KDC
1 | yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation -y |
配置
配置/etc/krb5.conf
。修改其中的realm,把默认的EXAMPLE.COM修改为自己要定义的值(如:PSVMC.CN),也可以不修改。
krb5.conf
其中,需要修改以下参数:
default_realm
:默认的realm。如PSVMC.CNkdc
:KDC 服务器的主机名或 IP 地址admin_server
:kadmind 服务器地址,默认与 kdc 相同[domain_realm]
:将域名映射到 realm
注意:
Master、Worker节点均需配置,且文件内容必须相同
1 | vi /etc/krb5.conf |
内容
1 | [logging] |
kdc.conf
仅配置Master节点,如果没有,需自建
1 | vi /var/kerberos/krb5kdc/kdc.conf |
内容
1 | [kdcdefaults] |
kadm5.acl
kadm5.acl文件用于设置哪些用户具有管理Kerberos数据库的权限。
1 | vi /var/kerberos/krb5kdc/kadm5.acl |
内容
1 | */admin@PSVMC.CN * |
设置Kerberos数据库ACL访问权限
第一列表示主体名,此处代表名称匹配`*/admin@PSVMC.CN`
第二列表示权限,
*
代码全部权限第三列为可选的,表示权限应用的目标实体,此处没有设置
比如下面的acl文件最后一条记录就设置了第三列:
1
2
3petter/admin@MYTRAIN.COM *
mary/admin@MYTRAIN.COM *
mary/admin@MYTRAIN.COM ADMICL */admin@MYTRAIN.COM
权限使用单个字母组合,小写字母表示授予该权限,大写字母表示拒绝该权限
权限列表:
权限 | 说明 |
---|---|
a | 向KDC数据库添加用户 |
d | 从KDC数据库中删除用户 |
m | 修改KDC数据库中的用户 |
c | 修改KDC数据库中的principal(主体)密码 |
i | 查询数据库,列举principal(主体)信息 |
*(或x) | 以上所有权限 |
创建Kerberos数据库
创建Kerberos数据库,需要设置管理员密码,创建成功后会在/var/Kerberos/krb5kdc/
下生成一系列文件,
如果重新创建,需要先删除/var/kerberos/krb5kdc
下面principal相关文件。
1 | cd /var/kerberos/krb5kdc/ |
需在Master节点的root用户下执行以下命令新建数据库:
1 | kdb5_util create -s -r PSVMC.CN |
输入自定义的数据库的密码为:zhangjian
启动服务
数据库创建成功后,需启动krb5服务:
1 | chkconfig --level 35 krb5kdc on |
两个服务的作用
- krb5kdc 认证使用
- kadmin 管理用户使用
创建kerberos的管理员
在Master节点的root用户下分别执行以下命令:
1 | kadmin.local |
添加管理员
1 | addprinc admin/admin@PSVMC.CN |
这里会让输入密码,我这里输入的zhangjian
查看所有用户
1 | listprincs |
先退出之前的登录
1 | quit |
用密码登录
1 | kinit admin/admin |
数据密码后即可登录
登录后查看认证状态
1 | klist |
管理用户命令
这些命令需要登录后执行
操作 | 描述 | 示例 |
---|---|---|
add_principal, addprinc, ank | 增加 principal | add_principal -randkey test@PSVMC.CN |
cpw | 修改密码 | cpw test@PSVMC.CN |
delete_principal, delprinc | 删除 principal | delete_principal test@PSVMC.CN |
modify_principal, modprinc | 修改 principal | modify_principal test@PSVMC.CN |
rename_principal, renprinc | 重命名 principal | rename_principal test@PSVMC.CN test2@ABC.COM |
get_principal, getprinc | 获取 principal | get_principal test@PSVMC.CN |
list_principals, listprincs, get_principals, getprincs | 显示所有 principal | listprincs |
ktadd, xst | 导出条目到 keytab | xst -k /root/test.keytab test@PSVMC.CN |
? | 查看帮助 | ? |
创建Kerberos的普通用户
创建 kerberos的普通用户及密钥文件,为配置时,各节点可以相互访问用。
在Master节点的root用户下分别执行以下命令
先删除之前的文件
1 | rm -rf /root/psvmc.keytab |
登录到管理员账户:
如果在本机上,可以通过kadmin.local直接登录。
1 | kadmin.local |
其它机器的,先使用kinit进行验证。
注意
psvmc.keytab相当于密匙文件,和密码作用一致。
创建用户及验证文件
1 | #如果村则先删除用户 |
设置相应的组
1 | chown root:root psvmc.keytab |
登录
1 | #方式1 用密码登录 |
Kerberos客户端
客户端上不用启动服务。
kerberos 客户端的常用命令是kinit、klist、kdestroy、kpasswd。
kinit用户登录。登录过程就是客户端从KDC获取票据TGT的过程。
登录成功后,票据被缓存在本地。实际上就是建立了安全会话。
klist
用户查看当前票据缓存中内容。kdestroy
用于退出登录,即销毁缓存中票据。kpasswd
用于修改用户(主体)口令。
安装
客户端安装krb5-level、krb5-workstation
1 | yum install krb5-devel krb5-workstation -y |
服务端其实已经安装了客户端的依赖,所以在服务端可以直接连接。
配置
Worker节点均需配置,且文件内容和Master相同
1 | vi /etc/krb5.conf |
内容
1 | [logging] |
其中下面的配置中可以不写端口,使用默认端口。
1 | [realms] |
登录
方式1
1 | kinit psvmc/hadoop |
方式2
需要把服务端生成的密钥文件psvmc.keytab复制过来。
1 | kinit -kt /root/psvmc.keytab psvmc/hadoop@PSVMC.CN |
查看认证状态
1 | klist |
Hadoop配置
core-site.xml
1 | <property> |
hdfs-site.xml
1 | <!-- kerberos start --> |
hadoop_env.sh
1 | export HADOOP_OPTS="$HADOOP_OPTS -Djava.library.path=${JAVA_HOME}/lib -Djava.security.krb5.conf=/etc/krb5.conf -Djava.security.krb5.realm=PSVMC.CN -Djava.security.krb5.kdc=hadoop01:88" |
ssl-server.xml
生成密匙对
1 | keytool -keystore /etc/security/keytab/keystore -alias jetty -genkey -keyalg RSA |
修改访问权
1 | chown -R root:root /etc/security/keytab/keystore |
分发
1 | ha-fenfa.sh /etc/security/keytab/keystore |
配置
1 | <!-- SSL密钥库路径 --> |