hadoop之启用安全性后,运行任何Hadoop命令都会失败。
txw1958
阅读:240
2025-05-04 20:05:19
评论:0
我试图为 CDH 4.3 (通过Cloudera Manager)测试平台启用Kerberos。因此,在WebUI中将身份验证从“简单”更改为Kerberos后,我无法执行任何hadoop操作,如下所示。无论如何,有没有明确指定keytab?
[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]#
以及 Realm 中的负责人列表。
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的密钥表,并用于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
一切都徒劳。任何的想法??
谢谢你,
请您参考如下方法:
我遇到了一个问题,其中我拥有一个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文档,但某些文档似乎仅适用于旧版本。
请注意,问题归结为配置问题,但是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缺省HDFS用户和组限制
默认安装的Cloudera对hadoop命令的执行具有用户和组限制,包括对某些用户的特定禁止(更多信息请参见 http://www.cloudera.com/documentation/enterprise/5-6-x/PDF/cloudera-security.pdf第57页)。
有几个属性可以处理此问题,包括将hdfs的超组设置为字符串
supergroup而不是
hdfs,默认情况下将
dfs_permissions enabled属性设置为
false(
hadoop user file permissions),禁止uid超过1000的用户。
这些因素中的任何一个都是可能的,对我而言,是HDFS列在banned.users属性中。
专门针对用户HDFS,如果要尝试使用hdfs执行hadoop命令,请确保已从hdfs-site.xml配置的banned.users配置属性中删除了hdfs。
1) UNPRIVILEGED USER AND WRITE PERMISSIONS
Cloudera建议的执行Hadoop命令的方法是创建非特权用户和匹配的主体,而不是使用hdfs用户。需要注意的是,该用户还需要自己的
/user目录,并且可能会在/ user目录中遇到写权限错误。如果您的非特权用户在
/user中没有目录,则可能会导致“写入权限被拒绝”错误。
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。如果设置了错误的目录权限,则Kerberos安装将失败。数据节点的端口还必须设置为1024以下的值,对于HTTP端口,建议将其设置为1006,对于数据节点端口,建议将其设置为1004。
数据节点目录
http://www.cloudera.com/documentation/enterprise/5-6-x/topics/cdh_ig_hdfs_cluster_deploy.html
数据节点端口
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
纱
$ rm -rf ${yarn.nodemanager.local-dirs}/usercache/*
除了YARN之外,所有这些步骤都可以随时发生。 YARN的步骤必须在安装Kerberos之后进行,因为它正在执行的操作是删除非Kerberos化YARN数据的用户缓存。在安装Kerberos之后运行mapreduce时,应使用以Kerberized用户缓存的数据填充。
YARN用户缓存
YARN Application exited with exitCode: -1000 Not able to initialize user directories
KERBEROS主要问题
1) SHORT NAME RULES MAPPING
Kerberos主体被“映射”到OS级服务用户。例如,仅因为在Hadoop核心站点中设置了名称映射规则,hdfs / WHATEVER @ REALM才在操作系统中映射到服务用户“hdfs”。如果没有名称映射,Hadoop将不知道哪个用户由哪个主体进行身份验证。
如果您使用的主体应映射到hdfs,请确保根据这些Hadoop规则将主体名称正确解析为hdfs。
好
(默认情况下具有名称映射规则)
错误的
(默认情况下,没有名称映射规则)
除非您添加规则以适应“不良”示例,否则它将无法正常工作
名称规则映射
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)是正在积极使用的密钥的版本(就像您有房门 key ,然后又改变了门上的锁,以便使用新的密钥一样,旧的密钥就不再有用了) 。密钥表和主体均具有KVNO,并且版本号必须匹配。
默认情况下,当您使用ktadd或xst将主体导出到密钥表时,它将更改密钥表的版本号,但不更改主体的KVNO。因此,您最终可能会意外地造成不匹配。
将主体导出到密钥表时,请将
-norandkey与
kadmin或
kadmin.local一起使用,以避免更新密钥表编号和创建KVNO不匹配。
通常,每当主体存在身份验证问题时,请确保检查主体和密钥表的KVNO是否匹配:
校长
$ kadmin.local -q 'getprinc myprincipalname'
Keytab
$ klist -kte mykeytab
创建负责人
http://www.cloudera.com/documentation/archive/cdh/4-x/4-3-0/CDH4-Security-Guide/cdh4sg_topic_3_4.html
安全的JARS和JAVA主页
1) JAVA VERSION MISMATCH WITH JCE JARS
Hadoop需要安装Java安全性JCE无限强度jar才能使用Kerberos的AES-256加密。 Hadoop和Kerberos都需要有权访问这些jar。这是一个安装问题,但很容易遗漏,因为您可以认为实际上没有安装安全 jar 。
要检查的JCE配置:
$JAVA_HOME/jre/lib/security $JAVA_HOME中是否存在将/etc/hadoop/conf/hadoop-env.sh导出到正确的Java安装位置的语句如果Hadoop的
JAVA_HOME设置不正确,它将失败并显示“GSS INITIATE FAILED”。如果 jar 不在正确的位置,则Kerberos将找不到它们,并且会给出一个错误,提示它不支持AES-256加密类型(UNSUPPORTED ENCTYPE)。
使用JCE Jars的Cloudera
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上执行
rpm -qa | grep krb5或在Debian / Ubuntu上执行
aptitude search krb5 -F "%c %p %d %V"。
因此,请像执行常规的kinit一样,然后执行
kinit -R强制更新票证。
$ kinit -kt mykeytab myprincipal
$ kinit -R
最后,我实际上遇到的问题在任何地方都找不到,...
配置文件和票务指导
Kerberos有两个重要的配置文件,
krb5.conf和kdc.conf。这些是krb5kdc服务和KDC数据库的配置。我的问题是
krb5.conf文件具有一个属性:
default_ccache_name = KEYRING:persistent:%{uid}。
这将我的缓存名称设置为KEYRING:persistent和用户uid(解释为 https://web.mit.edu/kerberos/krb5-1.13/doc/basic/ccache_def.html)。当我执行kinit时,它在/ tmp中创建了票证,因为在其他地方将缓存名称设置为/ tmp。 Cloudera服务获得在运行时在/ var / run / cloudera-scm-agent / process中生成的文件的身份验证,并且这些文件在执行
kinit之前均会导出缓存名称环境变量(KRB5CCNAME)。这就是为什么Cloudera可以获取票证但我的hadoop用户无法获取票证的原因。
解决方案是从krb5.conf中删除设置default_ccache_name的行,并允许kinit将凭据存储在
/tmp中,该文件是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页开始。
声明
1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。



