客户端证书身份验证示例

本节介绍如何在 Driverless AI 中配置 客户端证书 身份验证。

客户端证书和 SSL 配置选项

以下选项可在配置客户端证书身份验证时进行指定。

SSL 配置选项

为启用客户端证书身份验证,必须启用 TLS 双向身份验证 (mTLS)。使用以下配置选项来配置 mTLS。请参阅 mTLS 身份验证主题 ,了解更多关于如何启用 mTLS 的信息。

  • ssl_client_verify_mode: 设置客户端验证模式。从以下验证模式中选择:

  • CERT_NONE: 客户端无需提供证书。如果提供证书,则将忽略由此产生的任何验证错误。

  • CERT_OPTIONAL: 客户端无需提供证书。如果提供证书,则将根据已配置的 CA 证书链进行验证。

  • CERT_REQUIRED: 客户端需要提供证书以供验证。请注意,为使 Driverless 能够验证其自身的回调请求,在选择此模式时需要配置 ssl_client_key_filessl_client_crt_file 选项。

  • ssl_ca_file: 指定 证书颁发机构 (CA) 证书文件的路径。当启用客户端身份验证时,此证书将被用于验证客户端证书。如果未指定路径,则将使用系统默认证书对客户端进行验证。

  • ssl_client_key_file: 如果 ssl_client_verify_mode = "CERT_REQUIRED",则需要此文件。指定 Driverless AI 用于对其自身进行身份验证的 私钥 的 HTTPS 设置路径。

  • ssl_client_crt_file: 如果 ssl_client_verify_mode = "CERT_REQUIRED",则需要此文件。指定 Driverless AI 用于对其自身进行身份验证的 客户端证书 的 HTTPS 设置路径。

客户端证书选项

  • auth_tls_crl_file: 用于验证客户端证书的 证书吊销列表 (CRL) 文件的路径。

  • auth_tls_user_lookup: 指定获取用户身份信息的方式。从以下方式中选择:

    • REGEXP_ONLY: 使用 auth_tls_subject_fieldauth_tls_field_parse_regexp 从客户端证书中提取用户名。

    • LDAP_LOOKUP: 使用 LDAP 服务器来获取用户名。(请参阅 LDAP 身份验证示例 一节,了解关于其他 LDAP 身份验证配置选项的信息。)

使用 LDAP_LOOKUP:

  • auth_tls_ldap_server: 指定 LDAP 服务器主机名或 IP 地址。

  • auth_tls_ldap_port: 指定 LDAP 服务器端口号。默认端口号为 389。

  • auth_tls_ldap_use_ssl: 指定当连接至 LDAP 服务器时是启用 (True) 还是禁用 (False) SSL。

  • auth_tls_ldap_tls_file: 指定 SSL 证书路径。

  • auth_tls_ldap_bind_dn: 指定 LDAP 绑定用户的完整可分辨名称。

  • auth_tls_ldap_bind_password: 指定 LDAP 绑定密码。

  • auth_tls_subject_field: 主题字段,可用作用户名或其他值(提供进一步验证)的来源。

  • auth_tls_field_parse_regexp: 用于解析主题字段的正则表达式,以获取用户名或其他提供进一步验证的值。

  • auth_tls_ldap_search_base: 指定在目录信息树 (DIT) 中开始搜索的位置。

  • auth_tls_ldap_search_filter: 指定 LDAP 搜索筛选器,用于在使用 tls_certificate 身份验证方式时通过 LDAP_LOOKUP 查找特定用户。可使用 auth_tls_field_parse_regexp 中的具名捕获组进行替换,从而实现动态构建:

    auth_tls_field_parse_regexp = "\w+ (?P<id>\d+)"
    auth_tls_ldap_search_filter = "(&(objectClass=person)(id={{id}}))
    
  • auth_tls_ldap_username_attribute: 指定用作用户名的 LDAP 记录属性。

  • auth_tls_ldap_authorization_lookup_filter: (可选)指定在查找到用户后执行的其他搜索筛选器。这有助于检查用户是否属于 LDAP 模式中某一特定组的成员,在此模式中,组成员资格定义于组条目中,而非单个用户条目中。(请参阅接下来的 查找筛选器示例 一节,查看关于如何使用该选项的示例。)

  • auth_tls_ldap_authorization_search_base: 指定基本可分辨名称 (Dn),以启动授权查找。当指定 auth_tls_ldap_authorization_lookup_filter 时,需要进行指定此项。

查找筛选器示例

以下示例使用 auth_tls_ldap_authorization_lookup_filter 选项来确定各用户在 LDAP 模式中是否属于 chemists 组的成员,在此模式下,组(组织单位)成员资格定义于组条目中。

# Specify to use email as username
auth_tls_ldap_username_attribute = "mail"
# Specify search string
auth_tls_ldap_search_filter = "(&(objectClass=inetOrgPerson)(uid={{username}}))"
# Specify the base DN to start the search from
auth_tls_ldap_authorization_search_base="dc=example,dc=com"
# Filter the results of the search to determine which users are members of a specific group
auth_tls_ldap_authorization_lookup_filter = "(&(objectClass=groupOfUniqueNames)(uniqueMember=uid={{uid}},dc=example,dc=com)(ou=chemists))"

启用客户端证书身份验证

若要在 Docker 映像中启用客户端证书身份验证,需指定您想要使用的身份验证环境变量。每个变量必须以 DRIVERLESS_AI_ 开头。在以下示例中,启用了客户端证书身份验证,并将 LDAP_LOOKUP 用于 TLS 用户查找方式。

     nvidia-docker run \
       --pid=host \
       --rm \
       --shm-size=256m \
       -p 12345:12345 \
       -u `id -u`:`id -g` \
       -e DRIVERLESS_AI_ENABLED_FILE_SYSTEMS="file,s3,hdfs" \
       -e DRIVERLESS_AI_ENABLE_HTTPS="true" \
       -e DRIVERLESS_AI_SSL_KEY_FILE="/etc/pki/dai-server.key" \
       -e DRIVERLESS_AI_SSL_CRT_FILE="/etc/pki/dai-server.crt" \
       -e DRIVERLESS_AI_SSL_CA_FILE="/etc/pki/ca.crt" \
       -e DRIVERLESS_AI_SSL_CLIENT_VERIFY_MODE="CERT_REQUIRED" \
       -e DRIVERLESS_AI_SSL_CLIENT_KEY_FILE="/etc/pki/dai-self.key" \
       -e DRIVERLESS_AI_SSL_CLIENT_CRT_FILE="/etc/pki/dai-self.cert" \
       -e DRIVERLESS_AI_AUTHENTICATION_METHOD="tls_certificate" \
       -e DRIVERLESS_AI_AUTH_TLS_SUBJECT_FIELD="CN" \
       -e DRIVERLESS_AI_AUTH_TLS_CRL_FILE="/etc/pki/crl.pem" \
       -e DRIVERLESS_AI_AUTH_TLS_FIELD_PARS_REGEXP="(?P<di>.*)" \
       -e DRIVERLESS_AI_AUTH_TLS_USER_LOOKUP="LDAP_LOOKUP" \
       -e DRIVERLESS_AI_LDAP_SERVER="ldap.forumsys.com" \
       -e DRIVERLESS_AI_LDAP_BIND_DN="cn=read-only-admin,dc=example,dc=com" \
       -e DRIVERLESS_AI_LDAP_BIND_PASSWORD="password" \
       -e DRIVERLESS_AI_LDAP_SEARCH_BASE="dc=example,dc=com" \
       -e DRIVERLESS_AI_LDAP_USER_NAME_ATTRIBUTE="uid" \
       -e DRIVERLESS_AI_LDAP_SEARCH_FILTER="(&(objectClass=inetOrgPerson)(uid={{id}}))" \
       -e DRIVERLESS_AI_AUTH_TLS_LDAP_AUTHORIZATION_SEARCH_BASE="dc=example,dc=com" \
       -e DRIVERLESS_AI_AUTH_TLS_LDAP_AUTHORIZATION_LOOKUP_FILTER="(&(objectClass=groupOfUniqueNames)(uniqueMember=uid={{uid}},dc=example,dc=com)(ou=chemists))" \
       -v `pwd`/data:/data \
       -v `pwd`/log:/log \
       -v `pwd`/license:/license \
       -v `pwd`/tmp:/tmp \
       h2oai/dai-centos7-x86_64:1.10.1-cuda11.2.2.xx