极狐GitLab 和 LDAP 集成
- Tier: 基础版, 专业版, 旗舰版
- Offering: 私有化部署
极狐GitLab 集成了 LDAP - Lightweight Directory Access Protocol 以支持用户认证。
此集成适用于大多数符合 LDAP 的目录服务器,包括:
- Microsoft Active Directory。
- Apple Open Directory。
- Open LDAP。
- 389 Server。
极狐GitLab 不支持 Microsoft Active Directory Trusts。
通过 LDAP 添加的用户:
- 通常使用一个 licensed seat。
- 可以使用极狐GitLab 用户名或他们的电子邮件和 LDAP 密码进行 Git 身份验证,即使密码认证 已禁用。
当 LDAP 区分名称 (DN) 与现有极狐GitLab 用户相关联时:
- 现有用户首次使用 LDAP 登录极狐GitLab。
- LDAP 电子邮件地址是现有极狐GitLab 用户的主电子邮件地址。如果在极狐GitLab 用户数据库中找不到 LDAP 电子邮件属性,则会创建一个新用户。
如果现有极狐GitLab 用户想要为自己启用 LDAP 登录,他们应该:
- 检查他们的极狐GitLab 电子邮件地址是否与他们的 LDAP 电子邮件地址匹配。
- 使用他们的 LDAP 凭证登录极狐GitLab。
安全
极狐GitLab 验证用户在 LDAP 中是否仍然活跃。
当用户在 LDAP 中被视为不活跃时,他们:
- 完全从目录中删除。
- 位于配置的 base DN 或 user_filter 搜索之外。
- 在 Active Directory 中通过用户帐户控制属性标记为禁用或停用。这意味着属性 userAccountControl:1.2.840.113556.1.4.803 设置了第 2 位。
要检查用户在 LDAP 中是活跃还是不活跃,请使用以下 PowerShell 命令和 Active Directory Module 检查 Active Directory:
powershellGet-ADUser -Identity <username> -Properties userAccountControl | Select-Object Name, userAccountControl
极狐GitLab 检查 LDAP 用户状态:
- 使用任何身份验证提供程序进行登录时。
- 对于使用令牌或 SSH 密钥的活跃网页会话或 Git 请求,每小时一次。
- 使用 LDAP 用户名和密码执行 Git over HTTP 请求时。
- 在 用户同步 期间每天一次。
如果用户在 LDAP 中不再活跃,他们将:
- 注销。
- 置于 ldap_blocked 状态。
- 在重新激活 LDAP 之前无法使用任何身份验证提供程序登录。
安全风险
您应该仅在 LDAP 用户不能:
- 更改他们在 LDAP 服务器上的 mail、email 或 userPrincipalName 属性时使用 LDAP 集成。这些用户可能会接管您极狐GitLab 服务器上的任何帐户。
- 共享电子邮件地址。具有相同电子邮件地址的 LDAP 用户可以共享相同的极狐GitLab 帐户。
配置 LDAP
先决条件:
- 无论您是否使用该电子邮件地址登录,您都必须拥有一个电子邮件地址才能使用 LDAP。
要配置 LDAP,请编辑配置文件中的设置:
-
您的配置文件必须包含以下 基本配置设置:
- label
- host
- port
- uid
- base
- encryption
-
您可以在配置文件中包含以下可选设置:
-
您还可以配置 LDAP 以:
根据您的极狐GitLab 设置,您编辑的文件有所不同:
-
编辑 /etc/gitlab/gitlab.rb:
ruby1gitlab_rails['ldap_enabled'] = true 2gitlab_rails['ldap_servers'] = { 3 'main' => { 4 'label' => 'LDAP', 5 'host' => 'ldap.mydomain.com', 6 'port' => 636, 7 'uid' => 'sAMAccountName', 8 'bind_dn' => 'CN=Gitlab,OU=Users,DC=domain,DC=com', 9 'password' => '<bind_user_password>', 10 'encryption' => 'simple_tls', 11 'verify_certificates' => true, 12 'timeout' => 10, 13 'active_directory' => false, 14 'user_filter' => '(employeeType=developer)', 15 'base' => 'dc=example,dc=com', 16 'lowercase_usernames' => 'false', 17 'retry_empty_result_with_codes' => [80], 18 'allow_username_or_email_login' => false, 19 'block_auto_created_users' => false 20 } 21}
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
配置 LDAP 后,要测试配置,请使用 LDAP 检查 Rake 任务。
基本配置设置
以下基本设置可用:
设置 | 必需 | 类型 | 描述 |
---|---|---|---|
label | 是 | 字符串 | 您的 LDAP 服务器的用户友好名称。它显示在您的登录页面上。示例:'Paris' 或 'Acme, Ltd.' |
host | 是 | 字符串 | 您的 LDAP 服务器的 IP 地址或域名。当定义 hosts 时忽略。示例:'ldap.mydomain.com' |
port | 是 | 整数 | 与您的 LDAP 服务器连接的端口。当定义 hosts 时忽略。示例:389 或 636(用于 SSL) |
uid | 是 | 字符串 | 映射到用户用于登录的用户名的 LDAP 属性。应该是属性,而不是映射到 uid 的值。不影响极狐GitLab 用户名(请参阅 属性部分)。示例:'sAMAccountName' 或 'uid' 或 'userPrincipalName' |
base | 是 | 字符串 | 我们可以在哪里搜索用户的基础。示例:'ou=people,dc=gitlab,dc=example' 或 'DC=mydomain,DC=com' |
encryption | 是 | 字符串 | 加密方法(method 键已被 encryption 取代)。它可以有三种值之一:'start_tls'、'simple_tls' 或 'plain'。simple_tls 对应于 LDAP 库中的“简单 TLS”。start_tls 对应于 StartTLS,不要与常规 TLS 混淆。如果您指定 simple_tls,通常是在端口 636 上,而 start_tls(StartTLS)将在端口 389 上。plain 也在端口 389 上操作。 |
hosts | 否 | 字符串和整数数组 | 打开的连接的主机和端口对数组。每个配置的服务器应该有一个相同的数据集。这不是为了配置多个不同的 LDAP 服务器,而是为了配置故障转移。主机按配置顺序尝试。示例:[['ldap1.mydomain.com', 636], ['ldap2.mydomain.com', 636]] |
bind_dn | 否 | 字符串 | 您绑定的用户的完整 DN。示例:'america\momo' 或 'CN=Gitlab,OU=Users,DC=domain,DC=com' |
password | 否 | 字符串 | 绑定用户的密码。 |
verify_certificates | 否 | 布尔值 | 默认为 true。如果加密方法是 start_tls 或 simple_tls,则启用 SSL 证书验证。如果设置为 false,则不会对 LDAP 服务器的 SSL 证书进行验证。 |
timeout | 否 | 整数 | 默认为 10。设置 LDAP 查询的超时时间(以秒为单位)。这有助于在 LDAP 服务器变得无响应时避免阻塞请求。值为 0 表示没有超时。 |
active_directory | 否 | 布尔值 | 此设置指定 LDAP 服务器是否为 Active Directory LDAP 服务器。对于非 AD 服务器,它跳过 AD 特定查询。如果您的 LDAP 服务器不是 AD,请将此设置为 false。 |
allow_username_or_email_login | 否 | 布尔值 | 默认为 false。如果启用,极狐GitLab 会忽略用户在登录时提交的 LDAP 用户名中的第一个 @ 之后的所有内容。如果您在 ActiveDirectory 上使用 uid: 'userPrincipalName',则必须禁用此设置,因为 userPrincipalName 包含一个 @。 |
block_auto_created_users | 否 | 布尔值 | 默认为 false。为了对极狐GitLab 安装中的计费用户数量进行严格控制,请启用此设置以保持新用户被阻止,直到他们被管理员清除。 |
user_filter | 否 | 字符串 | 过滤 LDAP 用户。遵循 RFC 4515 的格式。极狐GitLab 不支持 omniauth-ldap 的自定义过滤器语法。user_filter 字段语法的示例: - '(employeeType=developer)' - `'(&(objectclass=user)( |
lowercase_usernames | 否 | 布尔值 | 如果启用,极狐GitLab 会将名称转换为小写。 |
retry_empty_result_with_codes | 否 | 数组 | LDAP 查询响应码数组,如果结果/内容为空,则尝试重试操作。对于 Google Secure LDAP,请将此值设置为 [80]。 |
SSL 配置设置
您可以在 tls_options 名称/值对下配置 SSL 配置设置。以下设置都是可选的:
设置 | 描述 | 示例 |
---|---|---|
ca_file | 指定包含 PEM 格式 CA 证书的文件路径,例如,如果您需要内部 CA。 | '/etc/ca.pem' |
ssl_version | 指定 OpenSSL 使用的 SSL 版本,如果 OpenSSL 默认不合适。 | 'TLSv1_1' |
ciphers | 与 LDAP 服务器通信时使用的特定 SSL 密码。 | 'ALL:!EXPORT:!LOW:!aNULL:!eNULL:!SSLv2' |
cert | 客户端证书。 | '-----BEGIN CERTIFICATE----- <REDACTED> -----END CERTIFICATE -----' |
key | 客户端私钥。 | '-----BEGIN PRIVATE KEY----- <REDACTED> -----END PRIVATE KEY -----' |
以下示例说明如何在 tls_options 中设置 ca_file 和 ssl_version:
-
编辑 /etc/gitlab/gitlab.rb:
ruby1gitlab_rails['ldap_enabled'] = true 2gitlab_rails['ldap_servers'] = { 3 'main' => { 4 'label' => 'LDAP', 5 'host' => 'ldap.mydomain.com', 6 'port' => 636, 7 'uid' => 'sAMAccountName', 8 'encryption' => 'simple_tls', 9 'base' => 'dc=example,dc=com' 10 'tls_options' => { 11 'ca_file' => '/path/to/ca_file.pem', 12 'ssl_version' => 'TLSv1_2' 13 } 14 } 15}
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
属性配置设置
极狐GitLab 使用这些 LDAP 属性为 LDAP 用户创建帐户。指定的属性可以是:
- 属性名称作为字符串。例如,'mail'。
- 要按顺序尝试的属性名称数组。例如,['mail', 'email']。
用户的 LDAP 登录是 指定为 uid 的 LDAP 属性。
以下所有 LDAP 属性都是可选的。如果您定义这些属性,必须在 attributes hash 中进行。
设置 | 描述 | 示例 |
---|---|---|
username | 极狐GitLab 帐户将使用的 @username。如果值包含电子邮件地址,则极狐GitLab 用户名为电子邮件地址中 @ 之前的部分。默认为 指定为 uid 的 LDAP 属性。 | ['uid', 'userid', 'sAMAccountName'] |
用户电子邮件的 LDAP 属性。默认为 ['mail', 'email', 'userPrincipalName'] | ['mail', 'email', 'userPrincipalName'] | |
name | 用户显示名称的 LDAP 属性。如果 name 为空,则从 first_name 和 last_name 获取全名。默认为 'cn'。 | 属性 'cn' 或 'displayName' 通常包含全名。或者,您可以通过指定不存在的属性(例如 'somethingNonExistent')强制使用 first_name 和 last_name。 |
first_name | 用户名的 LDAP 属性。当配置的 name 属性不存在时使用。默认为 'givenName'。 | 'givenName' |
last_name | 用户姓的 LDAP 属性。当配置的 name 属性不存在时使用。默认为 'sn'。 | 'sn' |
LDAP 同步配置设置
- Tier: 专业版,旗舰版
- Offering:私有化部署
这些 LDAP 同步配置设置是可选的,除 group_base 在配置 external_groups 时必需:
设置 | 描述 | 示例 |
---|---|---|
group_base | 用于搜索组的基础。所有有效组的 DN 都具有此基础。 | 'ou=groups,dc=gitlab,dc=example' |
admin_group | 包含极狐GitLab 管理员的组的 CN。不是 cn=administrators 或完整 DN。 | 'administrators' |
external_groups | 包含应被视为外部的用户的组 CN 数组。不是 cn=interns 或完整 DN。 | ['interns', 'contractors'] |
sync_ssh_keys | 包含用户公钥 SSH 密钥的 LDAP 属性。 | 'sshPublicKey' 或者如果未设置则为 false |
如果 Sidekiq 配置在与 Rails 服务器不同的服务器上,您必须将 LDAP 配置添加到每个 Sidekiq 服务器,以使 LDAP 同步正常工作。
使用多个 LDAP 服务器
- Tier: 专业版,旗舰版
- Offering:私有化部署
如果您在多个 LDAP 服务器上有用户,您可以配置极狐GitLab 使用它们。要添加其他 LDAP 服务器:
- 复制 main LDAP 配置。
- 使用其他服务器的详细信息编辑每个重复配置。
- 对于每个其他服务器,选择不同的提供者 ID,例如 main、secondary 或 tertiary。使用小写字母和数字。极狐GitLab 使用提供者 ID 将每个用户与特定的 LDAP 服务器关联。
- 对于每个条目,使用唯一的 label 值。这些值用于登录页面上的选项卡名称。
以下示例显示如何配置三个 LDAP 服务器,使用最少配置:
-
编辑 /etc/gitlab/gitlab.rb:
ruby1gitlab_rails['ldap_enabled'] = true 2gitlab_rails['ldap_servers'] = { 3 'main' => { 4 'label' => 'GitLab AD', 5 'host' => 'ad.mydomain.com', 6 'port' => 636, 7 'uid' => 'sAMAccountName', 8 'encryption' => 'simple_tls', 9 'base' => 'dc=example,dc=com', 10 }, 11 12 'secondary' => { 13 'label' => 'GitLab Secondary AD', 14 'host' => 'ad-secondary.mydomain.com', 15 'port' => 636, 16 'uid' => 'sAMAccountName', 17 'encryption' => 'simple_tls', 18 'base' => 'dc=example,dc=com', 19 }, 20 21 'tertiary' => { 22 'label' => 'GitLab Tertiary AD', 23 'host' => 'ad-tertiary.mydomain.com', 24 'port' => 636, 25 'uid' => 'sAMAccountName', 26 'encryption' => 'simple_tls', 27 'base' => 'dc=example,dc=com', 28 } 29}
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
此示例会在登录页面上生成以下选项卡:
- GitLab AD。
- GitLab Secondary AD。
- GitLab Tertiary AD。
设置 LDAP 用户过滤器
要将所有极狐GitLab 访问限制为 LDAP 服务器上的 LDAP 用户子集,请首先缩小配置的 base。但是,如果需要进一步过滤用户,您可以设置 LDAP 用户过滤器。过滤器必须符合 RFC 4515。
-
编辑 /etc/gitlab/gitlab.rb:
rubygitlab_rails['ldap_servers'] = { 'main' => { 'user_filter' => '(employeeType=developer)' } }
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
要限制对 Active Directory 组的嵌套成员的访问,请使用以下语法:
plaintext(memberOf:1.2.840.113556.1.4.1941:=CN=My Group,DC=Example,DC=com)
用户过滤器中嵌套成员的支持不应与 组同步嵌套组 支持混淆。
极狐GitLab 不支持 OmniAuth LDAP 使用的自定义过滤器语法。
在 user_filter 中转义特殊字符
user_filter DN 可以包含特殊字符。例如:
-
逗号:
plaintextOU=GitLab, Inc,DC=gitlab,DC=com
-
开括号和闭括号:
plaintextOU=GitLab (Inc),DC=gitlab,DC=com
这些字符必须按照 RFC 4515 中的文档进行转义。
-
使用 \2C 转义逗号。例如:
plaintextOU=GitLab\2C Inc,DC=gitlab,DC=com
-
使用 \28 转义开括号和使用 \29 转义闭括号。例如:
plaintextOU=GitLab \28Inc\29,DC=gitlab,DC=com
启用 LDAP 用户名小写
根据其配置,某些 LDAP 服务器可以返回大写用户名。这可能会导致一些令人困惑的问题,例如创建带有大写名称的链接或命名空间。
极狐GitLab 可以通过启用配置选项 lowercase_usernames 来自动将 LDAP 服务器提供的用户名转换为小写。默认情况下,此配置选项为 false。
-
编辑 /etc/gitlab/gitlab.rb:
rubygitlab_rails['ldap_servers'] = { 'main' => { 'lowercase_usernames' => true } }
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
禁用 LDAP 网页登录
当首选替代方案(例如 SAML)时,禁止通过网页 UI 使用 LDAP 凭证可能很有用。这允许 LDAP 用于群组同步,同时允许您的 SAML 身份提供商进行额外的检查,例如自定义 2FA。
当禁用 LDAP 网页登录时,用户不会在登录页面上看到 LDAP 选项卡。这不会禁用使用 LDAP 凭证进行 Git 访问。
-
编辑 /etc/gitlab/gitlab.rb:
rubygitlab_rails['prevent_ldap_sign_in'] = true
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
为极狐GitLab 提供智能卡认证
有关使用智能卡与 LDAP 服务器和极狐GitLab 的更多信息,请参阅 智能卡认证。
使用加密凭证
您可以选择使用加密文件存储 LDAP 凭证,而不是将 LDAP 集成凭证以明文形式存储在配置文件中。
先决条件:
- 要使用加密凭证,您必须首先启用 加密配置。
LDAP 的加密配置存在于加密的 YAML 文件中。文件的未加密内容应该是 LDAP 配置中 servers 块的秘密设置的子集。
加密文件支持的配置项有:
- bind_dn
- password
{{< tabs >}}
{{< tab title="Linux package (Omnibus)" >}}
-
如果最初您在 /etc/gitlab/gitlab.rb 中的 LDAP 配置如下所示:
ruby1 gitlab_rails['ldap_servers'] = { 2 'main' => { 3 'bind_dn' => 'admin', 4 'password' => '123' 5 } 6 }
-
编辑加密的秘密:
shellsudo gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
-
输入 LDAP 秘密的未加密内容:
yamlmain: bind_dn: admin password: '123'
-
编辑 /etc/gitlab/gitlab.rb 并删除 bind_dn 和 password 的设置。
-
保存文件并重新配置极狐GitLab:
shellsudo gitlab-ctl reconfigure
{{< /tab >}}
{{< tab title="Helm chart (Kubernetes)" >}}
使用 Kubernetes secret 存储 LDAP 密码。有关更多信息,请阅读 Helm LDAP secrets。
{{< /tab >}}
{{< tab title="Docker" >}}
-
如果最初您在 docker-compose.yml 中的 LDAP 配置如下所示:
yaml1version: "3.6" 2services: 3 gitlab: 4 image: 'gitlab/gitlab-ee:latest' 5 restart: always 6 hostname: 'gitlab.example.com' 7 environment: 8 GITLAB_OMNIBUS_CONFIG: | 9 gitlab_rails['ldap_servers'] = { 10 'main' => { 11 'bind_dn' => 'admin', 12 'password' => '123' 13 } 14 }
-
进入容器,并编辑加密的秘密:
shellsudo docker exec -t <container_name> bash gitlab-rake gitlab:ldap:secret:edit EDITOR=vim
-
输入 LDAP 秘密的未加密内容:
yamlmain: bind_dn: admin password: '123'
-
编辑 docker-compose.yml 并删除 bind_dn 和 password 的设置。
-
保存文件并重启极狐GitLab: