在集群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服务
对于使用centos5.6及以上的系统,默认使用AES-256来加密的,这就要求所有节点安装JCE, Java Cryptography Extension (JCE) Unlimited StrengthJurisdiction Policy Files 7 ,将下载的包解压并放到该目录下:
$JAVA_HOME/jre/lib/security
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
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
#kdb5_util create -r FOR_HADOOP -s
该命令会在/var/kerberos/krb5kdc/目录下创建principal数据库。
密码ttteee
开始为KDC设置初始用户信息,这里需要在KDC上执行kadmin.local命令(该命令仅能在KDC上运行,如果你需要在其他机器上管理kerberos的话,直接运行kadmin)
服务器端操作:#kadmin.local
#kadmin.local: addprinc hadoop/admin@FOR_HADOOP
addprinc root/admin@FOR_HADOOP
密码ttteee
添加管理员:kadmin.local: addprinc username/admin@FOR_HADOOP
添加用户: kadmin.local:addprinc username
kadmin.local: ktadd -k/usr/local/var/krb5kdc/kadm5.keytab kadmin/admin kadmin/changepw
使用之前创建的hadoop用户
#kinit hadoop/amdin
Passwordfor hadoop@FOR_HADOOP:
输入密码后,没有报错即可。
#klist–e
……
##查看是否以hadoop@FOR_HADOOP登录成功
#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
概念
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为例)
$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
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
(每台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 |
首先编译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
(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
/etc/hadoop/hdfs-site.xml
/etc/hadoop/mapred-site.xml
/etc/hadoop/yarn-site.xml
同步hadoop集群
下表罗列出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
一旦配置完成之后就把所有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)上,
#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 |
修改$ZOOKEEPER_HOME/conf/zoo.cfg,添加
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
创建$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
创建$ZOOKEEPER_HOME/conf/java.env,添加
exportJVMFLAGS="-Djava.security.auth.login.config=$ZOOKEEPER_HOME/conf/jaas.conf"
同步zookeeper集群
(master3,4,5)修改本地文件
chown -R zookeeper:hadoop /opt/zookeeper-3.4.5
chown -R zookeeper:hadoop /data/zookeeper
以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)
以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 |
创建$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
修改$HBASE_HOME/conf/hbase-env.sh
exportHBASE_OPTS="-Djava.security.auth.login.config=$HBASE_HOME/conf/zk-jaas.conf"
修改$ZOOKEEPER_HOME/conf/zoo.cfg
kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true
同步hbase集群和zookeeper集群的配置文件。
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
以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