极狐GitLab 和 LDAP 集成

极狐GitLab 与 LDAP 集成,以支持用户身份验证。

此集成适用于大多数 LDAP 兼容目录服务器,包括:

  • Microsoft Active Directory。
  • Apple Open Directory。
  • Open LDAP。
  • 389 Server。
note 极狐GitLab 并不支持 Microsoft Active Directory Trusts。

通过 LDAP 添加的用户:

  • 通常使用许可席位
  • 可以使用他们的极狐GitLab 用户名或电子邮件和 LDAP 密码,对 Git 进行身份验证,即使 Git 的密码身份验证已禁用

在以下情况下,LDAP DN 与现有的极狐GitLab 用户相关联:

  • 现有用户首次使用 LDAP 登录极狐GitLab。
  • LDAP 电子邮件地址是现有极狐GitLab 用户的主要电子邮件地址。如果在极狐GitLab 用户数据库中找不到 LDAP 电子邮件属性,则会创建一个新用户。

如果现有的极狐GitLab 用户想要为自己启用 LDAP 登录,他们应该:

  1. 检查他们的极狐GitLab 电子邮件地址是否与他们的 LDAP 电子邮件地址匹配。
  2. 使用他们的 LDAP 凭据登录极狐GitLab。

安全

极狐GitLab 验证了用户是否在 LDAP 中仍然处于活跃状态。

当用户处于以下状态时,会被任务是非活跃:

  • 从目录中完全删除。
  • 驻留在配置的 base DN 或 user_filter 搜索之外。
  • 通过用户账户控制属性在 Active Directory 中标记为禁用或停用。这意味着属性 userAccountControl:1.2.840.113556.1.4.803 设置了第 2 位。

如要检查用户是否在 LDAP 中处于活跃或非活跃状态,用户可以使用如下 PowerShell 命令,并用 Active Directory Module 来检查 Active Directory:

Get-ADUser -Identity <username> -Properties userAccountControl | Select-Object Name, userAccountControl

极狐GitLab 检查 LDAP 用户的状态:

  • 当使用任何认证的提供商进行登录。
  • 对于使用令牌或 SSH 密钥的活跃网络会话或 Git 请求,每小时执行一次。
  • 当使用 LDAP 用户名和密码执行 Git HTTP 请求。
  • 用户同步期间,每天一次。

如果用户在 LDAP 中不再活跃,他们将:

  • 登出。
  • 处于 ldap_blocked 状态。
  • 不能够使用任何认证提供商进行登录,直到他们在 LDAP 被重新激活。

安全风险

您应该只使用 LDAP 集成,如果您的 LDAP 用户不能:

  • 更改他们在 LDAP 服务器上的 mailemailuserPrincipalName 属性。这些用户可能会接管您的极狐GitLab 服务器上的任何账户。
  • 共享电子邮件地址。具有相同电子邮件地址的 LDAP 用户可以共享相同的极狐GitLab 账户。

配置 LDAP

先决条件:

  • 您必须有一个使用 LDAP 的邮件地址,无论你是否使用该电子邮件地址登录。

要配置 LDAP,您可以在配置文件中编辑设置:

你所编辑的文件因你的极狐GitLab 配置而异:

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['ldap_enabled'] = true
    gitlab_rails['ldap_servers'] = {
      'main' => {
        'label' => 'LDAP',
        'host' =>  'ldap.mydomain.com',
        'port' => 636,
        'uid' => 'sAMAccountName',
        'bind_dn' => 'CN=Gitlab,OU=Users,DC=domain,DC=com',
        'password' => '<bind_user_password>',
        'encryption' => 'simple_tls',
        'verify_certificates' => true,
        'timeout' => 10,
        'active_directory' => false,
        'user_filter' => '(employeeType=developer)',
        'base' => 'dc=example,dc=com',
        'lowercase_usernames' => 'false',
        'retry_empty_result_with_codes' => [80],
        'allow_username_or_email_login' => false,
        'block_auto_created_users' => false
      }
    }
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          servers:
            main:
              label: 'LDAP'
              host: 'ldap.mydomain.com'
              port: 636
              uid: 'sAMAccountName'
              bind_dn: 'CN=Gitlab,OU=Users,DC=domain,DC=com'
              password: '<bind_user_password>'
              encryption: 'simple_tls'
              verify_certificates: true
              timeout: 10
              active_directory: false
              user_filter: '(employeeType=developer)'
              base: 'dc=example,dc=com'
              lowercase_usernames: false
              retry_empty_result_with_codes: [80]
              allow_username_or_email_login: false
              block_auto_created_users: false
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

更多详情,可以查看如何为使用 Helm chart 安装的极狐GitLab 示例配置 LDAP

:::TabTitle Docker

  1. Edit docker-compose.yml:

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_enabled'] = true
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'label' => 'LDAP',
                'host' =>  'ldap.mydomain.com',
                'port' => 636,
                'uid' => 'sAMAccountName',
                'bind_dn' => 'CN=Gitlab,OU=Users,DC=domain,DC=com',
                'password' => '<bind_user_password>',
                'encryption' => 'simple_tls',
                'verify_certificates' => true,
                'timeout' => 10,
                'active_directory' => false,
                'user_filter' => '(employeeType=developer)',
                'base' => 'dc=example,dc=com',
                'lowercase_usernames' => 'false',
                'retry_empty_result_with_codes' => [80],
                'allow_username_or_email_login' => false,
                'block_auto_created_users' => false
              }
            }
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      ldap:
        enabled: true
        servers:
          main:
            label: 'LDAP'
            host: 'ldap.mydomain.com'
            port: 636
            uid: 'sAMAccountName'
            bind_dn: 'CN=Gitlab,OU=Users,DC=domain,DC=com'
            password: '<bind_user_password>'
            encryption: 'simple_tls'
            verify_certificates: true
            timeout: 10
            active_directory: false
            user_filter: '(employeeType=developer)'
            base: 'dc=example,dc=com'
            lowercase_usernames: false
            retry_empty_result_with_codes: [80]
            allow_username_or_email_login: false
            block_auto_created_users: false
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

对于不同 LDAP 选项的更多详情,可以在 gitlab.yml.example 中查看 ladp 设置。

::EndTabs

配置 LDAP 后,要测试配置,使用 LDAP 检查 Rake 任务

基本配置

以下配置设置可用:

配置项 说明 是否必须配置 举例
label LDAP 服务器的人性化名称。在登录页面展示。 Yes 'Paris' or 'Acme, Ltd.'
host LDAP 服务器的 IP 地址或域名。当 hosts 被定义时被忽略。 Yes 'ldap.mydomain.com'
port 与 LDAP 服务器连接的端口。类型为整数而非字符串。当 hosts 被定义时被忽略。 Yes 389636 (用于 SSL)
hosts 一个包含用于打开连接的主机和端口对数组。 No [['ldap1.mydomain.com', 636], ['ldap2.mydomain.com', 636]]
uid 用户名的 LDAP 属性。应该是属性,而不是映射到 uid 的值。 Yes 'sAMAccountName''uid''userPrincipalName'
bind_dn 绑定用户的完整 DN。 No 'america\momo''CN=Gitlab,OU=Users,DC=domain,DC=com'
password 绑定用户的密码。 No 'your_great_password'
encryption 加密方法。method 已废弃。 Yes 'start_tls''simple_tls''plain'simple_tls 对应于 LDAP 库中的 “Simple TLS”。start_tls 对应于 StartTLS,不要与常规 TLS 混淆。如果您指定 simple_tls,通常它在端口 636 上,而 start_tls (StartTLS) 将在端口 389 上。plain 也在端口 389 上运行。
verify_certificates 如果加密方法为 start_tlssimple_tls,则启用 SSL 证书验证。如果设置为 false,则不会对 LDAP 服务器的 SSL 证书进行验证。默认为 true。 No boolean
timeout 为 LDAP 查询设置超时时间(以秒为单位)。当 LDAP 服务器无法响应时,有助于阻止请求。0 值表示没有超时(默认值:10 No 1030
active_directory 该设置指定 LDAP 服务器是否为 Active Directory LDAP 服务器。对于非 AD 服务器,会跳过 AD 特定查询。如果您的 LDAP 服务器不是 AD,请将其设置为 false。 No boolean
allow_username_or_email_login 如果启用,系统将忽略用户在登录时提交的 LDAP 用户名中第一个 @ 之后的所有内容。如果您在 ActiveDirectory 上使用 uid: 'userPrincipalName',您必须禁用这个设置,因为 userPrincipalName 包含一个 @ No boolean
block_auto_created_users 为了严格控制计费用户数量,请启用此设置阻止新用户直到他们被管理员清除(默认值:false)。 No boolean
base 搜索用户的基础路径。 Yes 'ou=people,dc=gitlab,dc=example' or 'DC=mydomain,DC=com'
user_filter 过滤 LDAP 用户。格式:RFC 4515 注意:不支持 omniauth-ldap 的自定义过滤器语法。 No user_filter 字段语法的一些示例:

- '(employeeType=developer)'
- '(&(objectclass=user)(|(samaccountname=momo)(samaccountname=toto)))'
lowercase_usernames 如果启用,系统转换用户名称为小写。 No boolean
retry_empty_result_with_codes 如果结果/内容为空,将尝试重试操作时的 LDAP 查询响应代码数组。 No [80]
attributes 映射到 LDAP 的属性哈希,供极狐GitLab 使用(请参阅属性部分)。 No 'attributes' => { 'username' => ['uid'], 'email' => ['mail', 'email'] },

SSL 配置

配置项 说明 是否必须配置 举例
ca_file 例如,当您需要使用内部 CA 时,指定 PEM 格式的 CA 证书文件的路径。 No '/etc/ca.pem'
ssl_version 如果 OpenSSL 默认值不合适,指定 OpenSSL 的 SSL 版本。 No 'TLSv1_1'
ciphers 用于与 LDAP 服务器通信的特定 SSL 密码。 No 'ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2'
cert 客户凭证。 No '-----BEGIN CERTIFICATE----- <REDACTED> -----END CERTIFICATE -----'
key 客户私钥。 No '-----BEGIN PRIVATE KEY----- <REDACTED> -----END PRIVATE KEY -----'

以下指南写明了如何在 tls_options 中设置 ca_filessl_version

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['ldap_enabled'] = true
    gitlab_rails['ldap_servers'] = {
      'main' => {
        'label' => 'LDAP',
        'host' =>  'ldap.mydomain.com',
        'port' => 636,
        'uid' => 'sAMAccountName',
        'encryption' => 'simple_tls',
        'base' => 'dc=example,dc=com'
        'tls_options' => {
          'ca_file' => '/path/to/ca_file.pem',
          'ssl_version' => 'TLSv1_2'
        }
      }
    }
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          servers:
            main:
              label: 'LDAP'
              host: 'ldap.mydomain.com'
              port: 636
              uid: 'sAMAccountName'
              base: 'dc=example,dc=com'
              encryption: 'simple_tls'
              tls_options:
                ca_file: '/path/to/ca_file.pem'
                ssl_version: 'TLSv1_2'
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

更多详情,可以查看如何为使用 Helm chart 安装的极狐GitLab 示例配置 LDAP

:::TabTitle Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_enabled'] = true
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'label' => 'LDAP',
                'host' =>  'ldap.mydomain.com',
                'port' => 636,
                'uid' => 'sAMAccountName',
                'encryption' => 'simple_tls',
                'base' => 'dc=example,dc=com',
                'tls_options' => {
                  'ca_file' => '/path/to/ca_file.pem',
                  'ssl_version' => 'TLSv1_2'
                }
              }
            }
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      ldap:
        enabled: true
        servers:
          main:
            label: 'LDAP'
            host: 'ldap.mydomain.com'
            port: 636
            uid: 'sAMAccountName'
            encryption: 'simple_tls'
            base: 'dc=example,dc=com'
            tls_options:
              ca_file: '/path/to/ca_file.pem'
              ssl_version: 'TLSv1_2'
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

::EndTabs

属性配置

极狐GitLab 使用这些 LDAP 属性来为 LDAP 用户创建账号。指定的属性可能是:

  • 字符型的属性名称。比如,'mail'
  • 一个按顺序尝试的属性名称数组。比如,['mail', 'email']

用户的 LDAP 登录时将 LDAP 属性指定为 uid

以下所有的 LDAP 属性都是可选的。如果您定义了这些属性,您必须在 attributes 哈希中使用它们。

设置 描述 示例
username 将为极狐GitLab 账户配置的 @username。如果值包含邮件地址,则极狐GitLab 用户名是 @,用户名是该电子邮件地址中 @ 符号之前的部分。默认的 LDAP 属性 被指定为 uid ['uid', 'userid', 'sAMAccountName']
email 用户邮箱的 LDAP 属性。默认为 ['mail', 'email', 'userPrincipalName'] ['mail', 'email', 'userPrincipalName']
name 用户展示名称的 LDAP 属性。如果 name 为空,完成的名称取自 first_namelast_name。默认为 'cn' 属性 'cn''displayName' 通常包含完整名称。相反地。或者,你可以通过指定一个不存在的属性(例如 somethingNonExistent)来强制使用 first_namelast_name
first_name 用户名字的 LDAP 属性。当配置的 name 属性不存在时才被使用。默认为 'givenName' 'givenName'
last_name 用户姓名的 LDAP 属性。当配置的 name 属性不存在时才被使用。默认为 'sn' 'sn'

LDAP 同步配置

这些 LDAP 同步配置设置是可选的,但当配置了 external_groups 时,group_base 除外,其它是必需的:

配置项 说明 是否必须配置 举例
group_base 搜索用户组的基础路径。 No 'ou=groups,dc=gitlab,dc=example'
admin_group 包含 GitLab 管理员的组的 CN。注意:不是cn=administrators 或完整的DN。 No 'administrators'
external_groups 包含应被视为外部用户的组 CN 数组。 注意:不是 cn=interns 或完整的 DN。 No ['interns', 'contractors']
sync_ssh_keys 包含用户的公共 SSH 密钥的 LDAP 属性。 No 'sshPublicKey' 或者 false(如果未设置)。
note 如果 Sidekiq 被配置在与 Rails 服务器不同的服务器上,为了使 LDAP 同步正常工作,你还必须将 LDAP 配置添加到每一个 Sidekiq 服务器上。

使用多 LDAP 服务器

如果您在多个 LDAP 服务器上有用户,您可以配置极狐GitLab 使用它们。要添加额外的 LDAP 服务器:

  1. 复制 main LDAP 配置
  2. 使用附加服务器的详细信息编辑每个重复配置。
    • 对于每个额外的服务器,选择不同的提供者 ID,如 mainsecondarytertiary。使用小写字母数字字符。极狐GitLab 使用提供者 ID 将每个用户与特定的 LDAP 服务器相关联。
    • 对于每个条目,使用唯一的 label 值。这些值用于登录页面上的选项卡名称。

以下示例显示了如何使用最少的配置,配置三个 LDAP 服务器:

::Tabs

:::TabTitle Linux package (Omnibus)

  1. Edit /etc/gitlab/gitlab.rb:

    gitlab_rails['ldap_enabled'] = true
    gitlab_rails['ldap_servers'] = {
      'main' => {
        'label' => 'GitLab AD',
        'host' =>  'ad.mydomain.com',
        'port' => 636,
        'uid' => 'sAMAccountName',
        'encryption' => 'simple_tls',
        'base' => 'dc=example,dc=com',
      },
    
      'secondary' => {
        'label' => 'GitLab Secondary AD',
        'host' =>  'ad-secondary.mydomain.com',
        'port' => 636,
        'uid' => 'sAMAccountName',
        'encryption' => 'simple_tls',
        'base' => 'dc=example,dc=com',
      },
    
      'tertiary' => {
        'label' => 'GitLab Tertiary AD',
        'host' =>  'ad-tertiary.mydomain.com',
        'port' => 636,
        'uid' => 'sAMAccountName',
        'encryption' => 'simple_tls',
        'base' => 'dc=example,dc=com',
      }
    }
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          servers:
            main:
              label: 'GitLab AD'
              host: 'ad.mydomain.com'
              port: 636
              uid: 'sAMAccountName'
              base: 'dc=example,dc=com'
              encryption: 'simple_tls'
            secondary:
              label: 'GitLab Secondary AD'
              host: 'ad-secondary.mydomain.com'
              port: 636
              uid: 'sAMAccountName'
              base: 'dc=example,dc=com'
              encryption: 'simple_tls'
            tertiary:
              label: 'GitLab Tertiary AD'
              host: 'ad-tertiary.mydomain.com'
              port: 636
              uid: 'sAMAccountName'
              base: 'dc=example,dc=com'
              encryption: 'simple_tls'
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

:::TabTitle Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_enabled'] = true
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'label' => 'GitLab AD',
                'host' =>  'ad.mydomain.com',
                'port' => 636,
                'uid' => 'sAMAccountName',
                'encryption' => 'simple_tls',
                'base' => 'dc=example,dc=com',
              },
    
              'secondary' => {
                'label' => 'GitLab Secondary AD',
                'host' =>  'ad-secondary.mydomain.com',
                'port' => 636,
                'uid' => 'sAMAccountName',
                'encryption' => 'simple_tls',
                'base' => 'dc=example,dc=com',
              },
    
              'tertiary' => {
                'label' => 'GitLab Tertiary AD',
                'host' =>  'ad-tertiary.mydomain.com',
                'port' => 636,
                'uid' => 'sAMAccountName',
                'encryption' => 'simple_tls',
                'base' => 'dc=example,dc=com',
              }
            }
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      ldap:
        enabled: true
        servers:
          main:
            label: 'GitLab AD'
            host: 'ad.mydomain.com'
            port: 636
            uid: 'sAMAccountName'
            base: 'dc=example,dc=com'
            encryption: 'simple_tls'
          secondary:
            label: 'GitLab Secondary AD'
            host: 'ad-secondary.mydomain.com'
            port: 636
            uid: 'sAMAccountName'
            base: 'dc=example,dc=com'
            encryption: 'simple_tls'
          tertiary:
            label: 'GitLab Tertiary AD'
            host: 'ad-tertiary.mydomain.com'
            port: 636
            uid: 'sAMAccountName'
            base: 'dc=example,dc=com'
            encryption: 'simple_tls'
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

对于不同 LDAP 选项的更多详情,可以在 gitlab.yml.example 中查看 ladp 设置。

::EndTabs

这个示例会产生一个带有以下选项卡的登录页面:

  • 极狐GitLab AD.
  • 极狐GitLab Secondary AD.
  • 极狐GitLab Tertiary AD.

设置 LDAP 用户过滤器

如果您想要 LDAP 服务器上的一部分 LDAP 用户具有访问极狐GitLab 的权限,第一步应该缩小配置的 base 范围。但是,有时必须进一步过滤用户。在这种情况下,您可以设置 LDAP 用户过滤器。过滤器必须符合 RFC 4515

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['ldap_servers'] = {
      'main' => {
        'user_filter' => '(employeeType=developer)'
      }
    }
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          servers:
            main:
              user_filter: '(employeeType=developer)'
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

:::TabTitle Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'user_filter' => '(employeeType=developer)'
              }
            }
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 /home/git/gitlab/config/gitlab.yml

    production: &base
      ldap:
        servers:
          main:
            user_filter: '(employeeType=developer)'
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

::EndTabs

如果要限制对 Active Directory 组的嵌套成员的访问,请使用以下语法:

(memberOf:1.2.840.113556.1.4.1941:=CN=My Group,DC=Example,DC=com)

获取 LDAP_MATCHING_RULE_IN_CHAIN 过滤器的更多信息,请参阅 Microsoft 搜索过滤器语法 文档。

不支持 OmniAuth LDAP 使用的自定义过滤器语法。

转义 user_filter 中的特殊字符

user_filter DN 可以包含特殊字符。例如:

  • 逗号:

    OU=GitLab, Inc,DC=gitlab,DC=com
    
  • 括号:

    OU=GitLab (Inc),DC=gitlab,DC=com
    

    这些字符必须按照 RFC 4515 文档所述进行转义。

  • 使用 \2C 转义逗号。例如:

    OU=GitLab\2C Inc,DC=gitlab,DC=com
    
  • 使用 \28 转义开括号,使用 \29 转义闭括号。例如:

    OU=GitLab \28Inc\29,DC=gitlab,DC=com
    

启用 LDAP 用户名小写

某些 LDAP 服务器,根据其配置可以返回大写的用户名。这可能导致一些令人困惑的问题,比如使用大写名称创建链接或命名空间。

极狐GitLab 可以通过启用 lowercase_usernames 配置项,自动将 LDAP 服务器提供的用户名小写。默认情况下,该配置选项为 false

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['ldap_servers'] = {
      'main' => {
        'lowercase_usernames' => true
      }
    }
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          servers:
            main:
             lowercase_usernames: true
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

:::TabTitle Docker

  1. 编辑 docker-compose.yml

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'lowercase_usernames' => true
              }
            }
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. 编辑 config/gitlab.yaml

    production:
      ldap:
        servers:
          main:
            lowercase_usernames: true
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

::EndTabs

禁用 LDAP web 登录

当首选 SAML 等替代方法时,阻止通过 Web UI 使用 LDAP 凭据会很有用。 这允许 LDAP 用于组同步,同时还允许您的 SAML 身份提供商处理额外的检查,如自定义 2FA。

禁用 LDAP Web 登录后,用户在登录页面上看不到 LDAP 选项。这不会禁用使用 LDAP 凭据进行 Git 访问。

::Tabs

:::TabTitle Linux package (Omnibus)

  1. 编辑 /etc/gitlab/gitlab.rb

    gitlab_rails['prevent_ldap_sign_in'] = true
    
  2. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

:::TabTitle Helm chart (Kubernetes)

  1. 导出 Helm values:

    helm get values gitlab > gitlab_values.yaml
    
  2. 编辑 gitlab_values.yaml

    global:
      appConfig:
        ldap:
          preventSignin: true
    
  3. 保存文件并应用新值:

    helm upgrade -f gitlab_values.yaml gitlab gitlab/gitlab
    

:::TabTitle Docker

  1. Edit docker-compose.yml:

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['prevent_ldap_sign_in'] = true
    
  2. 保存文件并重启极狐GitLab:

    docker compose up -d
    

:::TabTitle Self-compiled (source)

  1. Edit config/gitlab.yaml:

    production:
      ldap:
        prevent_ldap_sign_in: true
    
  2. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

::EndTabs

使用加密凭证

除了将 LDAP 集成凭证以明文形式存储在配置文件中,您可以选择为 LDAP 凭证使用加密文件。

先决条件:

  • 要使用加密凭证,您必须首先启用加密配置

LDAP 的加密配置存在于加密的 YAML 文件中。文件的未加密内容应该是 LDAP 配置中 servers 块的 secret 设置的子集。

加密文件的配置项有:

  • bind_dn
  • password

Omnibus

  1. 如果最初您在 /etc/gitlab/gitlab.rb 中的 LDAP 配置如下所示:

      gitlab_rails['ldap_servers'] = {
        'main' => {
          'bind_dn' => 'admin',
          'password' => '123'
        }
      }
    
  2. 编辑加密的 secret:

    sudo gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
    
  3. 输入 LDAP secret 的未加密内容:

    main:
      bind_dn: admin
      password: '123'
    
  4. 编辑 /etc/gitlab/gitlab.rb 并删除 bind_dnpassword 的设置。
  5. 保存文件并重新配置极狐GitLab:

    sudo gitlab-ctl reconfigure
    

Kubernetes

使用 Kubernetes 密钥存储 LDAP 密码。有关详细信息,请阅读 Helm LDAP secrets

Docker

  1. 如果最初您在 docker-compose.yml 中的 LDAP 配置如下所示:

    version: "3.6"
    services:
      gitlab:
        image: 'gitlab/gitlab-ee:latest'
        restart: always
        hostname: 'gitlab.example.com'
        environment:
          GITLAB_OMNIBUS_CONFIG: |
            gitlab_rails['ldap_servers'] = {
              'main' => {
                'bind_dn' => 'admin',
                'password' => '123'
              }
            }
    
  2. 进入容器,并编辑加密的 secret:

    sudo docker exec -t <container_name> bash
    gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
    
  3. 输入 LDAP secret 的未加密内容:

    main:
      bind_dn: admin
      password: '123'
    
  4. 编辑 docker-compose.yml 并删除 bind_dnpassword 的设置。
  5. 保存文件并重启极狐GitLab:

    docker compose up -d
    

源安装

  1. 如果最初您在 /home/git/gitlab/config/gitlab.yml 中的 LDAP 配置如下所示:

    production:
      ldap:
        servers:
          main:
            bind_dn: admin
            password: '123'
    
  2. 编辑加密的 secret:

    bundle exec rake gitlab:ldap:secret:edit EDITOR=vim RAILS_ENVIRONMENT=production
    
  3. 输入 LDAP secret 的未加密内容:

    main:
     bind_dn: admin
     password: '123'
    
  4. 编辑 /home/git/gitlab/config/gitlab.yml 并删除 bind_dnpassword 的设置。
  5. 保存文件并重启极狐GitLab:

    # For systems running systemd
    sudo systemctl restart gitlab.target
    
    # For systems running SysV init
    sudo service gitlab restart
    

更新 LDAP DN 和电子邮件

当 LDAP 服务器在极狐GitLab 中创建用户时,用户的 LDAP 专有名称 (DN) 作为标识符关联到他们的极狐GitLab 账户。

当用户尝试使用 LDAP 登录时,极狐GitLab 会尝试使用保存在该用户账户中的 DN 来查找该用户。

  • 如果极狐GitLab 通过 DN 找到了用户,并且用户的电子邮件:
    • 与极狐GitLab 账户的电子邮件地址相匹配,极狐GitLab 不会采取任何进一步的操作。
    • 已更改,极狐GitLab 更新其用户电子邮件记录以匹配 LDAP 中的电子邮件。
  • 如果极狐GitLab 无法通过 DN 找到用户,它会尝试通过电子邮件找到用户。如果极狐GitLab:
    • 通过电子邮件查找用户,极狐GitLab 更新存储在用户极狐GitLab 账户中的 DN。这两个值现在都与存储在 LDAP 中的信息匹配。
    • 无法通过电子邮件地址找到用户(DN 电子邮件地址已更改),请查看 User DN and email have changed.

禁用匿名 LDAP 身份验证

极狐GitLab 不支持 TLS 客户端身份验证。在您的 LDAP 服务器上完成这些步骤。

  1. 禁用匿名身份验证。
  2. 启用以下身份验证类型之一:
    • 简单的身份验证。
    • 简单身份验证和安全层 (SASL) 身份验证。

LDAP 服务器中的 TLS 客户端身份验证设置不能是强制性的,并且客户端无法使用 TLS 协议进行身份验证。

从 LDAP 中删除的用户

用户从 LDAP 服务器被删除:

  • 立即被阻止登录极狐GitLab。
  • 不再使用许可证

但是,这些用户可以继续通过 SSH 使用 Git,直到下一次 LDAP 检查缓存运行

要立即删除账户,您可以手动阻止用户

从 LDAP 删除用户

从 LDAP 服务器删除用户:

然而,这些用户还可以继续使用 Git SSH,直到下一次 LDAP 检查缓存运行

要立即删除账号,您可以手动 阻塞用户

更新用户电子邮件地址

当使用 LDAP 登录时,LDAP 服务器上的电子邮件地址被认为是用户的真实来源。更新用户电子邮件地址必须在管理用户的 LDAP 服务器上完成。极狐GitLab 的电子邮件地址将更新于:

更新后的用户以前的电子邮件地址成为次要电子邮件地址,用来保留该用户的提交历史记录。

同步用户和群组

在 LDAP 和极狐GitLab 之间同步用户和群组的更多信息,可以查看 LDAP 同步

从 LDAP 移至 SAML

  1. 添加 SAML 配置至:
  2. 可选。从登录页面禁用 LDAP auth

  3. 可选。要修复此问题,您可以首先移除那些用户的 LDAP 身份识别

  4. 确认他们的用户不能够登录到他们的账号。如果用户无法登录,需要确认用户的 LDAP 是否还在并在需要的时候移除它。如果此问题还在继续,检查日志来排查问题。

  5. 在配置文件中,修改:
    • omniauth_auto_link_usersaml
    • omniauth_auto_link_ldap_userfalse
    • ldap_enabledfalse。你也可以将 LDAP 提供商设置注释掉。

故障排查

查看我们的 LDAP 故障排查