用户认证

Data Collector可以基于LDAP或文件对用户帐户进行身份验证。最佳实践是在组织中使用LDAP。默认情况下,Data Collector使用基于文件的身份验证。

Data Collector提供了几个角色,这些角色确定用户可以执行的操作。根据使用的是LDAP认证还是基于文件的认证,将角色分配给用户帐户的步骤有所不同。

注意:Data Collector的生产部署应与LDAP身份验证集成。

配置LDAP认证

如果您的组织使用LDAP,则将Data Collector配置为使用LDAP身份验证。配置LDAP身份验证后,用户使用其LDAP用户名和密码登录到Data Collector

要配置LDAP身份验证,请执行以下任务:

  1. 配置LDAP连接信息。
  2. (可选)配置与LDAP服务器的安全连接。
  3. 将LDAP组映射到Data Collector角色。
  4. (可选)配置多个LDAP服务器。
  5. 如果使用MapR阶段,请为MapR启用LDAP身份验证。

步骤1.配置LDAP连接信息

要启用LDAP身份验证,请在$SDC_CONF目录中的Data Collector配置文件sdc.propertiesldap-login.conf中配置LDAP连接信息。

  1. Data Collector配置文件$SDC_CONF/sdc.properties中,通过将http.authentication.login.module属性设置为ldap来启用LDAP身份验证 。
  2. $SDC_CONF/sdc.properties文件中,通过将http.authentication 属性设置为basic,digest或form来定义HTTP身份验证类型。

    HTTP身份验证类型确定如何通过HTTP将密码从浏览器传输到Data Collector。摘要式身份验证会加密用户凭据。基本身份验证和表单身份验证按原样传输用户凭据。为确保安全地传输用户凭据以进行基本身份验证和表单身份验证,请将Data Collector配置为使用HTTPS,并使用LDAPS或StartTLS配置与LDAP的安全连接。
    对于Microsoft Active Directory服务器,请使用basic或form身份验证。

  3. $SDC_CONF/ldap-login.conf文件中,配置LDAP服务器的连接信息。

    在文件中,配置以下属性:

    LDAP属性 描述
    debug 启用LDAP调试。默认为false。
    useLdaps 使用LDAPS(基于SSL的LDAP)协议的安全LDAP连接。默认为false。

    您必须完成其他步骤才能使用LDAPS,请参阅步骤2。配置与LDAP的安全连接(可选)。

    useStartTLS 使用StartTLS协议保护LDAP连接的安全。默认为false。

    您必须完成其他步骤才能使用StartTLS,请参阅步骤2。配置与LDAP的安全连接(可选)。

    注意: StartTLS和LDAPS不能同时使用。如果useStartTLS和useLdaps都设置为true,则useStartTLS优先。
    contextFactory LDAP初始上下文工厂。默认值为com.sun.jndi.ldap.LdapCtxFactory。
    hostname LDAP服务器主机名。
    port LDAP服务器端口。

    要使用未加密的连接或使用通过StartTLS保护的连接,请输入LDAP端口号,通常为389。要使用通过LDAPS保护的连接,请输入安全连接的端口号,通常为636。

    bind 用于查询目录服务器的根专有名称(DN)。该用户必须具有搜索目录的特权。
    bindPassword 根专有名称的密码。为了提高安全性,请将密码保存在 $SDC_CONF/ldap-bind-password.txt文件中,不要包含其他字符,空格或换行符。最佳做法是,文件应具有仅所有者权限。

    默认值为@ ldap-bind-password.txt @,它指向 ldap-bind-password.txt密码文件。

    forceBindingLogin 确定是否执行绑定登录检查。使用以下选项之一:

    • false – Data Collector根据从LDAP服务器接收的信息执行身份验证。

      设置为false时,bindDn用户必须有权访问用户的详细信息,密码和组信息。用于摘要认证。

    • true – Data Collector将用户凭据传递到LDAP服务器进行身份验证。

      设置为true时,bindDn用户必须具有访问用户组信息的权限。用于Microsoft Active Directory服务器,用于基本身份验证或表单身份验证,或者用于加密LDAP服务器中存储的密码时。不要用于摘要身份验证。

    默认为false。

    userBaseDn 用户帐户所在的基本DN。
    userIdAttribute 用户标识属性的名称。默认值为uid。
    userPasswordAttribute 存储用户密码的属性的名称。默认值为userPassword。

    对于Microsoft Active Directory服务器,请使用空字符串。

    userObjectClass 用户对象类的名称。默认值为inetOrgPerson。
    userFilter 用于登录Data Collector的用户属性名称。例如,LDAP用户可以使用用户名,uid或电子邮件地址登录。默认值为 uid={user}
    roleBaseDn 基本DN以搜索角色成员身份。
    roleNameAttribute 角色名称的属性名称。默认值为roleName。
    roleMemberAttribute 用户名的角色属性的名称。默认为Member。
    roleObjectClass 角色对象类。默认值为groupOfNames。
    roleFilter 指定LDAP组成员是由DN还是uid确定。输入以下值之一:

    • "member={dn}" -当LDAP组按完整DN列出成员时使用。
    • "memberUid={user}" -当LDAP组通过uid列出成员时使用。

    默认为DN。

OpenLDAP示例

让我们看一个示例ldap-login.conf文件,看看Data Collector如何使用LDAP连接信息来认证LDAP用户。

以下示例显示了ldap-login.confOpenLDAP服务器的文件:

ldap {
  com.streamsets.datacollector.http.LdapLoginModule required
  debug="true"
  useLdaps="true"
  useStartTLS="false"
  contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
  hostname="server1"
  port="636"
  bindDn="cn=admin,dc=example,dc=net"
  bindPassword="@ldap-bind-password.txt@"
  forceBindingLogin="false"
  userBaseDn="ou=users,dc=example,dc=net"
  userIdAttribute="uid"
  userPasswordAttribute="userPassword"
  userObjectClass="inetOrgPerson"
  userFilter="uid={user}"
  roleBaseDn="ou=groups,dc=example,dc=net"
  roleNameAttribute="cn"
  roleMemberAttribute="member"
  roleObjectClass="groupOfNames"
  roleFilter="member={dn}";
}; 

LDAP用户登录到Data Collector时, Data Collector使用ldap-login.conf文件中的连接信息对用户进行身份验证。Data Collector完成以下步骤以认证LDAP用户:

  1. 当forceBindingLogin设置为false时,通过向LDAP服务器发送以下查询来检查用户帐户是否在配置的LDAP服务器中注册:
    ldapsearch -LLL -H ldaps://<hostname>:<port> -x -D <bindDn> -w <bindPassword> -b <userBaseDn> "(&(objectClass=<userObjectClass>)(<userIdAttribute>=username))"

    例如,让我们使用样例ldap-login.conf如上配置文件,假定ldap-bind-password.txt中定义的密码是“password”,并假定一个用户名jdoe的用户登录Data Collector。Data Collector以下查询发送到LDAP服务器:

    ldapsearch -LLL -H ldaps://server1:636 -x -D "cn=admin,dc=example,dc=net" -w password -b "ou=users,dc=example,dc=net" "(&(objectClass=inetOrgPerson)(uid=jdoe))"

    如果用户帐户不存在,则Data Collector身份验证失败。如果用户帐户存在,则Data Collector继续进行下一个身份验证步骤。

    注意:当forceBindingLogin设置为true时,Data Collector不会将此查询发送到LDAP服务器。反之,Data Collector将用户凭据传递到LDAP服务器进行身份验证。如果LDAP服务器成功验证了用户帐户,则Data Collector继续进行下一个验证步骤。
  2. 通过将以下查询发送到LDAP服务器,检查用户帐户属于哪个LDAP组:
    ldapsearch -LLL -H ldaps://<hostname>:<port> -x -D <bindDn> -w <bindPassword> -b <roleBaseDn> "(&(objectClass=<roleObjectClass>)(member={dn}))"

    例如,使用ldap-login.conf上面配置的样本文件,Data Collector将以下查询发送到LDAP服务器:

    ldapsearch -LLL -H ldaps://server1:636 -x -D "cn=admin,dc=example,dc=net" -w password -b "ou=groups,dc=example,dc=net" "(&(objectClass=groupOfNames)(member="cn=jdoe,ou=users,dc=example,dc=net"))"

    LDAP服务器返回用户所属的LDAP组的名称。Data Collector使用组名来确定映射到LDAP组的Data Collector角色,如步骤3中所述。将LDAP组映射到Data Collector角色。

Active Directory示例

以下示例显示了Microsoft Active Directory服务器的ldap-login.conf文件。 与OpenLDAP中一样,Data Collector完成与Active Directory中的LDAP用户身份验证相同的步骤。

ldap {
     com.streamsets.datacollector.http.LdapLoginModule required
     debug="true"
     useLdaps="true"
     useStartTLS="false"
     contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
     hostname="*******"
     port="636"
     bindDn="********"
     bindPassword="@ldap-bind-password.txt@"
     forceBindingLogin="true"
     userBaseDn="ou=Department,dc=Company,dc=net"
     userIdAttribute="sAMAccountName"
     userPasswordAttribute=""
     userObjectClass="person"
     userFilter="sAMAccountName={user}"
     roleBaseDn="ou=Department,dc=Company,dc=net"
     roleNameAttribute="cn"
     roleMemberAttribute="member"
     roleObjectClass="group"
     roleFilter="member={dn}";
};

步骤2. 配置到LDAP的安全连接(可选)

您可以选择将Data Collector配置为使用以下方法之一来建立与LDAP服务器的安全连接:

LDAP over SSL(LDAPS)
LDAPS使用SSL加密LDAP连接。LDAPS使用 ldaps://模式。
启动TLS
在连接过程中,StartTLS可以使用TLS包装未加密的连接。这允许同一端口同时处理未加密和加密连接。StartTLS使用ldap:// 模式。

对于这两种加密方法,如果LDAP服务器证书由私有证书颁发机构(CA)签名或不受默认Java信任库信任,则必须创建一个自定义信任库文件或修改默认Java信任库文件的副本以添加CA到文件。然后,将Data Collector配置为使用修改后的信任库文件。

使用相同的过程来配置任一安全方法。

  1. $SDC_CONF/ldap-login.conf文件中,将useLdapsuseStartTLS属性设置为true
    默认情况下,这两个属性均为false,因此Data Collector与LDAP服务器建立未加密的连接。如果将两个属性都设置为true,则useStartTLS优先。
  2. 根据启用的方法,根据需要在ldap-login.conf文件中设置端口属性 :
    • useLdaps-使用端口号进行安全连接,通常为636。
    • useStartTLS-使用LDAP端口号,通常为389。
  3. 如果LDAP服务器证书由私有CA签名或不受默认Java信任库信任,请创建自定义信任库文件或修改默认Java信任库文件的副本以将CA添加到该文件中。然后,将Data Collector配置为使用修改后的信任库文件。

    默认情况下,Data Collector使用$JAVA_HOME/jre/lib/security/cacerts中的Java信任库文件 。如果您的证书是由默认Java信任库文件中包含的CA签名的,则无需创建信任库文件,可以跳过此步骤。

    在这些步骤中,我们展示了如何修改默认的信任库文件,以将其他CA添加到受信任的CA列表中。如果您希望创建自定义信任库文件,请参阅keytool文档

    注意:如果已经将Data Collector配置为使用自定义信任库文件来启用HTTPS,则只需将此附加CA添加到在步骤2中创建的同一修改后的信任库文件中即可。创建信任库文件。
    1. 使用以下命令来设置JAVA_HOME环境变量:
      export JAVA_HOME=<Java home directory>
    2. 使用以下命令来设置SDC_CONF环境变量:
      export SDC_CONF=<Data Collector configuration directory>

      例如,对于RPM安装,请使用:

      export SDC_CONF=/etc/sdc
    3. 使用以下命令将默认的Java truststore文件复制到Data Collector配置目录:
      cp "${JAVA_HOME}/jre/lib/security/cacerts" "${SDC_CONF}/truststore.jks"
    4. 使用以下keytool命令将CA证书导入到信任库文件中:
      keytool -import -file <LDAP certificate> -trustcacerts -noprompt -alias <LDAP alias> -storepass <password> -keystore "${SDC_CONF}/truststore.jks"

      例如:

      keytool -import -file  myLDAPServer.pem -trustcacerts -noprompt -alias MyLDAPServer -storepass changeit -keystore "${SDC_CONF}/truststore.jks"
    5. 在SDC_JAVA_OPTS环境变量中定义以下选项:
      • javax.net.ssl.trustStore– Data Collector计算机上信任库文件的路径。
      • javax.net.ssl.trustStorePassword – 信任库密码。

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

      例如,如下定义选项:

      export SDC_JAVA_OPTS="${SDC_JAVA_OPTS} -Djavax.net.ssl.trustStore=/etc/sdc/truststore.jks -Djavax.net.ssl.trustStorePassword=mypassword -Xmx1024m -Xms1024m -server -XX:-OmitStackTraceInFastThrow"

      或者,为避免在导出命令中保存密码,请将密码保存在文本文件中,然后按如下所示定义truststore password选项: -Djavax.net.ssl.trustStorePassword=$(cat passwordfile.txt)

      然后,确保密码文件仅可由执行导出命令的用户读取。

  4. 重新启动Data Collector以启用更改。

步骤3. 将LDAP组映射到Data Collector角色

Data Collector角色确定用户可以执行的任务。您将LDAP组映射到Data Collector角色。属于LDAP组的经过身份验证的用户帐户可以完成由映射角色确定的任务。

将LDAP组映射到Data Collector角色后,可以将管道权限分配给这些组。管道权限确定每个用户具有的管道访问权限。例如,假设您有一个针对所有管道开发人员的LDAP Developer组。配置Data Collector LDAP属性时,可以将创建者角色分配给Developer组,以便他们可以创建新管道。要允许该组编辑现有管道,请为每个管道配置权限,并为Developer组分配读写权限。有关更多信息,请参见角色和权限。

要将LDAP组映射到Data Collector 角色,请在Data Collector配置文件$SDC_CONF/sdc.properties中,配置 http.authentication.ldap.role.mapping属性。

Data Collector提供以下角色:

角色 描述
admin 执行任何Data Collector任务。可以执行下面列出的所有任务,以及启动和停止Data Collector,查看Data Collector配置,Data Collector指标以及日志信息。使用程序包管理器安装库。生成支持桩。
manager 启动和停止管道,监视管道,配置和重置警报。拍摄,查看和管理快照。
creator 创建和配置管道和警报,预览数据以及监视管道。导入管道。
guest 查看管道和警报以及常规监视信息。导出管道。

您可以将多个角色映射到同一组,反之亦然。使用分号分隔LDAP组,并使用逗号分隔Data Collector角色,如下所示:

<ldap group>:<SDC role>,<additional SDC role>,<additional SDC role>);<ldap group>:<SDC role>,<additional SDC role>... 

完成LDAP组到角色的映射后,请重新启动Data Collector以启用对配置文件的更改。

以下示例将DEV LDAP组映射到创建者角色,将OPS LDAP组映射到管理者角色,将SUPER LDAP组映射到创建者和管理者:

DEV:creator;OPS:manager;SUPER:creator,manager

步骤4.配置多个LDAP服务器(可选)

如果您的组织有多个LDAP服务器,则可以将Data Collector配置为连接到每个服务器。

您完成的配置多个LDAP服务器的步骤取决于以下安装类型:

从压缩包,RPM软件包或Docker Hub安装
要配置多个LDAP服务器,只需在$SDC_CONF/ldap-login.conf中配置其他LDAP服务器的连接信息 。然后,重新启动Data Collector以启用更改。
Cloudera Manager安装
对于Cloudera Manager安装,请在Cloudera Manager中的高级配置代码段(或安全阀)中配置其他LDAP服务器的连接信息。
在Cloudera Manager中,选择StreamSets服务,然后单击 Configuration。选择“使用安全阀来编辑LDAP信息”,然后在ldap.login.conf安全阀的Data Collector高级配置代码段中配置所有LDAP服务器的连接信息。
在安全阀中配置多个LDAP服务器时,Cloudera Manager会忽略ldap.*在“配置”选项卡中为属性输入的所有值。

配置多个LDAP服务器时,请遵循以下准则:

  • 用于登录到Data Collector的LDAP用户帐户必须在至少一台要认证的已配置LDAP服务器中注册。
  • 如果LDAP用户帐户在每个LDAP服务器中属于不同的LDAP组,则在将LDAP组映射到$SDC_CONF/sdc.properties文件 中的Data Collector角色时,请包括所有组名。
  • 如果其他LDAP服务器对bindDN使用不同的密码(连接的根专有名称(DN)),则直接在bindPassword属性中定义密码。
注意:当您配置多个LDAP服务器时,Data Collector尝试按照ldap-login.conf文件中列出的顺序连接到每个服务器 。如果Data Collector在其中一台LDAP服务器中成功验证了用户帐户,则Data Collector 仍将继续与其余LDAP服务器进行验证。这可能会导致Data Collector日志文件包含登录失败错误消息。您可以忽略这些错误消息。

以下示例显示了一个ldap-login.conf文件,该文件配置为连接到两个OpenLDAP服务器server1和server2。每个服务器对bindDN使用相同的密码:

ldap {
  com.streamsets.datacollector.http.LdapLoginModule required
  debug="true"
  useLdaps="false"
  useStartTLS="false"
  contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
  hostname="server1" 
  port="389"                 
  bindDn="*******"
  bindPassword="@ldap-bind-password.txt@"  
  forceBindingLogin="true"
  userBaseDn="ou=People,dc=example,dc=org"
  userIdAttribute="uid"
  userPasswordAttribute="userPassword"
  userObjectClass="inetOrgPerson"
  userFilter="uid={user}"
  roleBaseDn="ou=Groups,dc=example,dc=org"
  roleNameAttribute="cn"
  roleMemberAttribute="member"
  roleObjectClass="groupOfNames"
  roleFilter="member={dn}";


  com.streamsets.datacollector.http.LdapLoginModule required
  debug="true"
  useLdaps="false"
  useStartTLS="false"
  contextFactory="com.sun.jndi.ldap.LdapCtxFactory"
  hostname="server2" 
  port="389"                
  bindDn="*******"
  bindPassword="@ldap-bind-password.txt@"  
  forceBindingLogin="true"
  userBaseDn="ou=People,dc=example,dc=org"
  userIdAttribute="uid"
  userPasswordAttribute="userPassword"
  userObjectClass="inetOrgPerson"
  userFilter="uid={user}"
  roleBaseDn="ou=Groups,dc=example,dc=org"
  roleNameAttribute="cn"
  roleMemberAttribute="member"
  roleObjectClass="groupOfNames"
  roleFilter="member={dn}";
};

步骤5.为MapR阶段启用LDAP认证

要将MapR阶段与配置为使用LDAP身份验证的Data Collector一起使用,必须在配置LDAP身份验证之后执行其他步骤。

Hadoop的MapR发行版使用Java身份验证和授权服务(JAAS)来控制安全功能。$MAPR_HOME/conf/mapr.login.conf文件指定JAAS的配置参数。

Data Collector希望LDAP配置位于JAAS配置文件$SDC_CONF/ldap-login.conf中, 并覆盖 java.security.auth.login.config系统属性以指向该文件。

为避免此冲突,请在$SDC_CONF/ldap-login.conf文件中配置LDAP连接信息后,将$MAPR_HOME/conf/mapr.login.conf文件内容复制到 ldap-login.conf文件中。

例如,使用以下命令将mapr.login.conf文件内容附加到ldap-login.conf文件末尾  :

cat $MAPR_HOME/conf/mapr.login.conf >> $SDC_CONF/ldap-login.conf

配置基于文件的身份验证

如果您的组织不使用LDAP,则将Data Collector配置为使用默认的基于文件的身份验证。

要配置基于文件的身份验证,请执行以下任务:

  1. 配置身份验证属性。
  2. 配置Data Collector用户,组和角色。

步骤1.配置身份验证属性

Data Collector配置文件$SDC_CONF/sdc.properties中配置身份验证属性。

使用基于文件的身份验证时,可以使用“Basic”,“Digest”或“Form”类型。默认情况下, Data Collector使用基于文件的身份验证,并使用表单身份验证类型。

  1. Data Collector配置文件$SDC_CONF/sdc.properties,使能由所述设置基于文件的验证 http.authentication.login.module属性 文件
  2. 在该$SDC_CONF/sdc.properties文件中,通过将http.authentication 属性设置为basic摘要或 form来定义HTTP身份验证类型。
  3. 指定Data Collector是否检查所使用的身份验证类型的关联的realm.properties文件的权限。将http.realm.file.permission.check属性设置为以下值之一:
    • 为true,可确保realm.properties文件仅允许所有者访问。
    • 如果为false,则跳过权限检查。
    在配置Data Collector用户和角色时,将在下一步中使用realm.properties文件。

步骤2.配置用户,组和角色

对于基于文件的身份验证,您配置可以登录到Data Collector的用户。您可以为每个用户帐户分配角色,还可以选择创建组并将其分配给用户帐户。

在属性文件$SDC_CONF/<authentication> -realm.properties中为您使用的身份验证类型配置用户,组和角色。

Data Collector角色确定用户可以执行的任务。Data Collector提供了几个默认用户帐户。您可以更改或删除这些用户帐户,也可以创建新的用户帐户。为了提高安全性,请更改默认用户帐户的密码。

您还可以创建组并将组分配给相关的用户帐户。使用组可以轻松地将管道权限分配给用户组。管道权限确定每个用户具有的管道访问权限。

例如,假设您使用基于文件的身份验证,并且想要创建一个Ops组来管理管道。要解决此问题,当您在身份验证属性文件中配置用户时,您将授予manager角色并为每个操作用户添加Ops组。然后,您编辑他们需要管理的每个管道,并为Ops组分配读取和执行权限。有关更多信息,请参见角色和权限。

对于基于文件的身份验证,Data Collector为以下用户帐户提供相应的角色:

用户登录 角色 任务
admin / admin 管理员 执行任何Data Collector任务。可以执行下面列出的所有任务,以及启动和停止Data Collector,查看Data Collector配置,Data Collector指标以及日志信息。使用程序包管理器安装库。生成支持桩。
manager / manager 经理 启动和停止管道,监视管道,配置和重置警报。拍摄,查看和管理快照。
creator / creator 创作者 创建和配置管道和警报,预览数据以及监视管道。导入管道。
guest / guest 客人 查看管道和警报以及常规监视信息。导出管道。

对于基于文件的身份验证,Data Collector还提供了一个包括所有用户的默认“all”组以及一个“dev”和“test”组。以下示例用户帐户可用于开发和测试用户组:

用户登录 角色
user1 / user1 经理兼创作者 dev
user2 / user2 经理兼创作者 dev
user3 / user3 经理兼创作者 test
user4 / user4 经理兼创作者 test

在属性文件中为您使用的身份验证类型配置用户和组。例如,如果您使用基本身份验证,请使用该 basic-realm.properties文件。

要哈希登录信息,可以使用md5程序,例如Mac OS X上的md5或Linux上的md5sum。例如,您可以使用以下命令对密码进行哈希处理,以使密码不会显示在提示中:

read -s pw && echo "$pw" | md5

对于基本身份验证和表单身份验证,请仅对密码进行哈希处理。例如,当以上命令提示您输入密码时,仅输入密码。

对于摘要式身份验证,请对<user name>:<realm>:<password>的组合进行哈希处理,其中<realm>是身份验证类型。例如,当以上命令提示您输入密码时,输入:

<user name>:<realm>:<password>

如下:

jdoe:digest-realm:JdoePass
  1. 要配置用户和组,请针对所使用的身份验证类型修改属性文件。
    文件名是 $SDC_CONF/<authentication>-realm.properties
  2. 对于每个新用户,使用以下格式添加用户定义:
    <user name>: MD5:<md5-text>, user, <role> [, <additional role>, <additional role>...] [, group:<group>, group:<additional group>...]
    注意:为每个用户分配一个或多个角色。确保在每个用户定义中都包含“用户”。

    例如,以下行定义了一个名为jsmith的用户,分配了创建者角色并分配给Development组:

    jsmith: MD5:6d0258c2440a7d19e916292b231e3190,user,creator,group:Development
  3. 要使新用户可用,请重新启动Data Collector