序言
kerberos 除了说帮我们验证Java程序是否具有权限来请求Hadoop的服务,也可以来帮助我们检查新增的节点是是否是真实的节点,还是黑客为了套取数据的节点.
比如为HDFS新增一个DataNode节点,如果没有Kerberos验证, 随便一个节点只要连接上NameNode就会存储数据,黑客就可以获取到我们的数据cuiyaonan2000@163.com
Kerberos
Kerberos是一种计算机网络认证协议,它允许某实体在非安全网络环境下通信,向另一个实体以一种安全的方式证明自己的身份,协议基于对称密码学,并需要一个值得信赖的第三方(KDC)
Kerberos 是第三方认证机制,其中用户和服务依赖于第三方(Kerberos 服务器)来对彼此进行身份验证。 Kerberos服务器本身称为密钥分发中心或 KDC。
如上Kerberos就是KDC ,那KDC中有如下的2个模块:
- AS(Authentication Server)= 认证服务器
- TGS(Ticket Granting Server)= 票据授权服务器
工作流程
如上的流程:
- 客户端通过密钥与AS交互,获取一个临时的Ticket(这里面流程比较复杂,这里简答说下.比如AS会用密钥解密客户端的信息等)
- 客户端拿到AS发送的Ticket 去TGS交互,获取一个正式的Ticket(这个票据比较特殊叫TGT).
- 客户端拿着特殊的 TGT Ticket 去请求服务端
- 服务端拿到TGT Ticket 去跟KDC交互 验证是否正确,正确就放行客户端通过.
Launch Kerberos Service
安装命令:
yum -y install krb5-server krb5-lib krb5-workstation
安装完成后需要修改三个配置文件(这些文件在安装完后会自动创建,根据需要修改如下的内容cuiyaonan2000@163.com):
- /var/kerberos/krb5kdc/kdc.conf
- /var/kerberos/krb5kdc/kadm5.acl
- /etc/krb5.conf
kdc.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_ports :指定KDC的默认端口。
kdc_tcp_ports :指定KDC的TCP协议默认端口。
[realms]
EXAMPLE.COM :是设定的kerberos域,一般会改这个,这个根据其名字很容易理解就是设置一个被管理的网站根域名,后面创建的账号都是属于该域名的cuiyaonan2000@163.com
acl_file :标注了admin的用户权限的文件,若文件不存在,需要用户自己创建。
dict_file :该参数指向包含潜在可猜测或可破解密码的文件。
admin_keytab :KDC 进行校验的 keytab。
supported_enctypes :指定此KDC支持的各种加密类型。
kadm5.acl
自动创建的内容如下:
*/admin@EXAMPLE.COM *
如上只有两列内容:第一列为用户名,第二列为权限分配
- */admin@EXAMPLE.COM : 表示 admin是属于EXAMPLE.COM中的一个账户,这个EXAMPLE.COM就是我们之前在kdc.conf中设置的
- 第二个 * 表示拥有所有权限
krb5.conf
自动创建的内容如下
# Configuration snippets may be placed in this directory as well
includedir /etc/krb5.conf.d/
[logging]
default = FILE:/var/log/krb5libs.log
kdc = FILE:/var/log/krb5kdc.log
admin_server = FILE:/var/log/kadmind.log
[libdefaults]
dns_lookup_realm = false
ticket_lifetime = 24h
renew_lifetime = 7d
forwardable = true
rdns = false
pkinit_anchors = FILE:/etc/pki/tls/certs/ca-bundle.crt
# default_realm = EXAMPLE.COM
default_ccache_name = KEYRING:persistent:%{uid}
[realms]
# EXAMPLE.COM = {
# kdc = kerberos.example.com
# admin_server = kerberos.example.com
# }
[domain_realm]
# .example.com = EXAMPLE.COM
# example.com = EXAMPLE.COM