Kafka阶段的安全

您可以配置Kafka阶段– Kafka Consumer,Kafka Multitopic Consumer和Kafka Producer –通过以下方法安全地连接:

  • Kerberos
  • SSL / TLS
  • SSL / TLS和Kerberos

要启用安全性,除了完成先决任务外,还需要在此阶段中配置其他Kafka配置属性。

当单独使用Kerberos或与SSL / TLS一起使用Kerberos时,对于如何提供Kerberos凭据,您有几种选择。您选择的方法决定了要执行的其他任务。

必备任务

在为Kafka阶段启用安全性之前,请完成以下要使用的安全性方法的先决任务:

Kerberos

使用Kerberos连接到Kafka之前,请完成以下先决条件任务:

  • 确保按照Kafka文档中的说明为Kerberos配置Kafka。
  • 确保Data Collector启用了Kerberos身份验证,如在Kerberos身份验证中所述
  • 如果对Kerberos keytab使用凭据存储,请确保将Data Collector配置为使用受支持的凭据存储。(可选)将Data Collector配置为需要组密码

    有关受支持的凭据存储的列表以及有关启用每个凭据存储的说明,请参阅凭据存储

  • 如果配置Kafka YARN集群管道,请将JAAS配置和Kafka keytab文件存储在Data Collector计算机上以及YARN集群中的每个节点上的相同位置 。
SSL / TLS
使用SSL / TLS连接到Kafka之前,请完成以下先决条件任务:

  • 在使用SSL / TLS连接到Kafka之前,请确保按照Kafka文档中的说明为Kafka配置SSL / TLS 。
  • 如果配置Kafka YARN集群管道,请将SSL信任库和密钥库文件存储在Data Collector计算机上和YARN集群中的每个节点上的同一位置。

提供Kerberos凭据

要使用Kerberos连接到Kafka,必须提供要使用的Kerberos凭据。

您可以通过以下两种方式之一提供Kerberos凭据。您也可以根据需要同时使用这两种方法:

JAAS文件
当您要为创建的每个管道中的每个Kafka阶段使用相同的keytab和principal时,请在Java身份验证和授权服务(JAAS)文件中定义Kerberos凭据。配置后,阶段属性中定义的凭据将覆盖JAAS文件凭据。
您可能使用此方法来提供默认的keytab和principal。然后,根据需要使用阶段属性指定不同的凭据。
要使用此方法,您需要在JAAS文件中定义Kerberos keytab和principal。然后,更新SDC_JAVA_OPTS环境变量以包含JAAS文件的路径。
阶段属性
当Kafka阶段对Kafka 0.11.0.0或更高版本使用阶段库时,可以在阶段属性中定义Kerberos凭据。当您想在不同的Kafka阶段中使用不同的凭据时,请在阶段属性中定义Kerberos凭据。
如果还将JAAS文件配置为提供Kerberos凭据,则在阶段属性中输入的凭据将覆盖JAAS文件中的凭据。
要在阶段属性中提供Kerberos凭据,请在阶段的Kafka选项卡上选择“Provide Keytab”属性。您以纯文本形式指定主体,然后使用以下方法之一来指定密钥表:

  • 在Keytab属性中输入Base64编码的keytab。

    在阶段属性中输入密钥表之前,请对其进行编码。在对密钥表进行编码之前,请确保删除不必要的字符,例如换行符。

  • 使用凭据函数来访问在凭证存储中定义的Base64编码的密钥表。

    有关更多信息,请参阅使用凭据存储。

注意: 目前,集群管道中不支持在阶段属性中配置Kerberos凭据。

有关启用Kafka阶段以使用Kerberos身份验证的详细信息,请参阅“启用Kerberos”。

使用凭据存储

您可以在凭据存储中定义Kerberos keytab,然后从Kafka阶段调用相应的keytab。

在凭证存储区中定义Kerberos keytab可让您存储供Kafka阶段使用的多个keytab。它还提供了如何使用keytab的灵活性。例如,您可以创建两个单独的keytab,一个用于Kafka源端,一个用于Kafka目标端。或者,您可以为定义的每个Kafka阶段提供单独的keytab。

使用凭据存储可以轻松更新keytab,而无需编辑使用它们的阶段。这可以简化任务,例如回收keytab或将管道迁移到生产中。

为了获得额外的安全性,您可以要求对凭据存储密钥的组访问权限

启用Kerberos

Kafka阶段可以使用Kerberos身份验证连接到Kafka。在允许Kafka阶段使用Kerberos之前,请确保已执行所有必要的先决任务。

以下步骤提供有关使用JAAS文件或阶段属性提供Kerberos凭据的详细信息。您可以使用这两种方法中的一种或两种。跳过与您所需的实现无关的步骤。

  1. 要使用Java身份验证和授权服务(JAAS)文件提供Kerberos凭据,请根据您的安装和身份验证类型添加Kafka客户端所需的配置属性。
    • 没有LDAP身份验证的RPM,tarball或Cloudera Manager安装 – 如果Data Collector不使用LDAP身份验证,请在Data Collector 计算机上创建一个单独的JAAS配置文件。将以下KafkaClient登录部分添加到文件中:
      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="<keytab path>"
          principal="<principal name>/<host name>@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="/etc/security/keytabs/sdc.keytab"
          principal="sdc/sdc-01.streamsets.net@EXAMPLE.COM";
      };
      然后修改SDC_JAVA_OPTS环境变量,使其包含以下选项,这些选项定义了JAAS配置文件的路径:

      -Djava.security.auth.login.config=<JAAS config path>

      使用安装类型所需的方法来修改环境变量。

    • 使用LDAP认证的RPM或tarball安装 – 如果在RPM或tarball的安装中启用了LDAP认证,则将属性添加到Data Collector使用的JAAS配置文件中- $SDC_CONF/ldap-login.conf文件。将以下KafkaClient登录部分添加到 ldap-login.conf 文件末尾:
      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="<keytab path>"
          principal="<principal name>/<host name>@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="/etc/security/keytabs/sdc.keytab"
          principal="sdc/sdc-01.streamsets.net@EXAMPLE.COM";
      };
    • 使用LDAP身份验证的Cloudera Manager安装 – 如果在Cloudera Manager安装中启用了LDAP身份验证,请在Cloudera Manager中为StreamSets服务启用LDAP配置文件替换(ldap.login.file.allow.substitutions)属性。

      如果启用了“Use Safety Valve to Edit LDAP Information(use.ldap.login.file)”属性,并且在“Data Collector Advanced Configuration Snippet (Safety Valve) for ldap-login.conf”中配置了LDAP身份验证,则添加JAAS配置属性与ldap-login.conf safety valve相同。

      如果通过LDAP属性而不是ldap-login.conf safety valve配置LDAP身份验证,则将JAAS配置属性添加到“Data Collector Advanced Configuration Snippet (Safety Valve) for generated-ldap-login-append.conf”中。

      将以下KafkaClient登录部分添加到适当的字段,如下所示:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="_KEYTAB_PATH"
          principal="<principal name>/_HOST@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="_KEYTAB_PATH"
          principal="sdc/_HOST@EXAMPLE.COM";
      };

      Cloudera Manager会生成适当的密钥表路径和主机名。

  2. 如果使用凭据存储区从阶段属性调用keytab,请将您要使用的Base64编码的键表添加到凭据库中。
    注意: 在对keytab进行编码之前,请确保删除不必要的字符,例如换行符。

    如果您将Data Collector配置为要求组密钥。对于您定义的每个keytab密钥,创建一个组密钥,并指定一个逗号分隔的允许访问keytab密钥的组列表。

    根据keytab密钥名称来命名组密钥,如下所示:<keytab secret name>-groups

    有关定义密钥的详细信息,请参阅凭据存储文档。

  3. 在Kafka阶段的“General选项卡上,将“Stage Library属性设置为适当的Kafka版本。

    如果为Kafka YARN集群管道配置Kafka Consumer源,请为Kafka 0.10.0.0或更高版本选择一个阶段库。

    如果使用阶段属性来定义Kafka凭据,请为Kafka 0.11.0.0或更高版本选择一个阶段库。

  4. 在Kafka阶段的Kafka选项卡上,对于Kafka Configuration属性,使用Add图标添加以下属性:
    • 添加security.protocol Kafka配置属性,并将其设置为SASL_PLAINTEXT
    • 添加sasl.kerberos.service.name配置属性,并将其设置为kafka
  5. 如果使用阶段属性来提供Kerberos凭据,请在Kafka选项卡上配置以下其他属性 :
    注意: 目前,集群管道中不支持在阶段属性中配置Kerberos凭据。
    1. 选择“Provide Keytab属性。
    2. 对于Keytab属性,请使用以下选项之一:
      • 输入Base64编码的keytab。

        在对keytab进行编码之前,请确保删除不必要的字符,例如换行符。

      • 如果使用凭据存储,请使用 credential:get()或 credential:getWithOptions() 凭据函数来检索Base64编码的keytab。
        注意:启动管道的用户必须位于凭据函数中指定的Data Collector组中。当Data Collector需要组密钥时,用户也必须与keytab关联在一个组中。

        有关在凭证存储区中使用keytab的更多信息,请参阅“使用凭据存储”。

    3. 对于Principal属性,使用以下格式来指定主体:<principal name>/<host name>@<realm>

例如,以下属性允许阶段使用存储在readkeytab允许访问devops用户组中用户的名称的Azure Key Vault中的keytab通过Kerberos连接到Kafka :

启用S​​SL / TLS

Kafka阶段可以使用SSL / TLS连接到Kafka。

在使Kafka阶段能够使用SSL / TLS之前,请确保已执行所有必要的先决任务。然后,执行以下步骤以使Kafka阶段能够使用SSL / TLS连接到Kafka。

  1. 在阶段的“General选项卡上,将“Stage Library属性设置为适当的Kafka版本。

    如果为Kafka YARN集群管道配置Kafka Consumer来源,请将属性设置为Kafka版本0.10.0.0或更高版本。

  2. 在“Kafka”选项卡上,对于“Kafka Configuration属性,使用“Add图标添加以下属性:
    • 添加security.protocol Kafka配置属性并将其设置为SSL
  3. 然后,添加并配置以下SSL Kafka属性:
    • ssl.truststore.location
    • ssl.truststore.password
    当Kafka代理要求客户端身份验证时(即 ssl.client.auth代理属性设置为required时),添加并配置以下属性:

    • ssl.keystore.location
    • ssl.keystore.password
    • ssl.key.password
    一些brokers可能还需要添加以下属性:

    • ssl.enabled.protocols
    • ssl.truststore.type
    • ssl.keystore.type

    在Data Collector Edge管道中,配置Kafka Producer目标端时,仅使用 security.protocol, ssl.truststore.location ssl.keystore.location属性。其他属性无效。另外,在配置Kafka Producer时,请为使用PEM格式的信任库和密钥库文件输入绝对路径。

    有关这些属性的详细信息,请参见Kafka文档。

例如,以下属性允许该阶段使用SSL / TLS通过客户端身份验证连接到Kafka:

启用Kerberos和SSL / TLS

Kafka阶段可以使用Kerberos身份验证和SSL / TLS连接到Kafka。

在允许Kafka阶段使用Kerberos之前,请确保已执行所有必要的先决任务。然后,执行以下步骤以启用使用Kerberos身份验证和SSL / TLS的Kafka连接。

这些步骤提供有关使用JAAS文件或阶段属性提供Kerberos凭据的详细信息。您可以使用这两种方法中的一种或两种。跳过与您所需的实现无关的步骤。

  1. 要使用Java身份验证和授权服务(JAAS)文件提供Kerberos凭据,请根据您的安装和身份验证类型添加Kafka客户端所需的配置属性。
    • 没有LDAP身份验证的RPM,tarball或Cloudera Manager安装 – 如果Data Collector不使用LDAP身份验证,请在Data Collector计算机上创建一个单独的JAAS配置文件。将以下KafkaClient登录部分添加到文件中:
      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="<keytab path>"
          principal="<principal name>/<host name>@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="/etc/security/keytabs/sdc.keytab"
          principal="sdc/sdc-01.streamsets.net@EXAMPLE.COM";
      };
      然后修改SDC_JAVA_OPTS环境变量,使其包含以下选项,这些选项定义了JAAS配置文件的路径:

      -Djava.security.auth.login.config=<JAAS config path>

      使用安装类型所需的方法来修改环境变量。

    • 使用LDAP认证的RPM或tarball安装 – 如果在RPM或tarball的安装中启用了LDAP认证,则将属性添加到Data Collector使用的JAAS配置文件中- $SDC_CONF/ldap-login.conf文件。将以下KafkaClient登录部分添加到 ldap-login.conf 文件末尾:
      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="<keytab path>"
          principal="<principal name>/<host name>@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="/etc/security/keytabs/sdc.keytab"
          principal="sdc/sdc-01.streamsets.net@EXAMPLE.COM";
      };
    • 使用LDAP身份验证的Cloudera Manager安装 – 如果在Cloudera Manager安装中启用了LDAP身份验证,请在Cloudera Manager中为StreamSets服务启用“LDAP Config File Substitutions(ldap.login.file.allow.substitutions)”属性。

      如果启用了“Use Safety Valve to Edit LDAP Information (use.ldap.login.file) ”属性,并且在“Data Collector Advanced Configuration Snippet (Safety Valve) for ldap-login.conf”中配置了LDAP身份验证,则添加JAAS配置属性与ldap-login.conf安全阀相同。

      如果通过LDAP属性而不是ldap-login.conf安全阀配置LDAP身份验证,则将JAAS配置属性添加到“Data Collector Advanced Configuration Snippet (Safety Valve) for generated-ldap-login-append.conf”中。

      将以下KafkaClient登录部分添加到适当的字段,如下所示:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="_KEYTAB_PATH"
          principal="<principal name>/_HOST@<realm>";
      };
      例如:

      KafkaClient {
          com.sun.security.auth.module.Krb5LoginModule required
          useKeyTab=true
          keyTab="_KEYTAB_PATH"
          principal="sdc/_HOST@EXAMPLE.COM";
      };

      Cloudera Manager会生成适当的keytab路径和主机名。

  2. 如果使用凭据存储区从阶段属性调用keytab,请将您要使用的Base64编码的键表添加到凭据库中。
    注意: 在对keytab进行编码之前,请确保删除不必要的字符,例如换行符。

    如果您将Data Collector配置为要求组密钥。对于您定义的每个keytab密钥,创建一个组密钥,并指定一个逗号分隔的允许访问keytab密钥的组列表。

    根据keytab密钥名称来命名组密钥,如下所示:<keytab secret name>-groups

    有关定义密钥的详细信息,请参阅凭据存储文档。

  3. 在Kafka阶段的“General选项卡上,将“Stage Library属性设置为适当的Kafka版本。

    如果为Kafka YARN集群管道配置Kafka Consumer来源,请为Kafka 0.10.0.0或更高版本选择一个阶段库。

    如果使用阶段属性来定义Kafka凭据,请为Kafka 0.11.0.0或更高版本选择一个阶段库。

  4. 在Kafka阶段的Kafka选项卡上,对于Kafka Configuration属性,使用Add图标添加以下属性:
    • 添加security.protocol Kafka配置属性,并将其设置为SASL_SSL
    • 添加sasl.kerberos.service.name配置属性,并将其设置为kafka
  5. 然后,添加并配置以下SSL Kafka属性:
    • ssl.truststore.location
    • ssl.truststore.password
    当Kafka代理要求客户端身份验证时(即 ssl.client.auth代理属性设置为required时),添加并配置以下属性:

    • ssl.keystore.location
    • ssl.keystore.password
    • ssl.key.password
    一些brokers可能还需要添加以下属性:

    • ssl.enabled.protocols
    • ssl.truststore.type
    • ssl.keystore.type

    在Data Collector Edge管道中,配置Kafka Producer目标时,仅使用 security.protocol, ssl.truststore.location ssl.keystore.location属性。其他属性无效。另外,在配置Kafka Producer时,请为使用PEM格式的信任库和密钥库文件输入绝对路径。

    有关这些属性的详细信息,请参见Kafka文档。

  6. 如果使用阶段属性来提供Kerberos凭据,请在Kafka选项卡上配置以下其他属性 :
    注意: 目前,集群管道中不支持在阶段属性中配置Kerberos凭据。
    1. 选择“Provide Keytab属性。
    2. 对于“Keytab”属性,请使用以下选项之一:
      • 输入Base64编码的keytab

        在对keytab进行编码之前,请确保删除不必要的字符,例如换行符。

      • 如果使用凭据存储,请使用 credential:get()或 credential:getWithOptions() 凭据函数来检索Base64编码的keytab
        注意:启动管道的用户必须位于凭据函数中指定的Data Collector组中。当Data Collector需要组密钥时,用户也必须与keytab关联在一个组中。

        有关在凭证存储区中使用keytab的更多信息,请参阅“使用凭据存储”。

    3. 对于Principal属性,使用以下格式来指定主体:<principal name>/<host name>@<realm>

例如,以下属性允许阶段使用指定的Base64编码的keytab使用SSL / TLS和Kerberos连接到Kafka: