Hadoop 2.7.3-Kerberos认证

来源:互联网 发布:大乐透 简单公式算法 编辑:程序博客网 时间:2024/06/01 10:22

本文参考自:

http://blog.csdn.net/dxl342/article/details/55510659
http://hadoop.apache.org/docs/r2.5.2/hadoop-project-dist/hadoop-common/SecureMode.html
http://blog.csdn.net/wulantian/article/details/42173023

1. 搭建 Kerberos

1.1 环境
我们在三个节点的服务器上安装 Kerberos,这两个个节点上安装了 hadoop 集群,安装 hadoop。这两个节点机器分布为:ht25、ht26。
操作系统:CentOs 6.5
1.2 安装
各节点yum安装:
yum install krb5-server krb5-libs krb5-auth-dialog krb5-workstation -y
1.3 配置
kdc 服务器涉及到三个配置文件:

/etc/krb5.conf/var/kerberos/krb5kdc/kdc.conf/var/kerberos/krb5kdc/kadm5.acl

配置 Kerberos 的一种方法是编辑配置文件 /etc/krb5.conf。默认安装的文件中包含多个示例项。

$ cat /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 = htsy   dns_lookup_realm = false   dns_lookup_kdc = false   clockskew = 120   ticket_lifetime = 24h   renew_lifetime = 7d   forwardable = true   renewable = true   udp_preference_limit = 1   default_tgs_enctypes = arcfour-hmac   default_tkt_enctypes = arcfour-hmac  [realms]   htsy = {    kdc = ht25:88    admin_server = ht25:749   }  [domain_realm]    .htsy = htsy    www.htsy = htsy  [kdc]  profile=/var/kerberos/krb5kdc/kdc.conf

说明:
[logging]:表示 server 端的日志的打印位置
[libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
default_realm = htsy:设置 Kerberos 应用程序的默认领域。如果您有多个领域,只需向 [realms] 节添加其他的语句。
udp_preference_limit= 1:禁止使用 udp 可以防止一个Hadoop中的错误
clockskew:时钟偏差是不完全符合主机系统时钟的票据时戳的容差,超过此容差将不接受此票据。通常,将时钟扭斜设置为 300 秒(5 分钟)。这意味着从服务器的角度看,票证的时间戳与它的偏差可以是在前后 5 分钟内。
ticket_lifetime: 表明凭证生效的时限,一般为24小时。
renew_lifetime: 表明凭证最长可以被延期的时限,一般为一个礼拜。当凭证过期之后,对安全认证的服务的后续访问则会失败。
[realms]:列举使用的 realm。
kdc:代表要 kdc 的位置。格式是 机器:端口
admin_server:代表 admin 的位置。格式是 机器:端口
default_domain:代表默认的域名
[appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
修改 /var/kerberos/krb5kdc/kdc.conf ,该文件包含 Kerberos 的配置信息。例如,KDC 的位置,Kerbero 的 admin 的realms 等。需要所有使用的 Kerberos 的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf

$ cat /var/kerberos/krb5kdc/kdc.conf[kdcdefaults] v4_mode = nopreauth kdc_ports = 88 kdc_tcp_ports = 88[realms] htsy = {  #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 =  des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal des-cbc-crc:v4 des-cbc-crc:afs3  max_life = 24h  max_renewable_life = 10d  default_principal_flags = +renewable, +forwardable }

说明:
htsy: 是设定的 realms。名字随意。Kerberos 可以支持多个 realms,会增加复杂度。大小写敏感,一般为了识别使用全部大写。这个 realms 跟机器的 host 没有大关系。
master_key_type:和 supported_enctypes 默认使用 aes256-cts。由于,JAVA 使用 aes256-cts 验证方式需要安装额外的 jar 包(后面再做说明)。推荐不使用,并且删除 aes256-cts。
acl_file:标注了 admin 的用户权限,需要用户自己创建。文件格式是:Kerberos_principal permissions [target_principal] [restrictions]
supported_enctypes:支持的校验方式。
admin_keytab:KDC 进行校验的 keytab。
关于AES-256加密:
对于使用 centos5. 6及以上的系统,默认使用 AES-256 来加密的。这就需要集群中的所有节点上安装 Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy File。
下载的文件是一个 zip 包,解开后,将里面的两个文件放到下面的目录中:$JAVA_HOME/jre/lib/security
为了能够不直接访问 KDC 控制台而从 Kerberos 数据库添加和删除主体,请对 Kerberos 管理服务器指示允许哪些主体执行哪些操作。通过编辑文件 /var/lib/kerberos/krb5kdc/kadm5.acl 完成此操作。ACL(访问控制列表)允许您精确指定特权。

$ cat /var/kerberos/krb5kdc/kadm5.acl  */admin@htsy *

同步配置文件到其他节点
1.4 创建数据库
在 ht25上运行初始化数据库命令。其中 -r 指定对应 realm。
$ kdb5_util create -r htsy -s
1.5 启动服务
在 ht25节点上运行:

$ chkconfig --level 35 krb5kdc on$ chkconfig --level 35 kadmin on$ service krb5kdc start$ service kadmin start

1.6 创建kerberos管理员
在 ht25 上创建远程管理的管理员:

root$ kadmin.local -q "addprinc root/admin"

2 HDFS 上配置 kerberos

2.1 创建认证规则
在 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。
NameNode 和 DataNode 是通过 hdfs 启动的,故为集群中每个服务器节点添加两个principals:hdfs、HTTP。
在 KCD server 上(这里是 ht25)创建 hdfs principal:

kadmin.local -q "addprinc -randkey hdfs/ht25@htsy"kadmin.local -q "addprinc -randkey hdfs/ht26@htsy"

-randkey 标志没有为新 principal 设置密码,而是指示 kadmin 生成一个随机密钥。之所以在这里使用这个标志,是因为此 principal 不需要用户交互。它是计算机的一个服务器帐户。
创建 HTTP principal:

kadmin.local -q "addprinc -randkey HTTP/ht25@htsy"kadmin.local -q "addprinc -randkey HTTP/ht26@htsy"

创建完成后,查看:

$ kadmin.local -q "listprincs"

2.2 创建keytab文件

kadmin.local -q "xst  -k /root/hdfs.keytab  hdfs/ht25@htsy"kadmin.local -q "xst  -k /root/hdfs.keytab  hdfs/ht26@htsy"kadmin.local -q "xst  -k /root/hdfs.keytab  HTTP/ht25@htsy"kadmin.local -q "xst  -k /root/hdfs.keytab  HTTP/ht26@htsy"

验证: klist -ket /root/hdfs.keytab

如下:

 2 08/29/17 08:19:24 HTTP/ht25@htsy (aes128-cts-hmac-sha1-96)    2 08/29/17 08:19:24 HTTP/ht25@htsy (des3-cbc-sha1)    2 08/29/17 08:19:24 HTTP/ht25@htsy (arcfour-hmac)    2 08/29/17 08:19:24 HTTP/ht25@htsy (des-hmac-sha1)    2 08/29/17 08:19:24 HTTP/ht25@htsy (des-cbc-md5)    2 08/29/17 08:19:26 HTTP/ht26@htsy (aes128-cts-hmac-sha1-96)    2 08/29/17 08:19:26 HTTP/ht26@htsy (des3-cbc-sha1)    2 08/29/17 08:19:26 HTTP/ht26@htsy (arcfour-hmac)    2 08/29/17 08:19:26 HTTP/ht26@htsy (des-hmac-sha1)    2 08/29/17 08:19:26 HTTP/ht26@htsy (des-cbc-md5)    2 08/31/17 05:54:10 hdfs/ht25@htsy (aes128-cts-hmac-sha1-96)    2 08/31/17 05:54:10 hdfs/ht25@htsy (des3-cbc-sha1)    2 08/31/17 05:54:10 hdfs/ht25@htsy (arcfour-hmac)    2 08/31/17 05:54:10 hdfs/ht25@htsy (des-hmac-sha1)    2 08/31/17 05:54:10 hdfs/ht25@htsy (des-cbc-md5)    2 08/31/17 05:54:13 hdfs/ht26@htsy (aes128-cts-hmac-sha1-96)    2 08/31/17 05:54:13 hdfs/ht26@htsy (des3-cbc-sha1)    2 08/31/17 05:54:13 hdfs/ht26@htsy (arcfour-hmac)    2 08/31/17 05:54:13 hdfs/ht26@htsy (des-hmac-sha1)    2 08/31/17 05:54:13 hdfs/ht26@htsy (des-cbc-md5)

2.3 获取票据

$ kinit -k -t /root/hdfs.keytab hdfs/ht25@htsy$ kinit -k -t /root/hdfs.keytab hdfs/ht26@htsy

同步keytab到各节点,授权0400

3 hdfs 配置

3.1 配置文件修改
core-site.xml

<configuration>    <property>        <name>fs.defaultFS</name>        <value>hdfs://ht25:9000</value>    </property>    <property>        <name>hadoop.tmp.dir</name>        <value>/data/tmp/hadoop1</value>    </property>   <property>        <name>hadoop.proxyuser.oozie.hosts</name>        <value>*</value>  </property>  <property>        <name>hadoop.proxyuser.oozie.groups</name>        <value>*</value>  </property> <property>        <name>hadoop.security.authorization</name>        <value>true</value></property><property>        <name>hadoop.security.authentication</name>        <value>kerberos</value></property> <property>        <name>hadoop.rpc.protection</name>        <value>authentication</value></property><property>        <name>hadoop.security.auth_to_local</name>        <value>        RULE:[2:$1@$0](hdfs/.*@.*htsy)s/.*/hdfs/        RULE:[2:$1@$0](yarn/.*@.*htsy)s/.*/yarn/        DEFAULT        </value></property></configuration>

hdfs-site.xml

<configuration>    <property>        <name>dfs.replication</name>        <value>1</value>    </property><property>    <name>dfs.block.access.token.enable</name>    <value>true</value></property><property>    <name>dfs.namenode.keytab.file</name>    <value>/root/hdfs.keytab</value></property><property>    <name>dfs.https.enable</name>    <value>true</value></property><property>    <name>dfs.namenode.kerberos.principal</name>    <value>hdfs/_HOST@htsy</value></property><property>    <name>dfs.namenode.kerberos.internal.spnego.principal</name>    <value>HTTP/_HOST@htsy</value></property><property>    <name>dfs.datanode.keytab.file</name>    <value>/root/hdfs.keytab</value></property><property>    <name>dfs.datanode.kerberos.principal</name>    <value>hdfs/_HOST@htsy</value></property><property>    <name>dfs.datanode.address</name>    <value>0.0.0.0:61004</value></property><property>   <name>dfs.datanode.http.address</name>    <value>0.0.0.0:61006</value></property><property>     <name>dfs.permissions.supergroup</name>     <value>supergroup</value>     <description>The name of the group of     super-users.</description></property><property>    <name>dfs.datanode.kerberos.https.principal</name>    <value>HTTP/_HOST@htsy</value></property><property>    <name>dfs.encrypt.data.transfer</name>    <value>false</value></property><property>    <name>dfs.journalnode.keytab.file</name>    <value>/root/hdfs.keytab</value></property><property>    <name>dfs.journalnode.kerberos.principal</name>    <value>hdfs/_HOST@htsy</value></property><property>    <name>dfs.namenode.kerberos.https.principal</name>    <value>HTTP/_HOST@htsy</value></property><property>    <name>dfs.journalnode.kerberos.internal.spnego.principal</name>    <value>HTTP/_HOST@htsy</value></property><property>  <name>dfs.http.policy</name>  <value>HTTPS_ONLY</value></property><property>  <name>dfs.data.transfer.protection</name>  <value>integrity</value></property><property>  <name>dfs.datanode.data.dir.perm</name>  <value>700</value></property><property>  <name>dfs.encrypt.data.transfer</name>  <value>true</value></property><property>  <name>dfs.webhdfs.enabled</name>  <value>true</value></property><property>  <name>dfs.web.authentication.kerberos.principal</name>  <value>HTTP/_HOST@JAVACHEN.COM</value></property><property>  <name>dfs.web.authentication.kerberos.keytab</name>  <value>/root/hdfs.keytab</value></property></configuration>

3.2 配置https
CA机器上:

openssl req -new -x509 -keyout test_ca_key -out test_ca_cert -days 9999 -subj '/C=CN/ST=zhejiang/L=hangzhou/O=dtdream/OU=security/CN=zelda.com'

将上面生成的test_ca_key和test_ca_cert丢到所有机器上,在各个机器上继续:

keytool -keystore keystore -alias localhost -validity 9999 -genkey -keyalg RSA -keysize 2048 -dname "CN=zelda.com, OU=test, O=test, L=hangzhou, ST=zhejiang, C=cn"keytool -keystore truststore -alias CARoot -import -file test_ca_certkeytool -certreq -alias localhost -keystore keystore -file certopenssl x509 -req -CA test_ca_cert -CAkey test_ca_key -in cert -out cert_signed -days 9999 -CAcreateserial -passin pass:changeitkeytool -keystore keystore -alias CARoot -import -file test_ca_certkeytool -keystore keystore -alias localhost -import -file cert_signed

配置ssl-server.xml和ssl-client.xml
从{target}.xml.example文件拷贝一份出来,并制定keystore、trustkeystore两个文件的路径、password,然后同步到所有节点。

4 配置yarn

4.1 配置yarn-site.xml
yarn-site.xml

<configuration>    <property>        <name>yarn.nodemanager.aux-services</name>        <value>mapreduce_shuffle</value>    </property>    <property>        <name>yarn.resourcemanager.hostname</name>        <value>ht25</value>    </property>    <property>    <name>yarn.resourcemanager.keytab</name>    <value>/root/yarn.keytab</value></property><property>  <name>yarn.http.policy</name>  <value>HTTPS_ONLY</value></property><property>    <name>yarn.resourcemanager.principal</name>    <value>yarn/_HOST@htsy</value></property><property>    <name>yarn.nodemanager.keytab</name>    <value>/root/yarn.keytab</value></property><property>    <name>yarn.nodemanager.principal</name>    <value>yarn/_HOST@htsy</value></property><property>    <name>yarn.nodemanager.container-executor.class</name>    <value>org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor</value></property><property>    <name>yarn.nodemanager.linux-container-executor.group</name>    <value>yarn</value></property> 

4.2 yarn kerberos认证用户

kadmin.local -q "addprinc -randkey yarn/ht25@htsy"kadmin.local -q "addprinc -randkey yarn/ht26@htsy"kadmin.local -q "xst  -k /root/yarn.keytab  yarn/ht25@htsy"kadmin.local -q "xst  -k /root/yarn.keytab  yarn/ht26@htsy"kadmin.local -q "xst  -k /root/yarn.keytab  HTTP/ht25@htsy"kadmin.local -q "xst  -k /root/yarn.keytab  HTTP/ht26@htsy"

4.3 重新编译container-executor

修改文件container-executor.cfg

yarn.nodemanager.linux-container-executor.group=#configured value of yarn.nodemanager.linux-container-executor.group
banned.users=#comma separated list of users who can not run applications
min.user.id=1000#Prevent other super-users
allowed.system.users=##comma separated list of system users who CAN run applications
yarn.nodemanager.linux-container-executor.group=yarn
banned.users=bin
min.user.id=499
allowed.system.users=root,nobody,impala,hive,hdfs,yarn

保存放入/etc下

下载hadoop2.7.3源码 编译时指定目录

mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc
将编译好的container-executor放在/usr/lib/hadoop-yarn/bin下并授权。

chown root:yarn container-executor /etc/container-executor.cfg
chmod 4750 container-executor

这边给出我编译好的:http://download.csdn.net/download/qq_27499099/9960222

至此,配置完成,各组件启动时需要先kinit -ket /root/xxx.keytab xx/xx@xxx 来获取票据,然后正常启动组件。

5 常见问题汇总

http://www.cnblogs.com/warmingsun/p/6738730.html

原创粉丝点击