1-2 集群Kerberos安全配置

在集群hadoop2.2.0( 无HA)+zookeeper-3.3.5+hbase-0.96.0-hadoop2

正常运行的情况下,添加kerberos认证。

 

一.部署

目录/opt用于存放*.keytab文件

mkdir -p /opt

 

节点部署

Master1

Master2

Master3

Master4

Master5

Slave1

Slave15

client

client

client

client

KDC

client

client

 

 

HMaster

HMaster

 

HRegionserver

namenode

Secondary

namenode

RM

JHS

 

Datanode

Datanode

 

 

zookeeper

zookeeper

zookeeper

 

 

 

集群用户设置

确保不同进程是由不同的Unix用户启动的,其中datanode由root用户通过jsvc启动,推荐他们都属于同一个组如Hadoop。

User:Group

Daemons

hdfs:hadoop

NameNode, Secondary NameNode, Checkpoint Node, Backup Node, DataNode(root)

yarn:hadoop

ResourceManager, NodeManager

mapred:hadoop

JobHistory Server

zookeeper:hadoop

QuorumPeerMain

hbase:hadoop

HMaster,HRegionServer

 

二.配置kerberos服务

1.JCE

对于使用centos5.6及以上的系统,默认使用AES-256来加密的,这就要求所有节点安装JCE, Java Cryptography Extension (JCE) Unlimited StrengthJurisdiction Policy Files 7 ,将下载的包解压并放到该目录下:

$JAVA_HOME/jre/lib/security

2.安装kdc

kdc服务器上安装 kerberos-server ,centos默认已经安装了kerberos 的客户端以及命令工具,只需要在kdc服务器上安装kerberos的server:

#rpm -qa | grep krb

#yum install -y krb5-server

服务端:

krb5-libs-1.10.3-10.el6_4.6.x86_64

krb5-workstation-1.10.3-10.el6_4.6.x86_64

krb5-server-1.10.3-10.el6_4.6.x86_64

pam_krb5-2.3.11-9.el6.x86_64

krb5-devel-1.10.3-10.el6_4.6.x86_64

客户端:

krb5-libs-1.10.3-10.el6_4.6.x86_64

krb5-workstation-1.10.3-10.el6_4.6.x86_64

pam_krb5-2.3.11-9.el6.x86_64

 

3.配置kdc

kdc服务器涉及到三个配置文件:

/etc/krb5.conf、

/var/kerberos/krb5kdc/kdc.conf、

/var/kerberos/krb5kdc/kadm5.acl

hadoop集群中其他服务器涉及到的kerberos配置文件:/etc/krb5.conf。

将kdc中的/etc/krb5.conf拷贝到集群中其他服务器即可。

集群如果开启selinux了,拷贝后可能需要执行restorecon -R -v/etc/krb5.conf

 

/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 =FOR_HADOOP

 dns_lookup_realm = false

 dns_lookup_kdc = false

 ticket_lifetime = 24h

 renew_lifetime = 2d

 forwardable = true

renewable = true

[realms]

 FOR_HADOOP = {

  kdc=master5:88

  admin_server=master5:749

 }

[domain_realm]

[kdc]

profile=/var/kerberos/krb5kdc/kdc.conf

FOR_HADOOP是数据库名,也是kerberos的域名

[libdefaults]中的defalt_realm表示在不给出域的时候,默认采用这个 

[logging]中的是指定日志的位置 

默认的安装位置在/var/kerberos/krb5kdc

/var/kerberos/krb5kdc/kdc.conf

[kdcdefaults]

 kdc_ports = 88

 kdc_tcp_ports = 88

[realms]

FOR_HADOOP={

 database_name=/var/kerberos/krb5kdc/principal

 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 = aes256-cts:normal aes128-cts:normaldes3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normaldes-cbc-md5:normal des-cbc-crc:normal

 }

 

配置操作权限:

/var/kerberos/krb5kdc/kadm5.acl

*/admin@FOR_HADOOP *

hadoop/admin@FOR_HADOOP *

(kdc上)添加kerberos自启动及重启服务

# chkconfig --level 35 krb5kdc on

# chkconfig --level 35 kadmin on

# service krb5kdc restart

# service kadmin restart

4.初始化操作

(1)(kdc上)创建KDC数据库

#kdb5_util create -r FOR_HADOOP -s

该命令会在/var/kerberos/krb5kdc/目录下创建principal数据库。

密码ttteee

开始为KDC设置初始用户信息,这里需要在KDC上执行kadmin.local命令(该命令仅能在KDC上运行,如果你需要在其他机器上管理kerberos的话,直接运行kadmin)

服务器端操作:#kadmin.local

(2)(kdc上)创建远程管理的管理员(hadoop)

#kadmin.local:  addprinc hadoop/admin@FOR_HADOOP

addprinc root/admin@FOR_HADOOP

密码ttteee

添加管理员:kadmin.local: addprinc username/admin@FOR_HADOOP

添加用户: kadmin.local:addprinc username

(3)(kdc上)生成admin的keytab

kadmin.local:  ktadd -k/usr/local/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw

(4)测试

使用之前创建的hadoop用户

#kinit hadoop/amdin

Passwordfor hadoop@FOR_HADOOP:

输入密码后,没有报错即可。

#klist–e

……

##查看是否以hadoop@FOR_HADOOP登录成功

 

(5)常用kerberos管理命令

#kadmin.local

列出所有用户listprincs

查看某个用户属性,如getprinc hdfs/master1@FOR_HADOOP

注意,是getprinc,没有's'

添加用户:

addprinc用户名

删除用户:

delprinc用户名

修改用户:

modprinc用户名

添加服务:

ktadd 服务名

删除SERVICEKEY

ktremove服务名

可以使用kadmin.local或kadmin,至于使用哪个,取决于账户和访问权限:

kadmin.local(on the KDC machine)or kadmin (from any machine)

如果有访问kdc服务器的root权限,但是没有kerberos admin账户,使用kadmin.local

如果没有访问kdc服务器的root权限,但是用kerberos admin账户,使用kadmin

 

三.Hadoop配置kerberos

1.为hadoop创建认证规则(Principals)和keytab

概念

Kerberos principal用于在kerberos加密系统中标记一个唯一的身份。

kerberos为kerberos principal分配tickets使其可以访问由kerberos加密的hadoop服务。

对于hadoop,principals的格式为username/[email protected].

keytab是包含principals和加密principalkey的文件。

keytab文件对于每个host是唯一的,因为key中包含hostname。keytab文件用于不需要人工交互和保存纯文本密码,实现到kerberos上验证一个主机上的principal。

因为服务器上可以访问keytab文件即可以以principal的身份通过kerberos的认证,所以,keytab文件应该被妥善保存,应该只有少数的用户可以访问。

操作:

在客户机上登录kdc服务器 新建本机用户的keytab:

(以master5为例)

(1)创建principal

$kadmin:

kadmin: addprinc -randkey hdfs/[email protected]

kadmin: addprinc -randkey mapred/[email protected](JHS)

kadmin: addprinc -randkey yarn/[email protected](RM.NM)

kadmin: addprinc -randkeyHTTP/[email protected]

示例:

kadmin:  addprinc -randkey hdfs/master5@FOR_HADOOP

kadmin:  addprinc -randkey mapred/master5@FOR_HADOOP

kadmin:  addprinc -randkey yarn/master5@FOR_HADOOP

kadmin:  addprinc -randkey HTTP/master5@FOR_HADOOP

创建完成后查看:

kadmin:listprincs

(2)创建keytab

kadmin: ktadd -k 本地路径/hdfs.keytab  hdfs/fully.qualified.domain.nameHTTP/fully.qualified.domain.name

kadmin: ktadd -kmapred.keytab mapred/fully.qualified.domain.name HTTP/fully.qualified.domain.name

kadmin: ktadd -kyarn.keytab yarn/fully.qualified.domain.name HTTP/fully.qualified.domain.name

hdfskeytab  (包含hdfsprincipal,http principal)

mapredkeytab  (包含mapredprincipal,http principal)

yarnkeytab  (包含yarnprincipal,http principal)

示例:

$kadmin:

ktadd -k /opt/hdfs.keytab hdfs/master5  HTTP/master5

ktadd -k /opt/mapred.keytab mapred/master5HTTP/master5

ktadd -k /opt/yarn.keytab yarn/master5 HTTP/master5

 

创建后查看:

$ klist -e -k -t hdfs.keytab

 

(3)部署keytab文件

(每台kdc客户端机器上都执行)

(如果上述创建keytab的时候没有添加本地目录,即keytab文件不再下述目录里,则执行)

# mv hdfs.keytab mapred.keytab yarn.keytab /opt

确保keytab的所有者和权限

# chown hdfs:hadoop  /opt/hdfs.keytab

# chown mapred:hadoop /opt/mapred.keytab

# chown yarn:hadoop  /opt/yarn.keytab

# chmod 400 /opt/*.keytab

 

重复1,2,3步骤在每个hadoop节点上

 

Keytab文件和相应的服务

hdfs.keytab

Namenode,datanode,journalnode

yarn.keytab

RM,NM

mapred.keytab

JHS

2.Hadoop修改

(1) JSVC

首先编译jsvc,因为配置kerberos后,用root用户通过jsvc启动datanode

rpm -qa | grep jsvc

下载commons-daemon-1.0.15-native-src.tar.gz,

cd commons-daemon-1.0.15-native-src

cd unix

./configure

make会生成64bit的jsvc executable拷贝到$HADOOP_HOME/libexec,

然后在hadoop-env.sh 中指定,JAVC_HOME=$HADOOP_HOME/libexec,

如果用yum版本,安装jsvc的化,可能会导致

/data/log/hadoop-hdfs/jsvc.err

jsvc.exec error: Cannot find daemon loaderorg/apache/commons/daemon/support/DaemonLoader

jsvc.exec error: Service exit with a return valueof 1

如果出现这(表示成功)

Initializing secure datanode resources

Successfully obtained privileged resources(streaming port = ServerSocket[addr=/0.0.0.0,localport=1003] ) (http listenerport = sun.nio.ch.ServerSocketChannelImpl[/0.0.0.0:1007])

Opened streaming server at /0.0.0.0:1003

Opened info server at 0.0.0.0/0.0.0.0:1007

Starting regular datanode initialization

(2)配置文件

(1)vi/etc/hadoop/container-executor.cfg

 

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

banned.users=hdfs,mapred,bin,

allowed.system.users=foo,bar

min.user.id=499

banned.users=的用户,都被禁止执行mapreduce任务。所以只有yarn可以执行。

(2)修改配置文件

vi/etc/hadoop/hadoop-env.sh

添加

export HADOOP_SECURE_DN_USER=hdfs

export JSVC_HOME=$HADOOP_HOME/libexec

export HADOOP_PID_DIR=/data/log

 

/etc/hadoop/core-site.xml

  

     hadoop.security.authentication  

    kerberos

    

  

 hadoop.security.authorization 

 true

/etc/hadoop/hdfs-site.xml

     dfs.block.access.token.enable

     true

      dfs.https.enable

      false

         dfs.namenode.https-address

         master1:50470

         dfs.https.port

         50470

     dfs.namenode.keytab.file

     /opt/hdfs.keytab

     

     dfs.namenode.kerberos.principal

     hdfs/_HOST@FOR_HADOOP

     

    dfs.namenode.kerberos.https.principal

    HTTP/_HOST@FOR_HADOOP

     

 

dfs.namenode.secondary.http-address

slave1:50090            

      dfs.namenode.secondary.https-port

       50470

dfs.secondary.namenode.keytab.file

/opt/hdfs.keytab

dfs.secondary.namenode.kerberos.principal

hdfs/_HOST@FOR_HADOOP

dfs.secondary.namenode.kerberos.internal.spnego.principal

HTTP/_HOST@FOR_HADOOP

    dfs.datanode.data.dir.perm

    700

    dfs.datanode.address

     0.0.0.0:1003

    dfs.datanode.http.address

    0.0.0.0:1007

   dfs.datanode.keytab.file

   /opt/hdfs.keytab

    

   dfs.datanode.kerberos.principal

   hdfs/_HOST@FOR_HADOOP

   dfs.datanode.kerberos.https.principal

   HTTP/_HOST@FOR_HADOOP

/etc/hadoop/mapred-site.xml

   mapreduce.jobhistory.keytab

   /opt/mapred.keytab

   mapreduce.jobhistory.principal

   mapred/_HOST@FOR_HADOOP

 

/etc/hadoop/yarn-site.xml

   yarn.resourcemanager.keytab

   /opt/yarn.keytab

   

   yarn.resourcemanager.principal

   yarn/_HOST@FOR_HADOOP

   yarn.nodemanager.keytab

   /opt/yarn.keytab

    yarn.nodemanager.principal

    yarn/_HOST@FOR_HADOOP

   yarn.nodemanager.container-executor.class

org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor

   yarn.nodemanager.linux-container-executor.group

   hadoop

同步hadoop集群

(3)文件系统修改

下表罗列出hdfs上的path和本地文件系统的推荐权限设置

Filesystem

Path

User:Group

Permissions

local

dfs.namenode.name.dir

hdfs:hadoop

drwx------

local

dfs.datanode.data.dir

hdfs:hadoop

drwx------

local

$HADOOP_LOG_DIR

hdfs:hadoop

drwxrwxr-x

local

$YARN_LOG_DIR

yarn:hadoop

drwxrwxr-x

local

yarn.nodemanager.local-dirs

yarn:hadoop

drwxr-xr-x

local

yarn.nodemanager.log-dirs

yarn:hadoop

drwxr-xr-x

local

/bin/container-executor

root:hadoop

--Sr-s---(6050)

local

/etc/hadoop/container-executor.cfg

root:hadoop

r--------(0400)

hdfs

/

hdfs:hadoop

drwxr-xr-x

hdfs

/tmp

hdfs:hadoop

drwxrwxrwxt(1777)

hdfs

/user

hdfs:hadoop

drwxr-xr-x

hdfs

yarn.nodemanager.remote-app-log-dir (/tmp/logs)

yarn:hadoop

drwxrwxrwxt(1777)

hdfs

mapreduce.jobhistory.intermediate-done-dir

mapred:hadoop

drwxrwxrwxt

hdfs

mapreduce.jobhistory.done-dir

mapred:hadoop

drwxr-x---

示例:

修改本地文件系统

chown  -R hdfs:hadoop  /data/hdfs/nn /data/hdfs/dn /data/log/hadoop-hdfs

chmod700  /data/hdfs/nn  /data/hdfs/dn 

chmod775  /data/log/hadoop-hdfs

 

chown-R  yarn:hadoop  /data/log/hadoop-yarn  /data/yarn/local  /data/yarn/logs

chmod775  /data/log/hadoop-yarn

chmod755   /data/yarn/local  /data/yarn/logs

 

chown  mapred:hadoop /data/log/hadoop-mapred

chmod755  /data/log/hadoop-mapred

修改

chown root:hadoop /opt/hadoop-2.2.0/bin/container-executor 

chown -R root:hadoop   /opt/hadoop-2.2.0/etc/

chmod 6050  /opt/hadoop-2.2.0/bin/container-executor

chmod 0400 /opt/hadoop-2.2.0/etc/hadoop/container-executor.cfg

HDFS文件系统

以hdfs用户修改

hadoop fs -chmod 1777     /tmp

 hadoop fs-chown hdfs:hadoop /user

 hadoop fs-chmod 755 /user

 hadoop fs-chown hdfs:hadoop /

 hadoop fs-chmod 755 /

 hadoop fs-chown yarn:hadoop /tmp/logs

 hadoop fs-chmod 1777      /tmp/logs

 hadoop fs-chown mapred:hadoop   /mr-history/tmp

 hadoop fs-chmod 1777 /mr-history/tmp

 hadoop fs-chown mapred:hadoop /mr-history/done

 hadoop fs-chmod 750 /mr-history/done

 

若提示no credentials

执行kinit获的相应主机对应用户对应服务的credential

kinit -k -t /opt/hdfs.keytab hdfs/master1@FOR_HADOOP

 

 

(4)操作hadoop集群

一旦配置完成之后就把所有HADOOP_CONF_DIR 里面的文件拷贝到其他节点上,此章节会说明不同的unix用户启动不同的hadoop服务,采用的unix系统用户和用户组

启动

hadoop启动:

hdfs用户格式化hadoop文件系统执行如下命令(无需格式化跳过此步):

[hdfs]$hdfs namenode -format

在NameNode 节点上启动hdfs,用户为hdfs用户:

[hdfs]$hadoop-daemon.sh start namenode

在DataNodes 节点上启动DataNodes 用户为root,设置环境变量

[root]$hadoop-daemon.sh start datanode

在ResourceManager 节点上执行如下命令启动YARN,用户为yarn:

[yarn]$yarn-daemon.sh start resourcemanager

 在NodeManager节点上启动NodeManager,用户为yarn:

[yarn]$yarn-daemon.sh start nodemanager

用mapred用户启动MapReduce JobHistory Server :

[mapred]$$HADOOP_PREFIX/sbin/mr-jobhistory-daemon.sh start historyserver

示例:在一台机器上运行mapreduce程序

[yarn]hadoop jar /opt/wordcount.jar  org.apache.hadoop.examples.WordCount /input1  /tmp/out

在执行的过程中,如果提示:no credentials

则执行kinit来获得相应的credentials。

kinit -k -t /opt/yarn.keytabyarn/master1@FOR_HADOOP

hadoop集群关闭:

用户hdfs执行如下命令关闭NameNode :

[hdfs]$hadoop-daemon.sh stop namenode

root用户在所有从节点上执行如下命令停止DataNodes :

[root]$hadoop-daemon.sh stop datanode

yarn用户在ResourceManager 节点上执行如下命令关闭ResourceManager:

[yarn]$yarn-daemon.sh stop resourcemanager

yarn用户在所有的从节点上执行如下命令结束NodeManagers

[yarn]$yarn-daemon.sh stop nodemanager

mapred用户执行如下命令停止MapReduce JobHistory Server:

[mapred]$mr-jobhistory-daemon.sh stop historyserver

 

四.zookeeper配置kerberos

根据步骤一和二,

在zookeeper节点(master3,4,5)上,

1创建principal和keytab

#kadmin

(master3)

addprinc -randkey zookeeper/master3@FOR_HADOOP

ktadd -k /opt/zookeeper.keytab zookeeper/master3

(master4)

addprinc -randkey zookeeper/master4@FOR_HADOOP

ktadd -k /opt/zookeeper.keytab zookeeper/master4

(master5)

addprinc -randkey zookeeper/master5@FOR_HADOOP

ktadd -k /opt/zookeeper.keytab zookeeper/master5

(master3,4,5)修改keytab权限:

chown zookeeper:hadoop  /opt/zookeeper.keytab

chmod 400 /opt/zookeeper.keytab

Keytab文件和相应的服务

zookeeper.keytab

QuorumPeerMain

 

2.zookeeper 修改

(1) zoo.cfg

修改$ZOOKEEPER_HOME/conf/zoo.cfg,添加

authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider

jaasLoginRenew=3600000

(2) jaas.conf

创建$ZOOKEEPER_HOME/conf/jaas.conf,添加

Server {

com.sun.security.auth.module.Krb5LoginModulerequired

useKeyTab=true

keyTab="/opt/zookeeper.keytab"

storeKey=true

useTicketCache=false

principal="zookeeper/fully.qualified.domain.name@FOR_HADOOP";

};

分发配置文件后,分别到每个机器上修改对应主机名(这里是master3,4,5)

vi /opt/zookeeper-3.4.5/conf/jaas.conf

(3) java.env

创建$ZOOKEEPER_HOME/conf/java.env,添加

exportJVMFLAGS="-Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/jaas.conf"

 

同步zookeeper集群

(4)修改本地文件目录

(master3,4,5)修改本地文件

chown -R zookeeper:hadoop  /opt/zookeeper-3.4.5

chown -R zookeeper:hadoop  /data/zookeeper

(5)启动

以zookeeper用户

(master3,4,5)

su -zookeeper

zkServer.sh  start

提示no credential,执行kinit

kinit -k -t /opt/zookeeper.keytab zookeeper/master3@FOR_HADOOP

 

五.hbase配置kerberos

配置hbase的前提是必须配置好zookeeper的kerberos,所以把zookeeper的kerberos配置放在前面。

在所有hbase节点上(master3,4,slave1-15)

1.   创建principal和keytab

以master3为例

addprinc -randkey hbase/master3@FOR_HADOOP

ktadd -k /opt/hbase.keytab hbase/master3

修改keytab权限:

在所有hbase节点上执行:

chown hbase:hadoop /opt/hbase.keytab

chmod 400 /opt/hbase.keytab

重复以上步骤在所有hbase节点(master3,4,slave1-15)。

Keytab文件和相应的服务

hbase.keytab

HMaster,HRegionServer

 

 

2.hbase配置修改

(1)hbase-site.xml

       hbase.security.authentication

       kerberos

 

 

      hbase.rpc.engine

      org.apache.hadoop.hbase.ipc.SecureRpcEngine

 

hbase.regionserver.kerberos.principal

hbase/_HOST@FOR_HADOOP

hbase.regionserver.keytab.file

/opt/hbase.keytab

hbase.master.kerberos.principal

hbase/_HOST@FOR_HADOOP

hbase.master.keytab.file

/opt/hbase.keytab

 

hbase.security.authorization

true

hbase.coprocessor.master.classes

org.apache.hadoop.hbase.security.access.AccessController

hbase.coprocessor.region.classes

org.apache.hadoop.hbase.security.token.TokenProvider,org.apache.hadoop.hbase.security.access.AccessController

(2)zk-jaas.conf

创建$HBASE_HOME/conf/zk-jaas.conf

Client {

com.sun.security.auth.module.Krb5LoginModulerequired

useKeyTab=true

useTicketCache=false

keyTab="/opt/hbase.keytab"

principal="hbase/fully.qualified.domain.@FOR_HADOOP";

};

分发配置文件后,分别到每个机器上修改对应主机名(这里是master3,4,slave1-15)

vi $HBASE_HOME/conf/zk-jaas.conf

(3)hbase-env.sh

修改$HBASE_HOME/conf/hbase-env.sh

exportHBASE_OPTS="-Djava.security.auth.login.config=$HBASE_HOME/conf/zk-jaas.conf"

(4)zoo.cfg

修改$ZOOKEEPER_HOME/conf/zoo.cfg

kerberos.removeHostFromPrincipal=true

kerberos.removeRealmFromPrincipal=true

同步hbase集群和zookeeper集群的配置文件。

(5) 本地目录

hbase的本地目录权限:

chown -R hbase:hadoop /data/hbase

chown -R hbase:hadoop /data/tmp_hbase

chown -R hbase:hadoop /opt/hbase-0.96.0-hadoop2

 

hbase的HDFS目录权限:

hadoop fs -chown hbase:hadoop /hbase

(6)启动

以zookeeper用户

(master3,4,5)

su -zookeeper

zkServer.sh  start

启动hbase集群:以hbase用户

在master3,4,上,

su - hbase

hbase-daemon.sh start master

在slave1-15上

su - hbase

hbase-daemon.sh start regionserver

 

 

你可能感兴趣的:(hadoop集群,hadoop,安全)