如何限制 LDAP 组对 Gitlab 的访问(使用 LDAP 搜索过滤器)?

如何限制 LDAP 组对 Gitlab 的访问(使用 LDAP 搜索过滤器)?

我有一个正在运行的 Gitlab CE 安装,并且使用 LDAP 身份验证。现在我想根据组成员身份限制访问权限。

该选项user_filter似乎是可行的。但是,我似乎无法让任何人根据组成员身份登录。

我尝试的是这个(gitlabaccess作为应该允许登录的组):

user_filter: '(&(objectclass=group)(samaccountname=gitlabaccess))'

或者:

user_filter: '(memberOf=cn=gitlabaccess,DC=my,DC=domain,DC=com)'

文档说明以下内容但它也不起作用而且我不知道数字应该是多少:

user_filter: '(memberOf:1.2.840.113556.1.4.1941:=cn=gitlabaccess,DC=my,DC=domain,DC=com)'

特定用户的工作方式如下:

user_filter: '(&(objectclass=user)(samaccountname=jon.doe))'

从 omnibus 包安装的 Gitlab CE 版本 9.5.5。

如何根据 LDAP 组成员身份限制对 Gitlab 的访问?

答案1

我明白了。您需要指定包含所有 OU 的组的完整路径。在我的例子中,这是:

user_filter: '(&(objectClass=user)(memberOf=CN=gitlabaccess,OU=mail-distribution-groups,OU=staff,DC=my,DC=domain,DC=com))'

正如评论,上述查询仅返回该组的直接成员。如果您还想包括嵌套组的成员,则必须像这样:1.2.840.113556.1.4.1941:添加:memberOf

user_filter: '(&(objectClass=user)(memberOf:1.2.840.113556.1.4.1941:=CN=gitlabaccess,OU=mail-distribution-groups,OU=staff,DC=my,DC=domain,DC=com))'

如果您想添加特定用户,请使用以下命令:

user_filter: '(|(&(objectClass=user)(memberOf=CN=gitlabaccess,OU=mail-distribution-groups,OU=staff,DC=my,DC=domain,DC=com))(&(objectClass=user)(sAMAccountName=jon.doe)))'

答案2

  1. openLDAP 的解决方案:

创建一个具有 groupOfUniqueNames 而不是 groupOfNames 的组,因为默认情况下只有 groupOfUniqueNames 具有 memberOf 属性。

答案3

RHEL 9 和 GitLab 15.8.1 CE/EE 上的 FreeIPA 解决方案 (2023)

在 GitLab 中为 FreeIPA 设置 LDAP 过滤器的步骤与在 GitLab 中为 Active Directory 设置 LDAP 过滤器的步骤不同。

设置如下:

  • FreeIPA 托管于:
    • dc1.mydomain.com
  • GitLab 托管于:
    • gitlab.mydomain.com

执行以下步骤:

  • 创建用于访问 GitLab 的 FreeIPA 用户
    • 用户名:“快乐开发者”
    • 名字: Happy
    • 姓氏:开发人员
  • 在 FreeIPA 中创建组以访问 Gitlab
    • 组名:ug_gitlab_mydomain_com_login_ldap
  • 在 FreeIPA 中将用户“Happy Developer”添加到用户组“ug_gitlab_mydomain_com_login_ldap”
  • 在 FreeIPA 中创建用户,用于 gitlab.mydomain.com 的 LDAP 绑定
    • 用户名:ldap.gitlab.mydomain.com
    • 名字:ldap
    • 姓氏:gitlab.mydomain.com
    • 密码:字母数字,无特殊符号,如 $ < /

现在,从命令行检查组成员身份:

ldapsearch -b "dc=mydomain,dc=com" -s sub "(&(objectclass=person)(memberof=cn=ug_gitlab_mydomain_com_login_ldap,cn=groups,cn=accounts,dc=mydomain,dc=com))" -D "uid=ldap.gitlab.mydomain.com,cn=users,cn=accounts,dc=mydomain,dc=com" -W

您应该会看到一个小组成员,“快乐的开发者”。

现在更改 gitlab 配置:

sudo nano /etc/gitlab.gitlab.rb

找到包含 LDAP 配置的部分并添加以下文本:

gitlab_rails['ldap_enabled'] = true

gitlab_rails['ldap_servers'] = YAML.load <<-'EOS'
   main: # 'main' is the GitLab 'provider ID' of this LDAP server
     label: 'My LDAP'
     host: 'dc1.mydomain.com'
     port: 636
     uid: 'uid'
     bind_dn: 'uid=ldap.myhost.mydomain.com,cn=users,cn=accounts,dc=mydomain,dc=com'
     password: 'password'
     encryption: 'simple_tls' # "start_tls" or "simple_tls" or "plain"
     verify_certificates: false
     smartcard_auth: false
     active_directory: false
     allow_username_or_email_login: false
     lowercase_usernames: false
     block_auto_created_users: false
     base: 'dc=mydomain,dc=com'
     user_filter: 'memberof=cn=ug_gitlab_mydomain_com_login_ldap,cn=groups,cn=accounts,dc=mydomain,dc=com'
     ## EE only
     group_base: ''
     admin_group: ''
     sync_ssh_keys: false
EOS

重新配置并重启 GitLab,检查过滤结果:

sudo gitlab-ctl reconfigure
sudo gitlab-ctl restart
sudo gitlab-rake gitlab:ldap:check

您应该能够看到授权登录的用户列表

注意:另一个 user_filter 是:

user_filter: '(&(objectclass=person)(memberof=cn=ug_gitlab_mydomain_com_login_ldap,cn=groups,cn=accounts,dc=mydomain,dc=com))'

注意:请确保您执行其他步骤,以通常的方式验证 LDAP 连接的 TLS 设置。

我不确定这是否支持嵌套组支持。但目前,对于大多数 FreeIPA 用户来说,这应该是一个很好的起点。

相关内容