Stay hungry Stay foolish

CDH中启用 Kerberos 身份验证

Posted on By blue

目录



CDH中启用 Kerberos 身份验证

1、安装准备

前提条件:

  • Hadoop的集群上已安装好了CDH 以及 Cloudera Manager
  • openldap-clients 在 Cloudera Manager Server 主机上
  • krb5-workstation、krb5-libs 安装在所有主机上

整体步骤:

  • 步骤 1:安装 JCE 策略文件
  • 步骤 2:为 Cloudera Manager Server 创建 Kerberos Principal
  • 步骤 3:CDH中启用 Kerberos
  • 步骤 4:创建 HDFS 超级用户
  • 步骤 5:为每个用户帐户创建 Kerberos Principal
  • 步骤 6:检查 Kerberos 是否正常工作

2、安装 JCE 策略文件

如果操作系统是CentOS/Red Hat 5.5或更高版本(OS默认使用AES-256来加密tickets),则必须在所有的集群节点以及Hadoop使用者的主机上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File 。

为Cloudera Hadoop集群安装JCE Policy File的过程可以 参考这里

3、创建 Cloudera Manager Principal

为了让CM在集群创建和部署host principals和keytabs,Cloudera Manager Server 必须具有正确的 Kerberos Principal。另外,一个principal的名字的第二部分是admin(例如, username/admin@YOUR-LOCAL-REALM.COM ),那么该principal就拥有administrative privileges。

在 kadmin.local 或 kadmin shell 中,创建 Cloudera Manager Server Principal:

kadmin:  addprinc -pw <Password> cloudera-scm/admin@YOUR-LOCAL-REALM.COM

创建成功后,执行listprincs命令,确认账户创建成功:

kadmin:  listprincs
cloudera-scm/admin@DOUYU.COM

4、CDH 中启用Kerberos

在Cloudera Manager界面上点击Cluster名称右边的『Enable Kerberos』选项:

点击之后,会要求你确认以下的事项:

第一项,确认KDC已经安装好并且正在运行;

第二项,将KDC配置为允许renewable tickets with non-zerolifetime;

方法:在/var/kerberos/krb5kdc/kdc.conf文件中如下配置

[kdcdefaults]
 kdc_ports = 88
 kdc_tcp_ports = 88


[realms]
 DOUYU.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 des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
  default_principal_flags = +renewable, +forwardable
  max_life = 1d
  max_renewable_life = 7d 
}

其中必要的选项是kdc_tcp_ports、max_life和max_renewable_life,确保在 kdc.conf.中包含以下行:

max_life = 1d
max_renewable_life = 7d

第三项, 第四项,在之前的步骤已完成,点击“继续”

输入KDC配置信息,

注意:Kerberos加密类型必须跟KDC实际支持的加密类型一致(即kdc.conf中的值)

点击“继续”,这一页中可以勾选通过CM来管理krb.conf配置

输入Cloudera Manager Principal(上面步骤中创建的cloudera-scm/admin@DOUYU.COM )的username和password。

点击“继续”,进入下一页,导入KDC Account Manager Credentials。

点击“继续”,进入下一页,系统提示需要部署客户端配置、重启所有服务。

5、创建 HDFS 超级用户

当为 HDFS 服务启用 Kerberos 时,系统无法通过sudo -u hdfs来访问HDFS了,因为此时还不存在一个名为hdfs的principal,必须创建一个Kerberos principal(其第一部分是hdfs)

在 kadmin.local 或 kadmin shell 中,使用如下命令:

kadmin:  addprinc hdfs@YOUR-LOCAL-REALM.COM

当以hdfs的身份来运行命令时,必须持有hdfs principal,命令为:

$ kinit hdfs@YOUR-LOCAL-REALM.COM

6、为用户创建Kerberos Principal

当群集上配置和启用 Kerberos 之后,客户端在Hadoop(CDH中安装的所有服务)中所有的操作必须通过身份认证,才能使用群集中的Hadoop 服务。主要通过两种方式,进行认证:

  • 使用密码认证

    使用用户密码通过kinit认证, 获取到的TGT存在本地凭证缓存当中, 供后续访问服务认证使用。一般在交互式访问中使用。

  • 使用 keytab 认证

    用户通过导出的keytab 可以免密码进行用户认证, 后续步骤一致。一般在应用程序中配置使用。

详见资料:http://tech.meituan.com/hadoop-security-practice.html

7、验证服务

登录到某一个节点后,查看是否已经认证:

$klist
klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_0)

可以看出,没有进行认证。执行查看hdfs目录的命令:

$hadoop fs -ls /

16/10/27 11:03:46 WARN security.UserGroupInformation: PriviledgedActionException as:root (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate fa
iled [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]16/10/27 11:03:46 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSEx
ception: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]16/10/27 11:03:46 WARN security.UserGroupInformation: PriviledgedActionException as:root (auth:KERBEROS) cause:java.io.IOException: javax.security.sasl.SaslExcep
tion: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]ls: Failed on local exception: java.io.IOException: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided
 (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "xx/100.222.333.102"; destination host is: "hostnamexxx":8020; 

此时提示错误信息。进行认证:

$kinit hdfs@DOUYU.COM
Password for hdfs@DOUYU.COM: 

查看认证信息:

$klist
Ticket cache: FILE:/tmp/krb5cc_503
Default principal: hdfs@DOUYU.COM

Valid starting     Expires            Service principal
10/27/16 11:05:50  10/28/16 11:05:50  krbtgt/DOUYU.COM@DOUYU.COM
renew until 11/03/16 11:05:50

再次执行查看hdfs目录的命令:

$hadoop fs -ls  /
Found 2 items
drwxrwxrwt   - hdfs supergroup          0 2016-10-26 20:31 /tmp
drwxr-xr-x   - hdfs supergroup          0 2016-10-26 20:26 /user

认证通过,命令正常执行。

同样,有可以执行hadoop-examples.jar来验证MapReduce服务等。

8、其他

Kerberos中principal的解释

在 Kerberos 安全机制里,一个 principal 就是 realm 里的一个对象,一个 principal 总是和一个密钥(secret key)成对出现的。

这个 principal 的对应物可以是 service,可以是 host,也可以是 user,对于 Kerberos 来说,都没有区别。

Kdc(Key distribute center) 知道所有 principal 的 secret key,但每个 principal 对应的对象只知道自己的那个 secret key 。这也是“共享密钥“的由来。

对于 hadoop,principals 的格式为 username/fully.qualified.domain.name@YOUR-REALM.COM。

长时间运行的Job怎样应对ticket expire的问题:

http://www.cloudera.com/documentation/enterprise/5-3-x/topics/cm_sg_yarn_long_jobs.html

参考资料:

Hadoop安全实践:http://tech.meituan.com/hadoop-security-practice.html

HDFS配置Kerberos认证:http://blog.javachen.com/2014/11/04/config-kerberos-in-cdh-hdfs