启用安全性后,运行任何Hadoop命令都会失败。

时间:2013-09-10 14:13:52

标签: hadoop mapreduce kerberos cloudera

我试图为我的 CDH 4.3 (通过Cloudera Manager)测试台启用Kerberos。因此,在WebUI中将身份验证从Simple更改为Kerberos后,我无法执行任何hadoop操作,如下所示。无论如何都要明确指定密钥表吗?

[root@host-dn15 ~]# su - hdfs
-bash-4.1$ hdfs dfs -ls /
13/09/10 08:15:35 ERROR security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause:javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
13/09/10 08:15:35 WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]
13/09/10 08:15:35 ERROR security.UserGroupInformation: PriviledgedActionException as:hdfs (auth:KERBEROS) cause: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)]
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: "host-dn15.hadoop.com/192.168.10.227"; destination host is: "host-dn15.hadoop.com":8020;
-bash-4.1$ kdestroy
-bash-4.1$ kinit
Password for hdfs@HADOOP.COM:
-bash-4.1$ klist
Ticket cache: FILE:/tmp/krb5cc_494
Default principal: hdfs@HADOOP.COM

Valid starting     Expires            Service principal
09/10/13 08:20:31  09/11/13 08:20:31  krbtgt/HADOOP.COM@HADOOP.COM
    renew until 09/10/13 08:20:31

-bash-4.1$ klist -e
Ticket cache: FILE:/tmp/krb5cc_494
Default principal: hdfs@HADOOP.COM

Valid starting     Expires            Service principal
09/10/13 08:20:31  09/11/13 08:20:31  krbtgt/HADOOP.COM@HADOOP.COM
    renew until 09/10/13 08:20:31, Etype (skey, tkt): aes256-cts-hmac-sha1-96, aes256-cts-hmac-sha1-96
-bash-4.1$

所以我仔细研究了namenode日志,

2013-09-10 10:02:06,085 INFO org.apache.hadoop.ipc.Server: IPC Server listener on 8022: readAndProcess threw exception javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled)] from client 10.132.100.228. Count of bytes read: 0
javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Encryption type AES256 CTS mode with HMAC SHA1-96 is not supported/enabled)]

JCE策略文件已安装在所有节点上。

[root@host-dn15 security]# sha256sum ./local_policy.jar
4a5c8f64107c349c662ea688563e5cd07d675255289ab25246a3a46fc4f85767  ./local_policy.jar
[root@host-dn15 security]# sha256sum ./US_export_policy.jar
b800fef6edc0f74560608cecf3775f7a91eb08d6c3417aed81a87c6371726115  ./US_export_policy.jar
[root@host-dn15 security]# sha256sum ./local_policy.jar.bak
7b26d0e16722e5d84062240489dea16acef3ea2053c6ae279933499feae541ab  ./local_policy.jar.bak
[root@host-dn15 security]# sha256sum ./US_export_policy.jar.bak
832133c52ed517df991d69770f97c416d2e9afd874cb4f233a751b23087829a3  ./US_export_policy.jar.bak
[root@host-dn15 security]#

领域中的校长名单。

kadmin:  listprincs
HTTP/host-dn15.hadoop.com@HADOOP.COM
HTTP/host-dn16.hadoop.com@HADOOP.COM
HTTP/host-dn17.hadoop.com@HADOOP.COM
K/M@HADOOP.COM
cloudera-scm/admin@HADOOP.COM
hbase/host-dn15.hadoop.com@HADOOP.COM
hbase/host-dn16.hadoop.com@HADOOP.COM
hbase/host-dn17.hadoop.com@HADOOP.COM
hdfs/host-dn15.hadoop.com@HADOOP.COM
hdfs/host-dn16.hadoop.com@HADOOP.COM
hdfs/host-dn17.hadoop.com@HADOOP.COM
hdfs@HADOOP.COM
hue/host-dn15.hadoop.com@HADOOP.COM
host-dn16/hadoop.com@HADOOP.COM
kadmin/admin@HADOOP.COM
kadmin/changepw@HADOOP.COM
kadmin/host-dn15.hadoop.com@HADOOP.COM
krbtgt/HADOOP.COM@HADOOP.COM
mapred/host-dn15.hadoop.com@HADOOP.COM
mapred/host-dn16.hadoop.com@HADOOP.COM
mapred/host-dn17.hadoop.com@HADOOP.COM
root/admin@HADOOP.COM
root@HADOOP.COM
zookeeper/host-dn15.hadoop.com@HADOOP.COM
kadmin:  exit
[root@host-dn15 ~]#

导出hdfs的keytab并用于kinit。

-bash-4.1$ kinit -kt ./hdfs.keytab hdfs
-bash-4.1$ klist
Ticket cache: FILE:/tmp/krb5cc_494
Default principal: hdfs@HADOOP.COM

Valid starting     Expires            Service principal
09/10/13 09:49:42  09/11/13 09:49:42  krbtgt/HADOOP.COM@HADOOP.COM
    renew until 09/10/13 09:49:42

一切都变得徒劳无功。有什么想法??

非常感谢,

1 个答案:

答案 0 :(得分:2)

我遇到了一个问题,我有一个Kerberized CDH集群,即使有一个有效的Kerberos票证,我也无法从命令行运行任何hadoop命令。

注意: 写完这个答案后,我在http://sarastreeter.com/2016/09/26/resolving-hadoop-problems-on-kerberized-cdh-5-x/写了一篇博客文章。请分享!

即使使用有效的票证,也会失败:

$ hadoop fs -ls /

WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

这是我学到的以及我最终解决问题的方法。在可能的情况下,我已将Cloudera doc链接到当前版本,但某些文档似乎仅适用于旧版本。

请注意,问题归结为配置问题,但Kerberos本身和Cloudera Manager都已正确安装。我在搜索答案时遇到的许多问题都归结为Kerberos或Hadoop安装不正确。我发生的问题即使Hadoop和Kerberos都正常运行,但它们没有配置为正常协同工作。

TL; DR

确认你有门票

从您尝试执行hadoop命令的用户处执行klist

$ sudo su - myuser
$ klist

如果您没有票,则会打印:

klist: Credentials cache file '/tmp/krb5cc_0' not found

如果您尝试在没有故障单的情况下执行hadoop命令,则设计会出现GSS INITIATE FAILED错误:

WARN ipc.Client: Exception encountered while connecting to the server : javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]

换句话说,这不是安装问题。如果这是您的情况,请查看:

CDH DEFAULT HDFS用户和群组限制

Cloudera的默认安装对hadoop命令的执行有用户和组限制,包括对某些用户的特定禁止(http://www.cloudera.com/documentation/enterprise/5-6-x/PDF/cloudera-security.pdf第57页上的更多内容)。

有几个属性可以解决这个问题,包括将hdfs的超级组设置为字符串supergroup而不是hdfsdfs_permissions enabled属性设置为false by默认(hadoop user file permissions),uid超过1000的用户被禁止。

其中任何一个都可能是一个因素,对我而言,禁用了。在banned.users属性中列出了HDFS。

特别是对于用户HDFS,如果您尝试使用它来执行hadoop命令,请确保已从hdfs-site.xml配置中的banned.users配置属性中删除了hdfs。

  1) UNPRIVILEGED USER AND WRITE PERMISSIONS

Cloudera推荐的执行Hadoop命令的方法是创建一个非特权用户和匹配的主体,而不是使用hdfs用户。问题是该用户还需要自己的/user目录,并且可能会在/ user目录中遇到写权限错误。如果您的非特权用户在/user中没有目录,则可能导致WRITE权限被拒绝错误。

Cloudera知识文章

http://community.cloudera.com/t5/CDH-Manual-Installation/How-to-resolve-quot-Permission-denied-quot-errors-in-CDH/ta-p/36141

  2) DATANODE PORTS AND DATA DIR PERMISSIONS

另一个相关问题是Cloudera在非kerberized集群上将dfs.datanode.data.dir设置为750,但在kerberized集群上需要700。如果设置了错误的dir权限,Kerberos安装将失败。数据节点的端口也必须设置为1024以下的值,建议HTTP端口为1006,Datanode端口为1004。

Datanode目录

http://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hdfs_cluster_deploy.html

Datanode端口

http://www.cloudera.com/documentation/archive/manager/4-x/4-7-2/Configuring-Hadoop-Security-with-Cloudera-Manager/cmchs_enable_security_s9.html

  3) SERVICE-SPECIFIC CONFIGURATION TASKS 

在安全文档的第60页,有一些步骤可以解决Hadoop服务问题。确保你做到了这些!

MapReduce的
$ sudo -u hdfs hadoop fs -chown mapred:hadoop ${mapred.system.dir}
HBase的
$ sudo -u hdfs hadoop fs -chown -R hbase ${hbase.rootdir}
蜂房
$ sudo -u hdfs hadoop fs -chown hive /user/hive
YARN
$ rm -rf ${yarn.nodemanager.local-dirs}/usercache/*

所有这些步骤除了YARN之外都可以随时发生。 YARN的步骤必须在安装Kerberos之后进行,因为它正在执行的操作是删除非kerberized YARN数据的用户缓存。在Kerberos安装后运行mapreduce时,应使用Kerberized用户缓存数据填充它。

YARN用户缓存

YARN Application exited with exitCode: -1000 Not able to initialize user directories

KERBEROS PRINCIPAL ISSUES

  1) SHORT NAME RULES MAPPING

Kerberos主体是"映射"到OS级服务用户。例如,hdfs / WHATEVER @ REALM映射到服务用户' hdfs'在您的操作系统中,仅因为Hadoop核心站点中设置了名称映射规则。如果没有名称映射,Hadoop将不知道哪个用户通过哪个主体进行了身份验证。

如果您使用应映射到hdfs的主体,请确保主体名称根据这些Hadoop规则正确解析为hdfs。

不可

(默认情况下具有名称映射规则)

  • hdfs @ REALM
  • HDFS / _HOST @ REALM

(默认情况下没有名称映射规则)

  • hdfs-TAG @ REALM

"坏"除非您添加规则以适应它,否则示例将无效

名称规则映射

http://www.cloudera.com/documentation/archive/cdh/4-x/4-5-0/CDH4-Security-Guide/cdh4sg_topic_19.html

  2) KEYTAB AND PRINCIPAL KEY VERSION NUMBERS MUST MATCH

密钥版本号(KVNO)是正在使用的密钥的版本(就好像你有一把房子钥匙然后改变了门上的锁,所以它使用了一把新钥匙,旧的钥匙不再使用好的)。 keytab和principal都有一个KVNO,版本号必须匹配。

默认情况下,当您使用ktadd或xst将主体导出到keytab时,它会更改keytab版本号,但不会更改主体的KVNO。所以你最终可能会意外地造成不匹配。

将主体导出到密钥表时,将-norandkeykadminkadmin.local一起使用,以避免更新密钥表编号并创建KVNO不匹配。

通常,每当主体发出身份验证问题时,请务必检查主体和密钥表的KVNO是否匹配:

主要
$ kadmin.local -q 'getprinc myprincipalname'
密钥表
$ klist -kte mykeytab
创建校长

http://www.cloudera.com/documentation/archive/cdh/4-x/4-3-0/CDH4-Security-Guide/cdh4sg_topic_3_4.html

安全罐和JAVA HOME

  1) JAVA VERSION MISMATCH WITH JCE JARS

Hadoop需要安装Java安全JCE Unlimited Strength jar才能对Kerberos使用AES-256加密。 Hadoop和Kerberos都需要访问这些jar。这是一个安装问题,但它很容易被忽略,因为你可以认为你真的没有安装安全罐。

要检查的JCE配置:
  • 罐子是正确的版本 - 正确的安全罐与Java捆绑在一起,但是如果你安装它们之后你必须确保罐子的版本对应于Java的版本,否则你将继续得到错误。要进行故障排除,请检查您正在使用的全新JDK下载中的md5sum哈希值,以及Kerberos服务器上的md5sum哈希值。
  • 罐子位于正确的位置$JAVA_HOME/jre/lib/security
  • Hadoop配置为在正确的位置查找它们。检查$JAVA_HOME中是否有/etc/hadoop/conf/hadoop-env.sh的导出语句到JAVA_HOME
  • 中的正确Java安装位置

如果Hadoop设置错误rpm -qa | grep krb5,则会失败并且" GSS INITIATE FAILED"。如果罐子不在正确的位置,Kerberos将无法找到它们,并且会给出一个错误,它不支持AES-256加密类型(不支持的ENCTYPE)。

Cloudera与JCE Jars

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

对JCE Jars进行故障排除

https://community.cloudera.com/t5/Cloudera-Manager-Installation/Problem-with-Kerberos-amp-user-hdfs/td-p/6809

与JDK 6和MIT KERBEROS 1.8.1及更高版本续订的门票

Cloudera在http://www.cloudera.com/documentation/archive/cdh/3-x/3u6/CDH3-Security-Guide/cdh3sg_topic_14_2.html记录了一个问题,其中必须在发出hadoop命令之前续订票证。这仅适用于Oracle JDK 6 Update 26或更早版本以及MIT Kerberos发行版的1.8.1或更高版本的软件包。

要检查软件包,请在CentOS / RHEL上执行aptitude search krb5 -F "%c %p %d %V"或在Debian / Ubuntu上执行kinit -R

按照惯例做一个普通的kinit,然后执行$ kinit -kt mykeytab myprincipal $ kinit -R 强制更新票证。

krb5.conf

最后,我实际上遇到的问题无法在任何地方找到......

配置文件和门票缓存

Kerberos有两个重要的配置文件,krb5.conf和kdc.conf。这些是krb5kdc服务和KDC数据库的配置。我的问题是default_ccache_name = KEYRING:persistent:%{uid}文件有一个属性: kinit

这将我的缓存名称设置为KEYRING:persistent和user uid(解释https://web.mit.edu/kerberos/krb5-1.13/doc/basic/ccache_def.html)。当我做了一个kinit时,它在/ tmp中创建了票证,因为缓存名称在别处被设置为/ tmp。 Cloudera服务使用/ var / run / cloudera-scm-agent / process中运行时生成的文件获取身份验证,这些文件都会在执行/tmp之前导出缓存名称环境变量(KRB5CCNAME)。这就是为什么Cloudera可以获得门票,但我的hadoop用户无法获得门票。

解决方法是从krb5.conf中删除设置default_ccache_name的行并允许kinit在{{1}}中存储凭据,这是MIT Kerberos默认值DEFCCNAME(记录在https://web.mit.edu/kerberos/krb5-1.13/doc/mitK5defaults.html#paths)。

Cloudera和Kerberos安装指南:

步骤分步

https://www.cloudera.com/documentation/enterprise/5-6-x/topics/cm_sg_intro_kerb.html

高级疑难解答

http://www.cloudera.com/documentation/enterprise/5-6-x/PDF/cloudera-security.pdf,从第48页开​​始。