默认 Hadoop 各个组件之间是没有任何认证的, 因此可以恶意伪装成某一组件接入到集群中干坏事.
Kerberos 是一个用于安全认证的第三方协议, 它采用了传统的共享密钥方式, 实现了在网络环境不一定保障安全的环境下, client 和 server 之间的通信. Kerberos 可以解决的问题:
解决服务器到服务器的认证. 由于 Kerberos 对集群中的所有机器都分发了 keytab, 相互之间使用密钥进行通信, 确保不会出现冒充服务器的情况. 集群中的机器是它们所宣称的, 可靠的.
解决客户端到服务器的认证. Kerberos 对可信任的客户提供认证, 确保它们可以执行作业的相关操作. 防止用户恶意冒充 client 提交作业的情况.
通过 kerberos, 可以将密钥实现放到可靠的节点上并只允许有限制的访问, 该节点启动时读取密钥, 并与 kerberos 交互进行认证, 从而接入到 hadoop 集群中, 提高 hadoop 集群的安全性.
环境
三台主机: cdh01,cdh02,cdh03
操作系统: CentOS release 6.8 (Final)
Kerberos 服务端安装配置
安装 kerberos
在 cdh01 机器上节点安装服务:
- yum -y install krb5-server
- yum -y install openldap-clients
kdc 服务器包含三个配置文件:
集群上所有节点都有这个文件而且内容同步:/etc/krb5.conf
主服务器上的 kdc 配置:{$30
- }kerberos/krb5kdc/kdc.conf
能够不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体, 需要添加配置:{$32
- }kerberos/krb5kdc/kadm5.acl
修改 kerberos 配置文件
修改{$34
- }krb5.conf
- vim /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 = WOCDH.COM
- dns_lookup_realm = false
- dns_lookup_kdc = false
- ticket_lifetime = 24h
- renew_lifetime = 7d
- forwardable = true
- renewable = true
default_tgs_enctypes = rc4-hmac aes128-cts des3-hmac-sha1 des-cbc-md5 arcfour-hmac des-cbc-crc
default_tkt_enctypes = rc4-hmac aes128-cts des3-hmac-sha1 des-cbc-md5 arcfour-hmac des-cbc-crc
permitted_enctypes = rc4-hmac aes128-cts des3-hmac-sha1 des-cbc-md5 arcfour-hmac des-cbc-crc
- udp_preference_limit = 1
- kdc_timeout = 3000
- [realms]
- WOCDH.COM = {
- kdc = cdh01.com
- admin_server = cdh01.com
- }
- [domain_realm]
- cdh01.com = WOCDH.COM
配置说明:
[logging]: 日志输出设置
[libdefaults]: 连接的默认配置
default_realm:Kerberos 应用程序的默认领域, 所有的 principal 都将带有这个领域标志
ticket_lifetime: 表明凭证生效的时限, 一般为 24 小时
renew_lifetime: 表明凭证最长可以被延期的时限, 一般为一个礼拜. 当凭证过期之后, 对安全认证的服务的后续访问则会失败
clockskew: 时钟偏差是不完全符合主机系统时钟的票据时戳的容差, 超过此容差将不接受此票据. 通常, 将时钟扭斜设置为 300 秒 (5 分钟). 这意味着从服务器的角度看, 票证的时间戳与它的偏差可以是在前后 5 分钟内
udp_preference_limit= 1: 禁止使用 udp 可以防止一个 Hadoop 中的错误
[realms]: 列举使用的 realm
kdc: 代表要 kdc 的位置. 格式是 机器: 端口
admin_server: 代表 admin 的位置. 格式是 机器: 端口
default_domain: 代表默认的域名
[domain_realm]: 域名到 realm 的关系
修改{$39
- }kerberos/krb5kdc/kdc.conf
- vim /var/kerberos/krb5kdc/kdc.conf
- [kdcdefaults]
- kdc_ports = 88
- kdc_tcp_ports = 88
- [realms]
- WOCDH.COM = {
- #master_key_type = aes256-cts
- acl_file = /var/kerberos/krb5kdc/kadm5.acl
- dict_file = /usr/share/dict/words
- max_renewable_life = 7d
- max_life = 1d
- admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
supported_enctypes = aes256-cts:normal aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
- default_principal_flags = +renewable, +forwardable
- }
配置项说明:
kdcdefaults:kdc 相关配置, 这里只设置了端口信息
realms:realms 的配置
WOCDH.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
修改 / var/kerberos/krb5kdc/kadm5.acl 配置
创建 / var/kerberos/krb5kdc/kadm5.acl, 并添加一下内容:
*/admin@WOCDH.COM *
创建 Kerberos 数据库
kdb5_util create -r WOCDH.COM -s
该命令会在
- /var/kerberos/krb5kdc/
目录下创建 principal 数据库
如果需要重建数据库, 将该目录下的 principal 相关的文件删除即可
- # 删除 principal 相关文件
- rm -rf /var/kerberos/krb5kdc/principal*
- # 重新初始化数据库
kdb5_util create -r WOCDH.COM -s
创建 Kerberos 管理员
在 KDC master 上执行以下命令, 需要设置两次密码, 这个账号将会被 CDH 用来生成其他用户 / 服务的 principal
kadmin.local -q "addprinc cloudera-scm/admin"
principal 的名字的第二部分是 admin, 那么该 principal 就拥有 administrative privileges
启动 kerberos 服务
将 kerberos 服务添加到自启动服务, 并启动 krb5kdc 和 kadmin 服务
- chkconfig krb5kdc on
- chkconfig kadmin on
- service krb5kdc start
- service kadmin start
Kerberos 客户端安装配置
安装 kerberos 客户端
在另外两节点上安装 krb5-devel,krb5-workstation
yum install krb5-devel krb5-workstation -y
配置文件同步
将 KDC Server 的 krb5.conf 文件同步到所有的客户端机器
- scp /etc/krb5.conf root@cdh02.com:/etc/krb5.conf
- scp /etc/krb5.conf root@cdh03.com:/etc/krb5.conf
测试 kerberos
- # 列出 Kerberos 中的所有认证用户, 即 principals
- kadmin.local -q "list_principals"
- # 添加认证用户, 需要输入密码
- kadmin.local -q "addprinc user1"
- # 使用该用户登录, 获取身份认证, 需要输入密码
- kinit user1
- # 查看当前用户的认证信息 ticket
- klist
- # 更新 ticket
- kinit -R
- # 销毁当前的 ticket
- kdestroy
- # 删除认证用户
- kadmin.local -q "delprinc user1"
- # 创建认证用户
- kadmin.local -q "addprinc -pw test123 test/admin@WOCDH.COM"
- kadmin.local -q "addprinc -randkey test/admin@WOCDH.COM"
- # 导出 keytab 文件
kadmin.local -q "xst -k test.keytab test/admin@WOCDH.COM"
kinit -k -t test.keytab test/admin@WOCDH.COM
CDH 集成 Kerberos
Cloudera Manager 启用 kerberos
管理 -> 安全 -> 启用 Kerberos
KDC 信息配置
加密类型如下:
KRB5 配置
配置 KDC Account Manager 凭据
导入 KDC Account Manager
配置 Kerberos 主体
配置端口
启用 Kerberos
来源: https://mp.weixin.qq.com/s/EvuAVEWK9Q3o2uJ-JpR2pg