Hadoop 2.7.3-Kerberos认证

本文参考自:

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值