用过hbase的朋友可能都有过这样的疑问,我写一个java client,好像就提供了zookeeper quorum地址就连上hbase了,那么是不是存在安全问题?的确是,如何解决?hbase中引入了kerberos认证。我准备用两篇博文介绍hbase + kerberos的相关内容,本篇主要介绍kerberos的配置。

环境准备

这里我准备了三台server,各自安装上centos 6.5 64bit

  • kb1: kerberos server
  • kbhbase1: kerberos client, 后续也用于安装运行HBase
  • kbjavatest1: kerberos client, 后续将在其上部署java程序访问kbhbase1上的hbase数据库

kerberos简介

kerberos简单来说就是一套完全控制机制,它有一个中心服务器(KDC),KDC中有数据库,你可以往里添加各种“人”以及各种“服务”的“身份证”,当某个人要访问某个服务时,他拿着自己的“身份证”联系KDC并告诉KDC他想要访问的服务,KDC经过一系列验证步骤,最终依据验证结果允许/拒绝这个人访问此服务。关于kerberos具体的工作流程,参见文章《Explain like I’m 5: Kerberos》

kerberos server配置

安装

#yum install krb5-libs krb5-server krb5-workstation

配置

1)#vim /etc/krb5.conf

  View Code

2)#vim /var/kerberos/krb5kdc/kdc.conf

  View Code

kerberos中的realm,即kerberos的域,类似于计算机网络中"domain"的概念。

3)#vim /var/kerberos/krb5kdc/kadm5.acl

这个文件是用来控制哪些人可以使用kadmin工具来管理kerberos数据库,我这里就配了一行:

*/admin@MH.COM *

其中前一个*号是通配符,表示像名为“abc/admin”或“xxx/admin”的人都可以使用此工具(远程或本地)管理kerberos数据库,后一个*跟权限有关,*表示所有权限,还可以进行更细的控制,参见ACL

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时,需要这个密码。

启动

  • #service krb5kdc start
  • #service kadmin start
  • #chkconfig krb5kdc on
  • #chkconfig kadmin on

验证

  • #kinit admin/admin

如果kinit不带参数,则会默认以当前操作系统用户名,比如root,作为名称。因为root在kerberos的数据库中并没有,所以会提示失败

  • #klist

正常应该显示:

Ticket cache: FILE:/tmp/krb5cc_0

Default principal: admin/admin@MH.COM

Valid starting     Expires            Service principal

04/10/15 13:03:36  04/11/15 13:03:36  krbtgt/MH.COM@MH.COM

        renew until 04/10/15 13:03:36

以下这两个应该不是必须的,与兼容性有关,ktadd命令会把“身份证”写入到文件(.keytab后缀),可以指定keytab文件,如不指定,默认写入/etc/krb5.keytab

  • kadmin.local: ktadd kadmin/admin
  • kadmin.local: ktadd kadmin/changepw

其它一些命令

  • #kdestroy,退出当前kerberos用户,即你最后使用kinit过的那个用户
  • kadmin.local>listprincs 列出所有存在数据库中的人或服务
  • kadmin.local>delprinc zookeeper/kbhbase1.mh.com@MH.COM 删除人或服务
  • kadmin.local>addprinc admin/admin 添加人或服务
  • kadmin.local>q 退出kadmin
  • kadmin:  addprinc -randkey root/kbhbase1.mh@MH.COM
  • kadmin:  xst -k root.keytab root/kbhbase1.mh.com
  • # klist -kt root.keytab 列出这个keytab中保存的所有人或服务

一般在实例使用中通过kinit的方式较少,因为每次都要输入密码,所以更经常使用的是keytab文件,相当于为某个人或服务生成一个密码,并放在文件中,程序中则指向这个keytab,不用每次都输入密码。

kerberos client配置

现在,我们到kbhbase1这台机器上,即我们的kerberos 客户端上。kerberos对服务器跟客户端之间的时间有要求,所以一般需要安装ntp来作时间同步,我这里直接手工同步了一下,就不再介绍ntp了。 #yum install krb5-libs krb5-workstation 注意与kerberos server上的yum命令对比。安装完成后把server上的krb5.conf文件拷贝过来覆盖一下即可。注意:

  • kb1和kbhbase1的/etc/hosts文件都要把各自以及对方添加上去
  • 关闭这两个server上的防火墙
    • #service iptables stop
    • #chkconfig iptables off

与在server上类似,使用kinit和klist查看一下。也可以尝试执行kadmin,按提示使用admin/admin并输入密码(你之前创建管理员时输入的密码),正常应该能够连接上服务器,并对数据库进行操作(比如添加或删除人、服务)。

 

最近有这个需求,因为kerberos认证,一直连不上,通过很多大佬的帮忙,终于成功连上,在此分享下自己的一点点收获

话不多说,

1.需要hbase-site.xml这个配置文件,里面有很多配置属性是需要的,需要将这个文件放到根目录下;很多属性因为在这个配置文件里有了,所以不用设置,但是你设置了,会以你设置的为准,这里面的只是初始化。

2.keytab文件

3.krb5.conf文件

private static final String KEYTAB_FILE =CLASS_LOADER.getResource("kerberos/smokeuser.headless.keytab").getPath();
 
private static final String KERB_CONF =CLASS_LOADER.getResource("kerberos/krb5.conf").getPath();
    private static Connection connection =null;
    private static Admin admin =null;
    public static List<String> list=null;
 
static {
        System.setProperty("java.security.krb5.conf", KERB_CONF);
        System.setProperty("sun.security.krb5.debug", "true");
 
        final Configuration conf = HBaseConfiguration.create();
        conf.set("hbase.zookeeper.quorum", "zookenode1,zookenode2,zookenode3");
        conf.set("hbase.zookeeper.property.clientPort", "2181");
        conf.set("hadoop.security.authentication", "kerberos");
        conf.set("hbase.security.authentication", "kerberos");
        conf.set("zookeeper.znode.parent", "/hbase-secure");
        conf.set("hbase.master.kerberos.principal", "hbase/xxxx1@xxx.COM");
        UserGroupInformation.setConfiguration(conf);
        try {
            UserGroupInformation ugi = UserGroupInformation.loginUserFromKeytabAndReturnUGI("xxxx2@xxx.COM", KEYTAB_FILE);
            UserGroupInformation.setLoginUser(ugi);
            HBaseAdmin.available(conf);
            connection = ConnectionFactory.createConnection(conf);
            admin = connection.getAdmin();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 

注意 :principal的值hbase/xxxx1@xxx.COM为主hbase主节点;keytab文件和xxxx2@xxx.COM需要对应;我这里用的hbase不是1.xx版本的,是2.xx版本的,所以是 HBaseAdmin.available(conf);方法;

到此,应该没有多大问题了,可以通过admin和connection愉快的操作hbase了。
 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐