准备安全认证


场景说明

在安全集群环境下,各个组件之间的相互通信不能够简单的互通,需要在通信之前进行相互认证,以确保通信的安全性。

用户在开发HDFS应用程序时,某些场景下,需要与Yarn、HBase等之间进行通信。所以HDFS应用程序中需要写入安全认证代码,确保HDFS程序能够正常运行。

安全认证有两种方式:

  • 命令行认证:
    提交HDFS应用程序运行前,在HDFS客户端执行如下命令进行认证。

    kinit组件业务用户

  • 代码认证:
    通过获取客户端的principal和keytab文件进行认证。

安全认证代码

目前样例代码统一调用LoginUtil类进行安全认证。安全登录流程请参见安全认证接口章节。

在HDFS样例工程代码中,不同的样例工程,使用的认证代码不同,包括基本安全认证和带ZooKeeper认证。

  • 基本安全认证: HdfsMain程序不需要访问HBase或ZooKeeper,所以使用基本的安全认证代码即可。示例代码如下:
private static String PRNCIPAL_NAME = "test";
private static String PATH_TO_KEYTAB = HdfsMain.class.getClassLoader().getResource("user.keytab").getPath();
private static String PATH_TO_KRB5_CONF = HdfsMain.class.getClassLoader().getResource("krb5.conf").getPath();
private static String PATH_TO_HDFS_SITE_XML = HdfsMain.class.getClassLoader().getResource("hdfs-site.xml").getPath();
private static String PATH_TO_CORE_SITE_XML = HdfsMain.class.getClassLoader().getResource("core-site.xml").getPath();
//private static String PATH_TO_SMALL_SITE_XML = HdfsMain.class.getClassLoader().getResource("smallfs-site.xml").getPath();

conf.addResource(new Path(PATH_TO_HDFS_SITE_XML));
conf.addResource(new Path(PATH_TO_CORE_SITE_XML));
LoginUtil.login(PRNCIPAL_NAME, PATH_TO_KEYTAB, PATH_TO_KRB5_CONF, conf);

说明:

示例代码中

//private static String PATH_TO_SMALL_SITE_XML = HdfsMain.class.getClassLoader().getResource("smallfs-site.xml").getPath();

为注释掉的SmallFS小文件样例代码。若需要运行SmallFS小文件,则需去掉注释符号。

  • 带ZooKeeper认证:

“ColocationExample”样例程序不仅需要基础安全认证,还需要添加ZooKeeper服务端Principal才能完成安全认证。示例代码如下:

private static final String ZOOKEEPER_SERVER_PRINCIPAL_KEY = "zookeeper.server.principal";
private static final String ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL = "zookeeper/hadoop";
private static Configuration conf = new Configuration();
private static DFSColocationAdmin dfsAdmin;
private static DFSColocationClient dfs;
private static String PRINCIPAL = "username.client.kerberos.principal";
private static String KEYTAB = "username.client.keytab.file";
private static String PRNCIPAL_NAME = "test";
static String userdir = System.getProperty("user.dir") + File.separator + "conf" + File.separator;
private static String PATH_TO_KEYTAB = System.getProperty("user.dir") + File.separator + "conf" + File.separator + "user.keytab";
private static String PATH_TO_KRB5_CONF = ColocationExample.class.getClassLoader().getResource("krb5.conf").getPath();

conf.set(KEYTAB, PATH_TO_KEYTAB);
conf.set(PRINCIPAL, PRNCIPAL_NAME);

LoginUtil.setJaasConf(LOGIN_CONTEXT_NAME,PRNCIPAL_NAME,PATH_TO_KEYTAB);
LoginUtil.setZookeeperServerPrincipal(ZOOKEEPER_SERVER_PRINCIPAL_KEY,ZOOKEEPER_DEFAULT_SERVER_PRINCIPAL);
LoginUtil.login(PRNCIPAL_NAME, PATH_TO_KEYTAB, PATH_TO_KRB5_CONF, conf);

说明:

安全认证代码中的user.keytab、krb5.conf和test为示例,实际操作时请联系管理员获取相应帐号对应权限的keytab文件和krb5文件。

results matching ""

    No results matching ""