今天需要在hbase上配置kerberos认证,所以需要安装kerberos,安装配置过程如下:
kerberos简单来说就是一套完全控制机制,它有一个中心服务器(KDC),KDC中有数据库,你可以往里添加各种“人”以及各种“服务”的“身份证”,当某个人要访问某个服务时,他拿着自己的“身份证”联系KDC并告诉KDC他想要访问的服务,KDC经过一系列验证步骤,最终依据验证结果允许/拒绝这个人访问此服务。
#yum install krb5-libs krb5-server krb5-workstation
1)#vim /etc/krb5.conf
注意在/etc/krb5.conf文件中,最后的YOUR.DOMAIN_NAME = {
admin_server=mj1
kdc = mj1
}
这里的mj1必须是在/etc/hosts中配置过的域名,我的/etc/hosts的内容如下:
否则在后期的kinit admin/admin命令中,将出现错误如下:
2)#vim /var/kerberos/krb5kdc/kdc.conf
3)#vim /var/kerberos/krb5kdc/kadm5.acl
这个文件是用来控制哪些人可以使用kadmin工具来管理kerberos数据库,我这里就配了一行:
其中前一个*号是通配符,表示像名为“abc/admin”或“xxx/admin”的人都可以使用此工具(远程或本地)管理kerberos数据库,后一个*跟权限有关,*表示所有权限
4)#kdb5_util create -s初始化一个kerberos数据库。
5)现在数据库是空的,想要使用kadmin添加一个人到数据库中,这是需要权限的,那么最开始的那一个人是怎么加到数据库中的?这就需要kadmin.local这个工具,这个工具只能在kerberos server上执行(类似于oracle中的sys用户无密码登录)。
#kadmin.local -q "addprinc admin/admin"
我这里把管理员叫“admin/admin”,你可以叫任何名字,但是因为此前我们在kadm5.acl中的配置,名字必须以/admin结尾。过程中会提示你输入两次密码,记住这个密码,当你在别的机器连接kadmin时,需要这个密码。
如果kinit不带参数,则会默认以当前操作系统用户名,比如root,作为名称。因为root在kerberos的数据库中并没有,所以会提示失败
成功的话,会让你输入之前设定的密码。正常应该显示如下:
以下这两个应该不是必须的,与兼容性有关,ktadd命令会把“身份证”写入到文件(.keytab后缀),可以指定keytab文件,如不指定,默认写入/etc/krb5.keytab
一般在实例使用中通过kinit的方式较少,因为每次都要输入密码,所以更经常使用的是keytab文件,相当于为某个人或服务生成一个密码,并放在文件中,程序中则指向这个keytab,不用每次都输入密码。
hbase配置kerberos环境准备:本机上都装好了hadoop,zookeeper,hbase,版本如下:
hadoop:2.7.2
hbase:1.2.1
同时检查了在没有启动kerberos的情况下,hbase工作正常。
#vim /etc/sysconfig/selinux 设置SELINUX=disabled,并重启
从Oracle网站下载JCE(Java Cryptography Extension)补丁,此补丁与AES-256加密有关。下载解压之后,把得到的两个jar文件local_policy.jar,US_export_policy.jar拷贝到$JAVA_HOME/ jre/lib/security下进行覆盖。
之后便可以进入kadmin.local的命令行:
在kerberos服务器上创建用户:
addprinc -randkey root/mj1@YOUR.DOMAIN_NAME
其中的root随便起,后面的mj1.bdsm.cmcc为你的主机域名,后面的@YOUR.DOMAIN_NAME是你当初配置kerberos时定义的。
在当前目录下生成root.keytab文件
xst -k root.keytab root/mj1
之后拷贝root.keytab文件到hadoop的配置目录,在我的机器上是:/opt/hadoop-2.7.2//etc/hadoop
cp root.keytab /opt/hadoop-2.7.2/etc/hadoop/
关于JSVC,默认指向hadoop安装目录的libexec下,但我的libexec下并没有jsvc文件(我的hadoop是直接下载的tar.gz包,不是rpm安装),google搜索jsvc,然后在apache网站下载源代码包以及bin包,我下的是commons-daemon-1.0.15-src.tar.gz及commons-daemon-1.0.15-bin.tar.gz,先解压src包后进入src/native/unix目录依次执行 ./configure命令, make命令,这样会在当前目录下生成一个叫jsvc的文件,把它拷贝到hadoop目录下的libexec下。 再解压bin包,然后把得到的commons-daemon-1.0.15.jar 文件拷贝到hadoop安装目录下share/hadoop/hdfs/lib下,同时删除自带版本的commons-daemon-xxx.jar包。
dfs.replication
1
dfs.namenode.name.dir
file:/opt/hadoop-2.7.2/dfs/name
dfs.datanode.data.dir
file:/opt/hadoop-2.7.2/dfs/data
dfs.permissions
true
dfs.permissions.enabled
true
dfs.namenode.inode.attributes.provider.class
org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer
dfs.https.address
mj1:50470
dfs.https.port
50470
dfs.namenode.keytab.file
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
dfs.namenode.kerberos.principal
root/mj1@YOUR.DOMAIN_NAME
dfs.namenode.keytab.file
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
dfs.namenode.kerberos.principal
root/mj1@YOUR.DOMAIN_NAME
dfs.namenode.kerberos.https.principal
root/mj1@YOUR.DOMAIN_NAME
dfs.secondary.https.address
mj1:50495
dfs.secondary.https.port
50495
dfs.secondary.namenode.keytab.file
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
dfs.secondary.namenode.kerberos.principal
root/mj1@YOUR.DOMAIN_NAME
dfs.secondary.namenode.kerberos.https.principal
root/[email protected]_NAME
dfs.datanode.data.dir.perm
700
dfs.datanode.address
mj1:1003
dfs.datanode.http.address
mj1:1007
dfs.datanode.https.address
mj1:1005
dfs.datanode.keytab.file
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
dfs.datanode.kerberos.principal
root/[email protected]_NAME
dfs.datanode.kerberos.hppts.principal
root/[email protected]_NAME
dfs.web.authentication.kerberos.principal
root/mj1.bdsm.cmcc@YOUR.DOMAIN_NAME
dfs.web.authentication.kerberos.keytab
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
dfs.datanode.require.secure.ports
false
mapredure.framework.name
yarn
yarn.resourcemanager.keytab
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
yarn.resourcemanager.principal
root/mj1@YOUR.DOMAIN_NAME
yarn.nodemanager.keytab
/opt/hadoop-2.7.2/etc/hadoop/root.keytab
yarn.nodemanager.principal
root/mj1@YOUR.DOMAIN_NAME
• 配置container-executor.cfg
将container-executor.cfg移动到/etc
mv /opt/hadoop-2.7.2/etc/hadoop/container-executor.cfg /etc
修改container-executor.cfg配置
内容如下:
yarn.nodemanager.linux-container-executor.group=root
banned.users=#comma separated list of users who can not run applications
min.user.id=499
allowed.system.users=##comma separated list of system users who CAN run applications
• 将container-executor拷贝到/opt/hadoop-2.6.0/bin,然后执行以下内容
chown root:hadoop container-executor /etc/container-executor.cfg
chmod 4750 container-executor
chmod 400 /etc/container-executor.cfg
将生成的文件拷贝到hbase配置目录/opt/hbase-1.2.1/conf
hbase.rootdir
hdfs://mj1:9000/hbase
hbase.cluster.distributed
true
hbase.tmp.dir
/opt/hbase-1.2.1/tmp
hbase.zookeeper.quorum
localhost
hbase.zookeeper.property.dataDir
/opt/hbase-1.2.1/zookeeper
hbase.security.authorization
true
hbase.coprocessor.master.classes
org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor
hbase.coprocessor.region.classes
org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor
hbase.regionserver.kerberos.principal
hbase/mj1.bdsm.cmcc@YOUR.DOMAIN_NAME
hbase.regionserver.keytab.file
/opt/hbase-1.2.1/conf/hbase.keytab
hbase.master.kerberos.principal
hbase/mj1.bdsm.cmcc@YOUR.DOMAIN_NAME
hbase.master.keytab.file
/opt/hbase-1.2.1/conf/hbase.keytab
hbase.security.authentication
kerberos
之后,启动hbase,进入hbase shell界面,list总是出错:ERROR: Can't get master address from ZooKeeper; znode data == null
查看/opt/hbase-1.2.1/logs/hbase-root-master-mj1.bdsm.cmcc.log
找到错误如下:
2016-04-28 15:19:12,699 FATAL [mj1:16000.activeMasterManager] master.HMaster: Unhandled exception. Starting shutdown.
java.io.IOException: Failed on local exception: java.io.IOException: Couldn't setup connection for hbase/mj1.bdsm.cmcc@YOUR.DOMAIN_NAME to mj1.bdsm.cmcc/10.2.41.236:9000; Host Details : local host is: "mj1.bdsm.cmcc/10.2.41.236"; destination host is: "mj1.bdsm.cmcc":9000;
Caused by: javax.security.sasl.SaslException: GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)]
因为之前一直用得是hbase自带的zookeeper,所以没有zookeeper的配置文件,上网搜到的配置kerberos都要配置zookeeper的配置文件,所以在想是不是zookeeper的问题,于是接下来准备自安装zookeeper。
安装zookeeper请看另一篇博客,接下来是为了kerberos修改zookeeper的配置文件
server.1=mj1.bdsm.cmcc:2888:3888
kerberos.removeHostFromPrincipal=true
kerberos.removeRealmFromPrincipal=true
authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
jaasLoginRenew=3600000
在/opt/zookeeper-3.4.8/conf目录创建 jaas.conf 文件,内容如下:
Server {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
keyTab="/opt/zookeeper-3.4.8/conf/zookeeper.keytab"
storeKey=true
useTicketCache=false
principal="zookeeper/[email protected]_NAME";
};
export JVMFLAGS="-Djava.security.auth.login.config=/opt/zookeeper-3.4.8/conf/jaas.conf"
export JAVA_HOME="/usr/lib/jvm/jdk1.7.0_67"
需要注意的是,hbase和zookeeper的配置连接处:
在hbase配置目录conf下的hbase-site.xml中,
hbase.zookeeper.quorum
localhost
hbase.zookeeper.property.dataDir
/opt/zookeeper-3.4.8
hbase-env.sh中,
export HBASE_MANAGES_ZK=false
注意hbase-site.xml中的
hbase.zookeeper.quorum
的值必须和zookeeper中的conf下的zoo.cfg中的salve.1='value':2888:3888中的value必须一样
在/opt/hbase-1.2.1/conf目录下创建文件zk-jaas.conf,内容如下:
Client {
com.sun.security.auth.module.Krb5LoginModule required
useKeyTab=true
useTicketCache=false
keyTab="/opt/hbase-1.2.1/conf/hbase.keytab"
principal="hbase/mj1.bdsm.cmcc@YOUR.DOMAIN_NAME";
};
export HBASE_OPTS="-XX:+UseConcMarkSweepGC"
export HBASE_OPTS="$HABSE_OPTS -Djava.security.auth.login.config=/opt/hbase-1.2.1/conf/zk-jaas.conf"
******************************************************************************************
但是遗憾的是,出现了新错误如下:
按照上面错误提示,在zkEnv.sh中间添加了SERVER_JVMFLAGS="-Dsun.net.spi.nameservice.provider.1=dns,sun"
之后又报错
2016-04-29 13:37:43,284 [myid:] - ERROR [main:ZooKeeperServerMain@63] - Unexpected exception, exiting abnormally
java.io.IOException: Could not configure server because SASL configuration did not allow the ZooKeeper server to authenticate itself properly: javax.security.auth.login.LoginException: mj1.bdsm.cmcc
at org.apache.zookeeper.server.ServerCnxnFactory.configureSaslLogin(ServerCnxnFactory.java:207)
at org.apache.zookeeper.server.NIOServerCnxnFactory.configure(NIOServerCnxnFactory.java:82)
at org.apache.zookeeper.server.ZooKeeperServerMain.runFromConfig(ZooKeeperServerMain.java:111)
at org.apache.zookeeper.server.ZooKeeperServerMain.initializeAndRun(ZooKeeperServerMain.java:86)
at org.apache.zookeeper.server.ZooKeeperServerMain.main(ZooKeeperServerMain.java:52)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.initializeAndRun(QuorumPeerMain.java:116)
at org.apache.zookeeper.server.quorum.QuorumPeerMain.main(QuorumPeerMain.java:78)
可能与zookeeper的要求结点数有关?,我这里部署的是单点模式,可能不行。还是需要学习一下zookeeper,所以这个未完待续。。。。。。
参考:http://www.tuicool.com/articles/uMVRFfb
http://www.tuicool.com/articles/YVbmIzm
http://blog.csdn.net/xiao_jun_0820/article/details/39375819
http://blackproof.iteye.com/blog/2023798
问题在五一之后解决,未完待续。。。。