大数据运维及安全@IT·互联网

Step by Step 实现基于 Cloudera 5.8.2

2017-02-20  本文已影响390人  大数据之心

该向导针对 Windows 7 和 CentOS 7.2 两种环境进行编写,不适用于其他情况。

Cloudera Manager 集群支持安全模式访问,集成了基于Kerberos 5的身份认证和TLS(传输层加密)。Kerberos认证需要向服务端提交有效的认证信息,Windows用户以密钥文件+客户端的形式进行认证提交,CentOS用户以客户端的形式进行认证提交。传输层加密,需要客户端生成公钥私钥对进行加解密,公钥需要封装成x509 v3自签名证书。

环境说明

Jar包名称 版本
commons-codec 1.3
commons-collections 3.2.2
commons-configuration 1.6
commons-logging 1.1.1
guava 11.0.2
hadoop-auth 2.6.0-cdh5.8.2
hadoop-common 2.6.0-cdh5.8.2
hive-metastore 1.1.0-cdh5.8.2
hive-service 1.1.0-cdh5.8.2
hive-common 1.1.0-cdh5.8.2
hive-exec 1.1.0-cdh5.8.2
httpclient 4.2.5
httpcore 4.2.5
ImpalaJDBC41 2.5.35
libfb303 0.9.0
libthrift 0.9.0
log4j 1.2.17
ql N/A
sl4j-api 1.7.5
sl4j-log4j12 1.7.5
TCLIServiceClient N/A
zookeeper 3.4.6

Windows 7 用户访问

必须理解的术语:

以下信息是你访问集群需要的:

Step1. 使用Hosts进行域名解析

用管理员方式打开并编辑C:\Windows\System32\drivers\etc\hosts,在最后一行添加指定的Impala服务器域名解析:

192.168.1.1 v001001.dc1.domain.com

点击保存,在CMD中进行测试以验证解析是否成功:

ping v001001.dc1.domain.com

如果失败,请关闭DNS Client,并设置手动启动:

  1. 开始-> 搜索程序和文件中搜索管理工具,并打开;
  2. 双击服务并打开;
  3. 在列表中选择DNS Client右键点击属性
  4. 启动类型选择手动,服务状态点击停止,并点击确定保存;

再在CMD中进行ping测试,验证是否成功:

ping v001001.dc1.domain.com

Step2. 安装 MIT Kerberos 客户端

Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。

  1. 在线环境,请选择合适的版本进行下载安装:

    64位版本的msi包涵盖了32位和64位的库,但是32位版本的msi包只有32位的库。

    离线环境,对应的msi文件存放在用户手册的msis文件夹中。

  2. 双击msi包进行安装;

  3. 按照Instructions完成安装;

  4. 安装完成后点击Finished;

  5. 在CMD中直接运行kinit命令,确认安装是否成功 :

kinit

Step3. 新建用于访问服务的 Kerberos Principal

cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成验证用的 Ticket

  1. 把Kerberos配置文件krb5.ini,保存至C:\Windows\krb5.ini,注意保存格式必须为ANSI,如何保证格式?请使用记事本软件进行另存,编码选择ANSI;
  2. 修改Windows环境变量:开始- 计算机- 右键选择属性- 点击高级系统设置- 选择高级选项卡 - 点击环境变量- 在系统变量中新建KRB5CCNAME,赋值为:C:\Users\${WINDOWS_USER}\krbcc5_${WINDOWS_USER},这里的${WINDOWS_USER}为当前登录Windows的用户名;
  3. 通过MIT Kerberos生成ticket:
    • 程序里打开MIT Kerberos Ticket Manager
    • 点击Get Ticket
    • Principal填写test/impala_user@DOMAIN.COMPassword填写对应的密码;
  4. 认证是有有效周期的,周期为21小时,如果重启应用,请记得Renew Ticket

Step5. 生成带客户端证书的keystore

在Windows客户端的CMD中执行如下命令,生成带有客户端JKS证书的keystore文件:

${JAVA_HOME}\bin\keytool -genkeypair -keystore ${JAVA_HOME}\jre\lib\security\impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目录
IMPALA_CLIENT_FQDN # Windows客户端全域名;
KEYSTORE_PASS # Keystore文件的存储密码,牢记;

Step6. 使用Java SDK进行数据访问(以Eclipse为例)

创建工程,并引入上文环境说明中提到的jar包,jar包存放在用户手册的jars文件夹下;

示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}是生成keystore时指定的密码,表 hosts 请读者自己进行创建和创建测试数据:

package com.domain.bigdata.demo.impala.jdbc;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager       .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}\jre\lib\security\impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=C:\temp\impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

CentOS 7.2 用户访问

必须理解的术语:

以下信息是你访问集群需要的:

Step1. 使用Hosts进行域名解析

用管理员方式(sudo)打开并编辑/etc/hosts sudo vim /etc/hosts,在最后一行添加指定的Impala服务器域名解析:

192.168.1.1 v001001.dc1.domain.com

点击保存,测试以验证解析是否成功:

ping v001001.dc1.domain.com

Step2. 安装 MIT Kerberos 客户端

Kerberos客户端是用于获取ticket的,只有具有有效的ticket,用户才能通过认证进行数据访问。

在线环境请使用yum安装:

sudo yum install krb5-devel krb5-workstation -y

离线环境请使用rpm安装,rpm包存放在用户手册的rpms文件夹下:

sudo rpm -ivh krb5-devel-1.13.2-10.el7.x86_64.rpm
sudo rpm -ivh krb5-workstation-1.13.2-10.el7.x86_64.rpm

安装完成后使用kinit命令验证是否成功。

Step3. 新建用于访问服务的 Kerberos Principal

cdh-master/admin 是我们在之前 Step by Step 实现基于 Cloudera 5.8.2 的企业级安全大数据平台 - Kerberos的整合 中定义的 Kerberos 超级管理员:

ssh 192.168.1.1
kinit cdh-master/admin
kadmin
kadmin > addprinc test/impala_user

Step4. 生成验证用的 Ticket

拷贝客户端配置文件,并覆盖/etc/krb5.conf

在本地通过kinit生成本地ticket cache:

kinit test/impala_user@DOMAIN.COM

认证是有有效周期的,周期为21小时,如果重启应用,请记得重新kinit一次;

Step5. 生成带客户端证书的keystore

在终端中执行如下命令,生成带有客户端JKS证书的keystore文件:

${JAVA_HOME}/bin/keytool -genkeypair -keystore ${JAVA_HOME}/jre/lib/security/impala_jdbc.jks -keyalg RSA -alias impala_jdbc -dname "CN=${IMPALA_CLIENT_FQDN},OU=Bigdata,O=Domain,L=Hangzhou,ST=Zhejiang,C=CN" -storepass ${KEYSTORE_PASS} -keypass ${KEYSTORE_PASS}
JAVA_HOME # Java根目录
IMPALA_CLIENT_FQDN # CentOS客户端全域名;
KEYSTORE_PASS # keystore文件的存储密码,牢记;

Step6. 使用Java SDK进行数据访问

创建工程,并引入上文环境说明中提到的jar包(我们已经和用户手册一起提供,存放在jars文件夹下)。和Windows不同的是,工程的目录结构需要我们自己组织,结构如下(假设/home/admin/project为项目的根目录,假设执行代码的用户为admin):

示例代码如下,访问 default 数据库的hosts表,查询前10行数据,这里的${KEYSTORE_PASS}是生成keystore时指定的密码:

package impalaConnector;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
 
import com.cloudera.impala.jdbc41.*;
 
public class impalaConnector {
    public static void main(String[] args) throws Exception {
        Connection conn = null;
        ResultSet rs = null;
        Statement stmt = null;
         
        try {
            Class.forName("com.cloudera.impala.jdbc41.Driver");
            conn = DriverManager
                    .getConnection("jdbc:impala://v001001.dc1.domain.com:21050/default;"
                    + "AuthMech=1;"
                    + "SSL=1;"
                    + "AllowSelfSignedCert=1;"
                    + "CAIssueCertNameMismatch=1;"
                    + "KrbHostFQDN=v001001.dc1.domain.com;"
                    + "KrbRealm=DOMAIN.COM;"
                    + "KrbServiceName=impala;"
                    + "SSLKeyStore=${JAVA_HOME}/jre/lib/security/impala_jdbc.jks;"
                    + "SSLKeyStorePwd=${KEYSTORE_PASS};"
                    + "LogLevel=5;LogPath=/tmp/impala_jdbc_demo.log");
            String sql = "SELECT * FROM hosts LIMIT 10";
            System.out.println(conn.getAutoCommit());
            stmt = conn.createStatement();
            rs = stmt.excuteQuery(sql);
            while (rs.next()) {
                System.out.println(rs.getString(2) + "|" + rs.getString(3)
                    + "|" + rs.getString(4));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (rs != null) {
                rs.close();
            }
            if (stmt != null) {
                stmt.close();
            }
            if (conn != null) {
                conn.close();
            }
        }
    }
}

把示例代码拷贝至/home/admin/project/impalaConnector/src/impalaConnector,并进行编译:

cp impalaConnector.java /home/admin/project/impalaConnector/src/impalaConnector
cd /home/admin/project/impalaConnector/src/impalaConnector
${JAVA_HOME}/bin/javac impalaConnector.java

拷贝class文件到bin目录下:

cp impalaConnector.class /home/admin/project/impalaConnector/bin/impalaConnector

执行代码:

cd /home/admin/project/impalaConnector/
${JAVA_HOME}/bin/java -cp lib/*:bin impalaConnector.impalaConnector
上一篇下一篇

猜你喜欢

热点阅读