Kerberos是一种计算机网络认证协议,它容许某实体在非安全网络环境下通讯,向另外一个实体以一种安全的方式证实本身的身份。它也指由麻省理工实现此协议,并发布的一套免费软件。它的设计主要针对客户-服务器模型,并提供了一系列交互认证——用户和服务器都能验证对方的身份。Kerberos协议能够保护网络实体免受窃听和重复攻击。html
Kerberos协议基于对称密码学,并须要一个值得信赖的第三方。Kerberos协议的扩展能够为认证的某些阶段提供公钥密码学支持。node
机器部署:web
# | IP | 主机名 | Server | Client |
---|---|---|---|---|
1 | 192.168.101.232 | cdh-server-1 | N/A | N/A |
2 | 192.168.101.233 | cdh-node-1 | Kerberos server | Kerberos client |
3 | 192.168.101.234 | cdh-node-2 | N/A | Kerberos client |
4 | 192.168.101.235 | cdh-node-3 | N/A | Kerberos client |
各节点之间能够经过ssh免密码登陆
Kerberos服务器和客户之间的时间同步数据库
cdh-node-1
做为Kerberos主节点安装服务:缓存
yum install krb5-libs krb5-server krb5-workstation
经过命令查看安装列表rpm -qa|grep krb5
:安全
[root@cdh-node-1 /]# rpm -qa | grep krb5 krb5-workstation-1.15.1-19.el7.x86_64 krb5-devel-1.15.1-19.el7.x86_64 krb5-server-1.15.1-19.el7.x86_64 krb5-libs-1.15.1-19.el7.x86_64 [root@cdh-node-1 /]#
kdc服务器包含三个配置文件:服务器
# 集群上全部节点都有这个文件并且内容同步 /etc/krb5.conf # 主服务器上的kdc配置 /var/kerberos/krb5kdc/kdc.conf # 可以不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体,须要添加配置 /var/kerberos/krb5kdc/kadm5.acl
1. 首先配置/etc/krb5.conf
文件:网络
[logging] default = FILE:/var/log/krb5libs.log kdc = FILE:/var/log/krb5kdc.log admin_server = FILE:/var/log/kadmind.log [libdefaults] default_realm = EXAMPLE.COM #此处须要进行配置,把默认的EXAMPLE.COM修改成本身要定义的值 dns_lookup_kdc = false dns_lookup_realm = false ticket_lifetime = 86400 renew_lifetime = 604800 forwardable = true default_tgs_enctypes = rc4-hmac default_tkt_enctypes = rc4-hmac permitted_enctypes = rc4-hmac udp_preference_limit = 1 kdc_timeout = 3000 [realms] EXAMPLE.COM = { kdc = cdh-node-1 #此处配置的为主机名 admin_server = cdh-node-1 #同上 }
配置项说明:
更多参数设置请参考:官方文档。并发
如下是几个核心参数的说明:dom
[logging]
:日志输出设置 (可选)[libdefaults]
:链接的默认配置
default_realm
:Kerberos应用程序的默认领域,全部的principal都将带有这个领域标志ticket_lifetime
: 代表凭证生效的时限,通常为24小时renew_lifetime
: 代表凭证最长能够被延期的时限,通常为一个礼拜。当凭证过时以后,对安全认证的服务的后续访问则会失败clockskew
:时钟误差是不彻底符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。一般,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的误差能够是在先后 5 分钟内udp_preference_limit= 1
:禁止使用 udp 能够防止一个 Hadoop 中的错误default_ccache_name
:credential缓存名,默认值为[realms]
:列举使用的 realm
kdc
:表明要 kdc 的位置。格式是 机器:端口admin_server
:表明 admin 的位置。格式是 机器:端口default_domain
:表明默认的域名[domain_realm]
:域名到realm的关系 (可选)2.配置/var/kerberos/krb5kdc/kdc.conf
文件
此处为EXAMPLE.COM与/etc/krb5.conf中的配置保持一致。
[kdcdefaults] kdc_ports = 88 kdc_tcp_ports = 88 [realms] EXAMPLE.COM = { #master_key_type = aes256-cts acl_file = /var/kerberos/krb5kdc/kadm5.acl dict_file = /usr/share/dict/words admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal camellia256-cts:normal camellia128-cts:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal }
配置项说明:
- `kdcdefaults`:kdc相关配置,这里只设置了端口信息 - `realms`:realms的配置 - `EXAMPLE.COM`:设定的realms领域 - `master_key_type`:和 supported_enctypes 默认使用 aes256-cts。JAVA 使用 aes256-cts 验证方式须要安装 JCE包(推荐不使用) - `acl_file`:标注了 admin 的用户权限,文件格式是:Kerberos_principal permissions [target_principal] [restrictions] - `supported_enctypes`:支持的校验方式 - `admin_keytab`:KDC 进行校验的 keytab
关于
AES-256
加密:
对于使用 Centos5.6 及以上的系统,默认使用AES-256
来加密的。这就须要集群中的全部节点上安装 JavaCryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File
。
下载的文件是一个 zip 包,解开后,将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security
3. 建立/var/kerberos/krb5kdc/kadm5.acl
内容为:*/admin@EXAMPLE.COM *
表明名称匹配/admin@EXAMPLE COM
都认为是admin,权限是 * 表明所有权限。
在KDC上咱们须要编辑acl文件来设置权限,该acl文件的默认路径是 /var/kerberos/krb5kdc/kadm5.acl
(也能够在文件kdc.conf中修改)。
Kerberos的kadmind daemon会使用该文件来管理对Kerberos database的访问权限。对于那些可能会对pincipal产生影响的操做,acl文件也能控制哪些principal能操做哪些其余pricipals。
4. 建立Kerberos数据库
此步可能用时较长,建立完成会在/var/kerberos/krb5kdc/
下面生成一系列文件。而且会提示输入数据库管理员的密码。
db5_util create -r EXAMPLE.COM –s # 此处为EXAMPLE.COM与/etc/krb5.conf中的配置保持一致。
其中,[-s]
表示生成stash file,并在其中存储master server key(krb5kdc);还能够用[-r]来指定一个realm name —— 当krb5.conf中定义了多个realm时才是必要的。
若是须要重建数据库,将/var/kerberos/krb5kdc
目录下的principal相关的文件删除便可.
当Kerberos database建立好后,能够看到目录 /var/kerberos/krb5kdc
下生成了几个文件:
kadm5.acl kdc.conf principal principal.kadm5 principal.kadm5.lock principal.ok
5. 添加database administrator
为Kerberos database添加administrative principals (即可以管理database的principals) —— 至少要添加1个principal来使得Kerberos的管理进程kadmind可以在网络上与程序kadmin进行通信。
建立管理员并输入密码admin
。kadmin.local能够直接运行在KDC上,而无需经过Kerberos认证。
为用户设置密码:
[root@cdh-node-1 /]# kadmin.local -q "addprinc admin/admin" Authenticating as principal root/admin@EXAMPLE.COM with password. WARNING: no policy specified for admin/admin@EXAMPLE.COM; defaulting to no policy Enter password for principal "admin/admin@EXAMPLE.COM": Re-enter password for principal "admin/admin@EXAMPLE.COM": Principal "admin/admin@EXAMPLE.COM" created.
6. 设置kerberos服务为开机启动,关闭防火墙
chkconfig krb5kdc on chkconfig kadmin on chkconfig iptables off
7. 启动krb5kdc和kadmind进程
/usr/sbin/kadmind /usr/sbin/krb5kdc
或
service krb5kdc start service kadmin start service krb5kdc status
如今KDC已经在工做了。这两个daemons将会在后台运行,能够查看它们的日志文件(/var/log/krb5kdc.log 和 /var/log/kadmind.log
)。
8. 检查Kerberos正常运行
kinit admin/admin
9. 集群中的其余主机安装Kerberos Client
yum install krb5-workstation krb5-libs krb5-auth-dialog
配置这些主机上的/etc/krb5.conf
,这个文件的内容与KDC中的文件保持一致便可。
10. 在cm节点安装ldap客户端
yum install openldap-clients
经常使用命令:
kinit admin/admin@EXAMPLE.COM # 初始化证书 klist # 查看当前证书 kadmin.local -q "list_principals" # 列出Kerberos中的全部认证用户 kadmin.local -q "addprinc user1" # 添加认证用户,须要输入密码 kinit user1 # 使用该用户登陆,获取身份认证,须要输入密码 klist # 查看当前用户的认证信息ticket kinit –R # 更新ticket kdestroy # 销毁当前的ticket kadmin.local -q "delprinc user1" # 删除认证用户
1. 登陆
登陆到管理员帐户,若是在本机上,能够经过kadmin.local直接登陆:
[root@cdh-node-1 /]# kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local:
其它机器的,先使用kinit进行验证:
[root@cdh-server-1 /]# kinit admin/admin Password for admin/admin@EXAMPLE.COM: [root@cdh-server-1 /]# kadmin Authenticating as principal admin/admin@EXAMPLE.COM with password. Password for admin/admin@EXAMPLE.COM: kadmin:
2. 增删改查帐户
在管理员的状态下使用addprinc
,delprinc
,modprinc
,listprincs
命令。使用?
能够列出全部的命令。
[root@cdh-node-1 /]# kadmin.local Authenticating as principal root/admin@EXAMPLE.COM with password. kadmin.local: delprinc test Are you sure you want to delete the principal "test@EXAMPLE.COM"? (yes/no): yes Principal "test@EXAMPLE.COM" deleted. Make sure that you have removed this principal from all ACLs before reusing. kadmin.local: listprincs HTTP/cdh-node-1@EXAMPLE.COM HTTP/cdh-node-2@EXAMPLE.COM HTTP/cdh-node-3@EXAMPLE.COM ...
3. 生成keytab:使用xst
命令或者ktadd
命令
[root@cdh-node-1 /]# kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1
1. 查看当前认证用户
[root@cdh-node-2 /]# klist Ticket cache: FILE:/tmp/krb5cc_0 Default principal: hdfs@EXAMPLE.COM Valid starting Expires Service principal 08/08/2018 17:49:41 08/09/2018 17:49:41 krbtgt/EXAMPLE.COM@EXAMPLE.COM
2. 认证用户
[root@cdh-node-2 /]# kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1
3. 删除当前的认证的缓存
[root@cdh-node-2 /]# kdestroy [root@cdh-node-2 /]# klist klist: No credentials cache found (filename: /tmp/krb5cc_0)
Kerberos principal用于在kerberos加密系统中标记一个惟一的身份。
kerberos为kerberos principal分配tickets使其能够访问由kerberos加密的hadoop服务。
对于hadoop,principals的格式为username/fully.qualified.domain.name@YOUR-REALM.COM.
keytab是包含principals和加密principal key的文件。 keytab文件对于每一个host是惟一的,由于key中包含hostname。keytab文件用于不须要人工交互和保存纯文本密码,实现到kerberos上验证一个主机上的principal。 由于服务器上能够访问keytab文件便可以以principal的身份经过kerberos的认证,因此,keytab文件应该被妥善保存,应该只有少数的用户能够访问。