为安全HDFS配置PXF

为您的HDFS文件系统启用Kerberos时,作为HDFS客户端的PXF需要principal文件和keytab文件来验证对HDFS的访问。要在安全的HDFS上读取或写入文件,必须创建和部署PXF的Kerberos主体和keytab文件,并确保Kerberos身份验证已启用并起作用。

准备

在你配置PXF去访问需要安全访问的HDFS文件系统之前,确保你已经做到:

  • 使用默认的PXF服务器配置配置了Hadoop连接器。

  • 按照Configuring PXF章节秒速初始化、配置和启动PXF,包括PXF功能和Hadoop用户模拟功能启用

  • 根据特定分发的说明为Hadoop集群启用Kerberos,并验证配置。

  • 确保HDFS的配置参数dfs.block.access.token.enable已经被设置成了true。你可以在你hadoop集群的hdfs-site.xml配置文件中找到该配置。

  • 注意每个Greenplum数据库segment主机(<seghost>)和Kerberos密钥分发中心(KDC) <kdc-server>主机的主机名或IP地址

  • 注意群集所在的Kerberos <realm> 的名称。

过程

按照如下流程为有安全的HDFS配置PXF。您将在Kerberos KDC服务器和Greenplum数据库segment主机上执行操作。

登录到Kerberos KDC服务主机执行如下操作:

  1. 使用root账户登录到 Kerberos KDC 服务主机。

    $ ssh root@<kdc-server>
    root@kdc-server$
    
  2. 如果你的集群主机不存在配置文件的话,需要在KDC服务主机上分发/etc/krb5.conf配置文件到GPDB的每一个的segment节点,例如:

    root@kdc-server$ scp /etc/krb5.conf seghost:/etc/krb5.conf
    
  3. 使用kadmin.local命令为GPDB的每个segment节点主机创建一个Kerberos PXF服务主体。服务主体的格式应为gpadmin/<seghost>@<realm>,其中<seghost>是segment主机系统的DNS可解析的全限定主机名(hostname -f命令的输出)。例如,以下命令在名为EXAMPLE.COM的Kerberos领域中为名为host1.example.com,host2.example.comhost3.example.com的主机创建PXF服务主体:

    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host1.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host2.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "addprinc -randkey -pw changeme gpadmin/host3.example.com@EXAMPLE.COM"
    
  4. 为每个Kerberos PXF服务主体生成一个密钥表文件。 将密钥表文件保存在任何方便的位置(本示例使用目录/etc/security/keytabs)。 您将在以后的步骤中将keytab文件部署到它们各自的Greenplum数据库segment主机。 例如:

    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host1.service.keytab gpadmin/host1.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host2.service.keytab gpadmin/host2.example.com@EXAMPLE.COM"
    root@kdc-server$ kadmin.local -q "xst -norandkey -k /etc/security/keytabs/pxf-host3.service.keytab gpadmin/host3.example.com@EXAMPLE.COM"
    

    根据需要重复xst命令用以在每个PXF服务主体上生成一个秘钥表。

  5. 列出principals:

    root@kdc-server$ kadmin.local -q "listprincs"
    
  6. 将每个PXF服务主体的密钥表文件复制到其各自的segment主机。 例如,以下命令在PXF_CONF=/usr/local/greenplum-pxf时,将在步骤4中生成的每个主体复制到segment主机上的PXF默认keytab目录中

    root@kdc-server$ scp /etc/security/keytabs/pxf-host1.service.keytab host1.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ scp /etc/security/keytabs/pxf-host2.service.keytab host2.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ scp /etc/security/keytabs/pxf-host3.service.keytab host3.example.com:/usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    

    Note the file system location of the keytab file on each PXF host; you will need this information for a later configuration step.

  7. 更改pxf.service.keytab文件的属主和权限。 这些文件必须仅由gpadmin用户拥有并可读。 例如:

    root@kdc-server$ ssh host1.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host1.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host2.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host2.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host3.example.com chown gpadmin:gpadmin /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    root@kdc-server$ ssh host3.example.com chmod 400 /usr/local/greenplum-pxf/keytabs/pxf.service.keytab
    

在每个GPDB的segment节点执行以下步骤:

  1. 登录segment节点,例如:

    $ ssh gpadmin@<seghost>
    
  2. 如果在Greenplum的各个segment节点上Kerberos客户端包还没有被安装,那么首先安装他们。您必须具有超级用户权限才能安装操作系统软件包。 例如:

    root@seghost$ rpm -qa | grep krb
    root@seghost$ yum install krb5-libs krb5-workstation
    
  3. 打开 pxf-env.sh用户配置文件。例如使用vi命令打开PXF_CONF=/usr/local/greenplum-pxf:

    gpadmin@seghost$ vi /usr/local/greenplum-pxf/conf/pxf-env.sh
    
  4. 更新PXF_KEYTABPXF_PRINCIPAL 配置. 指定keytab 文件 和 Kerberos principal的位置。这些设置的默认值如下所示:

    export PXF_KEYTAB="${PXF_CONF}/keytabs/pxf.service.keytab"
    export PXF_PRINCIPAL="gpadmin/_HOST@EXAMPLE.COM"
    

    PXF automatically replaces _HOST with the FQDN of the segment host.

  5. 在segment上重启PXF服务:

    gpadmin@seghost$ $GPHOME/pxf/bin/pxf restart