Hadoop 2.7.3-Kerberos认证

xiaoxiao2021-02-28  97

本文参考自:

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_cert keytool -certreq -alias localhost -keystore keystore -file cert openssl x509 -req -CA test_ca_cert -CAkey test_ca_key -in cert -out cert_signed -days 9999 -CAcreateserial -passin pass:changeit keytool -keystore keystore -alias CARoot -import -file test_ca_cert keytool -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

转载请注明原文地址: https://www.6miu.com/read-73326.html

最新回复(0)