分布式安全--YARN & HDFS2 安装和配置Kerberos

本文详细介绍如何配置Hadoop的安全性,包括使用Kerberos进行身份验证、设置HDFS和YARN的安全参数、编译64位jsvc和container-executor、配置JobHistoryServer等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置hadoopsecurity

core-site.xml

  1. <property>  

  2.    <name>hadoop.security.authentication</name>  

  3.    <value>kerberos</value>  

  4. </property>  

  5. <property>  

  6.    <name>hadoop.security.authorization</name>  

  7.    <value>true</value>  

  8. </property>  

hadoop.security.authentication默认是simple方式,也就是基于linux操作系统的验证方式,用户端调用whoami命令,然后RPCcall给服务端,恶意用户很容易在其他host伪造一个相同的用户。这里我们改为kerberos

设置hdfssecurity

hdfs-site.xml

  1. <property>  

  2.         <name>dfs.block.access.token.enable</name>  

  3.         <value>true</value>  

  4. </property>  

  5. <property>  

  6.         <name>dfs.https.enable</name>  

  7.         <value>false</value>  

  8. </property>  

  9. <property>  

  10.         <name>dfs.namenode.https-address</name>  

  11.         <value>dev80.hadoop:50470</value>  

  12. </property>  

  13. <property>  

  14.         <name>dfs.https.port</name>  

  15.         <value>50470</value>  

  16. </property>  

  17. <property>  

  18.         <name>dfs.namenode.keytab.file</name>  

  19.         <value>/etc/hadoop.keytab</value>  

  20. </property>  

  21. <property>  

  22.         <name>dfs.namenode.kerberos.principal</name>  

  23.         <value>hadoop/_HOST@DIANPING.COM</value>  

  24. </property>  

  25. <property>  

  26.         <name>dfs.namenode.kerberos.https.principal</name>  

  27.         <value>host/_HOST@DIANPING.COM</value>  

  28. </property>  

  29. <property>  

  30.         <name>dfs.namenode.secondary.http-address</name>  

  31.         <value>dev80.hadoop:50090</value>  

  32. </property>  

  33. <property>  

  34.         <name>dfs.namenode.secondary.https-port</name>  

  35.         <value>50470</value>  

  36. </property>  

  37. <property>  

  38.         <name>dfs.namenode.secondary.keytab.file</name>  

  39.         <value>/etc/hadoop.keytab</value>  

  40. </property>  

  41. <property>  

  42.         <name>dfs.namenode.secondary.kerberos.principal</name>  

  43.         <value>hadoop/_HOST@DIANPING.COM</value>  

  44. </property>  

  45. <property>  

  46.         <name>dfs.namenode.secondary.kerberos.https.principal</name>  

  47.         <value>host/_HOST@DIANPING.COM</value>  

  48. </property>  

  49. <property>  

  50.         <name>dfs.datanode.data.dir.perm</name>  

  51.         <value>700</value>  

  52. </property>  

  53. <property>  

  54.         <name>dfs.datanode.address</name>  

  55.         <value>0.0.0.0:1003</value>  

  56. </property>  

  57. <property>  

  58.         <name>dfs.datanode.http.address</name>  

  59.         <value>0.0.0.0:1007</value>  

  60. </property>  

  61. <property>  

  62.         <name>dfs.datanode.https.address</name>  

  63.         <value>0.0.0.0:1005</value>  

  64. </property>  

  65. <property>  

  66.         <name>dfs.datanode.keytab.file</name>  

  67.         <value>/etc/hadoop.keytab</value>  

  68. </property>  

  69. <property>  

  70.         <name>dfs.datanode.kerberos.principal</name>  

  71.         <value>hadoop/_HOST@DIANPING.COM</value>  

  72. </property>  

  73. <property>  

  74.         <name>dfs.datanode.kerberos.https.principal</name>  

  75.         <value>host/_HOST@DIANPING.COM</value>  

  76. </property>  

  77. <property>  

  78.         <name>dfs.datanode.data.dir.perm</name>  

  79.         <value>700</value>  

  80. </property>  

  81. <property>  

  82.         <name>dfs.datanode.address</name>  

  83.         <value>0.0.0.0:1003</value>  

  84. </property>  

  85. <property>  

  86.         <name>dfs.datanode.http.address</name>  

  87.         <value>0.0.0.0:1007</value>  

  88. </property>  

  89. <property>  

  90.         <name>dfs.datanode.https.address</name>  

  91.         <value>0.0.0.0:1005</value>  

  92. </property>  

  93. <property>  

  94.         <name>dfs.datanode.keytab.file</name>  

  95.         <value>/etc/hadoop.keytab</value>  

  96. </property>  

  97. <property>  

  98.         <name>dfs.datanode.kerberos.principal</name>  

  99.         <value>hadoop/_HOST@DIANPING.COM</value>  

  100. </property>  

  101. <property>  

  102.         <name>dfs.datanode.kerberos.https.principal</name>  

  103.         <value>host/_HOST@DIANPING.COM</value>  

  104. </property>  

  105. <property>  

  106.         <name>dfs.web.authentication.kerberos.principal</name>  

  107.         <value>HTTP/_HOST@DIANPING.COM</value>  

  108. </property>  

  109. <property>  

  110.       <name>dfs.web.authentication.kerberos.keytab</name>  

  111.       <value>/etc/hadoop.keytab</value>  

  112.       <description>  

  113.                     The Kerberos keytab file with the credentials for the  

  114.                           HTTP Kerberos principal used by Hadoop-Auth in the HTTP endpoint.  

  115.       </description>  

  116. </property>  

配置中有几点要注意的

1. dfs.datanode.address表示datatransceiver RPCserver所绑定的hostnameIP地址,如果开启security,端口号必须小于1024(privilegedport),否则的话启动datanode时候会报“Cannotstart secure cluster without privileged resources”错误

2.principal中的instance部分可以使用'_HOST'标记,系统会自动替换它为全称域名

3.如果开启了security,hadoop会对hdfsblock data(dfs.data.dir指定)permissioncheck,方式用户的代码不是调用hdfsapi而是直接本地读blockdata,这样就绕过了kerberos和文件权限验证,管理员可以通过设置dfs.datanode.data.dir.perm来修改datanode文件权限,这里我们设置为700


namenodesecondarynamenode都是以hadoop用户身份启动

datanode需要以root用户身份用jsvc来启动,而Hadoop2.x自身带的jsvc32位版本的,需要去jsvc官网上重新下载编译


  1. wget http://mirror.esocc.com/apache//commons/daemon/binaries/commons-daemon-1.0.15-bin.tar.gz  

  2. cd src/native/unix; configure; make  

生成jsvc64executable,把它拷贝到$HADOOP_HOME/libexec,然后需要在hadoop-env.sh中指定JSVC_HOME到此路径,否则会报错"Itlooks like you're trying to start a secure DN, but $JSVC_HOME isn'tset. Falling back to starting insecure DN."


  1. [hadoop@dev80 unix]$ file jsvc  

  2. jsvc: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked (uses shared libs), for GNU/Linux 2.6.18, not stripped  

mvnpackage

编译commons-daemon-1.0.15.jar,拷贝到$HADOOP_HOME/share/hadoop/hdfs/lib下,同时删除自带版本的commons-daemonjar


hadoop-env.sh中修改


  1. # The jsvc implementation to use. Jsvc is required to run secure datanodes.  

  2. export JSVC_HOME=/usr/local/hadoop/hadoop-2.1.0-beta/libexec  

  3. # On secure datanodes, user to run the datanode as after dropping privileges  

  4. export HADOOP_SECURE_DN_USER=hadoop  

  5. # The directory where pid files are stored. /tmp by default  

  6. export HADOOP_SECURE_DN_PID_DIR=/usr/local/hadoop  

  7. # Where log files are stored in the secure data environment.  

  8. export HADOOP_SECURE_DN_LOG_DIR=/data/logs  


分发配置和jar到整个集群

hadoop帐号启动namenode,然后切换到root,再启动datanode,发现namenodeweb页面上有显示

Securityis ON

 "

启动securedatanode命令


  1. exec "$JSVC" \  

  2.          -Dproc_$COMMAND -outfile "$JSVC_OUTFILE" \  

  3.          -errfile "$JSVC_ERRFILE" \  

  4.          -pidfile "$HADOOP_SECURE_DN_PID" \  

  5.          -nodetach \  

  6.          -user "$HADOOP_SECURE_DN_USER" \  

  7.           -cp "$CLASSPATH" \  

  8.          $JAVA_HEAP_MAX $HADOOP_OPTS \  

  9.          org.apache.hadoop.hdfs.server.datanode.SecureDataNodeStarter "$@"  

如果启动过程中有什么问题可以查看$JSVC_OUTFILE(默认是$HADOOP_LOG_DIR/jsvc.out)和 $JSVC_ERRFILE(默认是$HADOOP_LOG_DIR/jsvc.err)信息来排错


设置yarnsecurity

yarn-site.xml

[html] viewplaincopyprint?

  1. <property>  

  2.         <name>yarn.resourcemanager.keytab</name>  

  3.         <value>/etc/hadoop.keytab</value>  

  4. </property>  

  5. <property>  

  6.         <name>yarn.resourcemanager.principal</name>  

  7.         <value>hadoop/_HOST@DIANPING.COM</value>  

  8. </property>  

  9. <property>  

  10.         <name>yarn.nodemanager.keytab</name>  

  11.         <value>/etc/hadoop.keytab</value>  

  12. </property>  

  13. <property>  

  14.         <name>yarn.nodemanager.principal</name>  

  15.         <value>hadoop/_HOST@DIANPING.COM</value>  

  16. </property>  

  17. <property>  

  18.         <name>yarn.nodemanager.container-executor.class</name>  

  19.         <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value>  

  20. </property>  

  21. <property>  

  22.         <name>yarn.nodemanager.linux-container-executor.group</name>  

  23.         <value>hadoop</value>  

  24. </property>  

container-executor默认是DefaultContainerExecutor,是以起Nodemanager的用户身份启动container的,切换为LinuxContainerExecutor会以提交application的用户身份来启动,它使用一个setuid可执行文件来启动和销毁container

这个可执行文件在bin/container-executor,不过Hadoop默认带的还是32位版本,所以需要重新编译

下载Hadoop2.x source code

mvnpackage -Pdist,native -DskipTests -Dtar-Dcontainer-executor.conf.dir=/etc

注:container-executor.conf.dir必须显示注明,它表示setuid可执行文件依赖的配置文件(container-executor.cfg)路径,默认会在$HADOOP_HOME/etc/hadoop下,不过由于该文件需要父目录和以上的目录的owner都为root,要不然会有以下报错,所以为了方便我们设置为/etc


  1. Caused by: org.apache.hadoop.util.Shell$ExitCodeException: File /usr/local/hadoop/hadoop-2.1.0-beta/etc/hadoop must be owned by root, but is owned by 500  

  2.         at org.apache.hadoop.util.Shell.runCommand(Shell.java:458)  

  3.         at org.apache.hadoop.util.Shell.run(Shell.java:373)  

  4.         at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:578)  

  5.         at org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor.init(LinuxContainerExecutor.java:147)  


默认的寻找configuration路径


  1. [root@dev80 bin]# strings container-executor  | grep etc  

  2. ../etc/hadoop/container-executor.cfg  

看出来是默认加载$HADOOP_HOME/etc/hadoop/container-executor.cfg

加上container-executor.conf.dir=/etc再编译后


  1. [hadoop@dev80 bin]$ strings container-executor | grep etc  

  2. /etc/container-executor.cfg  


container-executor.cfg中设置


  1. yarn.nodemanager.linux-container-executor.group=hadoop  

  2. min.user.id=499  

其中min.user.id表示启动container的最小uid,如果有低于这个值的uid启动task,就会fail掉。一般CentosRHEL用户帐号uid是从500开始


container-executor拷贝到$HADOOP_HOME/bin


  1. chown root:hadoop container-executor /etc/container-executor.cfg  

  2. chmod 4750 container-executor  

  3. chmod 400 /etc/container-executor.cfg  

同步配置文件到整个集群,用hadoop帐号启动ResourceManagerNodemanager

注意:为了方便测试,先不要将配置分发到所有集群,而是分到一台,然后起RM和一台NM,一切都okay后,再同步到所有host


设置jobhistoryserver security

mapred-site.xml

[html] viewplaincopyprint?

  1. <property>  

  2.         <name>mapreduce.jobhistory.keytab</name>  

  3.         <value>/etc/hadoop.keytab</value>  

  4. </property>  

  5. <property>  

  6.         <name>mapreduce.jobhistory.principal</name>  

  7.         <value>hadoop/_HOST@DIANPING.COM</value>  

  8. </property>  

启动JobHistoryServer

sbin/mr-jobhistory-daemon.shstart historyserver


执行命令kinit,获得一张tgt(ticketgranting ticket)


  1. [hadoop@dev80 hadoop]$ kinit -r 24l -k -t /home/hadoop/.keytab hadoop  

  2. [hadoop@dev80 hadoop]$ klist  

  3. Ticket cache: FILE:/tmp/krb5cc_500  

  4. Default principal: hadoop@DIANPING.COM  

  5. Valid starting     Expires            Service principal  

  6. 09/11/13 15:25:34  09/12/13 15:25:34  krbtgt/DIANPING.COM@DIANPING.COM  

  7.  renew until 09/12/13 15:25:34  

其中/tmp/krb5cc_500就是kerberosticket cache, 默认会在/tmp下创建名字为“krb5cc_”加上uid的文件,此处500表示hadoop帐号的uid


  1. [hadoop@dev80 hadoop]$ getent passwd  

  2. hadoop:x:500:500::/home/hadoop:/bin/bash  

用户也可以通过设置exportKRB5CCNAME=/tmp/krb5cc_500到环境变量来指定ticketcache路径


用完之后可以使用kdestroy命令来销毁掉该ticketcache


  1. [hadoop@dev80 hadoop]$ kdestroy   

  2. [hadoop@dev80 hadoop]$ klist  

  3. klist: No credentials cache found (ticket cache FILE:/tmp/krb5cc_500)  


如果本地没有ticketcache,会报如下错误


  1. 13/09/11 16:21:35 ERROR security.UserGroupInformation: PriviledgedActionException as:hadoop (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)]  


附上/etc/hadoop.keytab中的principal,都是serviceprincipal


  1. [hadoop@dev80 hadoop]$ klist -k -t /etc/hadoop.keytab  

  2. Keytab name: WRFILE:/etc/hadoop.keytab  

  3. KVNO Timestamp         Principal  

  4. ---- ----------------- --------------------------------------------------------  

  5.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  6.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  7.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  8.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  9.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  10.    1 06/17/12 22:01:24 hadoop/dev80.hadoop@DIANPING.COM  

  11.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  12.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  13.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  14.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  15.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  16.    1 06/17/12 22:01:24 host/dev80.hadoop@DIANPING.COM  

  17.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  

  18.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  

  19.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  

  20.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  

  21.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  

  22.    1 06/17/12 22:01:24 HTTP/dev80.hadoop@DIANPING.COM  


/home/hadoop/.keytab下放userprincipal


  1. [hadoop@dev80 hadoop]$ klist -k -t /home/hadoop/.keytab  

  2. Keytab name: WRFILE:/home/hadoop/.keytab  

  3. KVNO Timestamp         Principal  

  4. ---- ----------------- --------------------------------------------------------  

  5.    1 04/11/12 13:56:29 hadoop@DIANPING.COM  

由于keytab相当于有了永久凭证,不需要提供密码(如果修改kdc中的principal的密码,则该keytab就会失效),所以其他用户如果对该文件有读权限,就可以冒充keytab中指定的用户身份访问hadoop,所以keytab文件需要确保只对owner有读权限(0400)


本文转载http://blog.youkuaiyun.com/lalaguozhe/article/details/11570009



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值