跳至内容

如何使用 LDAP 进行身份验证

Galaxy 可以使用django_auth_ldap 包启用 LDAP 集成,更多关于该插件的信息可以在插件文档中找到:https://django-auth-ldap.readthedocs.io/

需求

一个正在运行且可访问的LDAPAD 服务器。

提示

为了测试目的,您可以使用https://github.com/rroemhild/docker-test-openldap启动一个 OpenLDAP 测试服务器,该服务器运行在10389端口。

检查您的 LDAP 服务器是否正在运行

您需要在本地主机上安装 ldap-utils

# List all users
ldapsearch -H ldap://localhost:10389 -x -b "ou=people,dc=planetexpress,dc=com" -D "cn=admin,dc=planetexpress,dc=com" -w GoodNewsEveryone "(objectClass=inetOrgPerson)"

# List all groups
ldapsearch -H ldap://localhost:10389 -x -b "ou=people,dc=planetexpress,dc=com" -D "cn=admin,dc=planetexpress,dc=com" -w GoodNewsEveryone "(objectClass=Group)"

启用 Galaxy LDAP 集成

以下设置可以添加到/etc/pulp/settings.py或作为以PULP_为前缀的环境变量导出。

注意

当使用 AAP 平台安装程序时,变量设置在安装程序清单文件中的automationhub_ldapldap_extra_settings下。

使用环境变量的示例

提示

要使用/etc/pulp/settings.py设置这些变量,请删除PULP_前缀,并使用正常的 Python 对象(如布尔值、列表和字典)声明,而不是 TOML 格式。

默认情况下,身份验证类和部署模式已设置为以下值,您无需更改它,**只需确认这是您已有的设置。**

PULP_GALAXY_AUTHENTICATION_CLASSES=['galaxy_ng.app.auth.session.SessionAuthentication','rest_framework.authentication.TokenAuthentication','rest_framework.authentication.BasicAuthentication']
PULP_GALAXY_DEPLOYMENT_MODE=standalone

Pulp 容器需要设置此项才能提供与 Docker 注册表兼容的令牌身份验证。https://docs.pulpproject.org/pulp_container/authentication.html

PULP_TOKEN_AUTH_DISABLED=true

必需设置

为了将django_auth_ldap作为第一个身份验证后端包含在内,有一个名为ldap的预设。

PULP_AUTHENTICATION_BACKEND_PRESET=ldap

自定义身份验证后端的顺序

如果您确实要覆盖PULP_AUTHENTICATION_BACKENDS变量,请将PULP_AUTHENTICATION_BACKEND_PRESET设置为custom,如果您需要更改已评估后端的顺序,这可能很有用。

示例
AUTHENTICATION_BACKEND_PRESET='custom'
# arrange the order
AUTHENTICATION_BACKENDS=[
  "django.contrib.auth.backends.ModelBackend",
  "pulpcore.backends.ObjectRolePermissionBackend",
  "galaxy_ng.app.auth.ldap.GalaxyLDAPBackend",
]

必需的特定 django_auth_ldap 设置

提示

根据 LDAP 服务器,以下某些设置可能需要更改。

为了启用 LDAP,以下键是**必需的**

PULP_AUTH_LDAP_SERVER_URI="ldap://ldap:10389"
PULP_AUTH_LDAP_BIND_DN="cn=admin,dc=planetexpress,dc=com"
PULP_AUTH_LDAP_BIND_PASSWORD="GoodNewsEveryone"
PULP_AUTH_LDAP_USER_SEARCH_BASE_DN="ou=people,dc=planetexpress,dc=com"
PULP_AUTH_LDAP_USER_SEARCH_SCOPE="SUBTREE"
PULP_AUTH_LDAP_USER_SEARCH_FILTER="(uid=%(user)s)"
PULP_AUTH_LDAP_GROUP_SEARCH_BASE_DN="ou=people,dc=planetexpress,dc=com"
PULP_AUTH_LDAP_GROUP_SEARCH_SCOPE="SUBTREE"
PULP_AUTH_LDAP_GROUP_SEARCH_FILTER="(objectClass=Group)"
PULP_AUTH_LDAP_GROUP_TYPE_CLASS="django_auth_ldap.config:GroupOfNamesType"

自定义组类型

在某些情况下,您可能希望使用不同的组类型类,例如,如果您想使用MemberDNGroupType,您可以设置它,但也必须按如下方式设置 AUTH_LDAP_GROUP_TYPE_PARAMS

PULP_AUTH_LDAP_GROUP_TYPE_CLASS="django_auth_ldap.config:MemberDNGroupType"
PULP_AUTH_LDAP_GROUP_TYPE_PARAMS={name_attr="cn", member_attr="member"}

注意:上面的示例将数据导出为环境变量,因此它使用 TOML 格式来描述字典对象,如果您将这些设置添加到/etc/pulp/settings.py,则需要将其声明为常规 Python 字典对象。另一个选项是以PULP_AUTH_LDAP_GROUP_TYPE_PARAMS='@json {"name_attr": "cn", "member_attr": "member"}'导出。

可选变量:

PULP_AUTH_LDAP_USER_ATTR_MAP={first_name="givenName", last_name="sn", email="mail"}
# NOTE: the above is formatted as a toml hashmap

PULP_AUTH_LDAP_MIRROR_GROUPS=true
# The above is what enabled group mirroring
# the same variable also accepts a list of groups to mirror
PULP_AUTH_LDAP_MIRROR_GROUPS=['admin_staff', 'ship_crew']

如果您不希望将所有组添加到 Hub,您可以限制镜像哪些组。

PULP_AUTH_LDAP_MIRROR_GROUPS_EXCEPT=['foobar']
# this syncs all groups except the `foobar`

为所有用户要求一个特定组

PULP_AUTH_LDAP_REQUIRE_GROUP='hub_users'
# Only users belonging to this group will be allowed to login

仅镜像 Hub 上已存在的组

PULP_GALAXY_LDAP_MIRROR_ONLY_EXISTING_GROUPS=true

设置为true时,只有 Hub 上已存在的组才会被镜像,这意味着用户可以登录,但并非所有来自 LDAP 的用户组都会被镜像,身份验证后端只会将与 Hub 中现有组名称相同的组映射到用户。

注意

设置此选项后,无论您为这两个变量设置什么值,变量AUTH_LDAP_MIRROR_GROUPS都将自动设置为true,而AUTH_LDAP_MIRROR_GROUPS_EXCEPT将默认为false

将 LDAP 中的组映射到 Django 上的用户属性:

例如:属于 LDAP 中admin_staff的用户在 Django 中是superuser

PULP_AUTH_LDAP_USER_FLAGS_BY_GROUP__is_superuser="cn=admin_staff,ou=people,dc=planetexpress,dc=com"

相同的逻辑可以应用于任何其他属性

PULP_AUTH_LDAP_USER_FLAGS_BY_GROUP__is_staff="cn=ship_crew,ou=people,dc=planetexpress,dc=com"

或者选择性地放在/etc/pulp/setting.py

AUTH_LDAP_USER_FLAGS_BY_GROUP = {
    "is_active": "cn=active,ou=groups,dc=example,dc=com",
    "is_staff": (
        LDAPGroupQuery("cn=staff,ou=groups,dc=example,dc=com")
        | LDAPGroupQuery("cn=admin,ou=groups,dc=example,dc=com")
    ),
    "is_superuser": "cn=superuser,ou=groups,dc=example,dc=com",
}

TLS 验证

# Make ldap to call start_tls on connections
PULP_AUTH_LDAP_START_TLS=true

# If using self signed certificates set this
PULP_GALAXY_LDAP_SELF_SIGNED_CERT=true

日志记录

# Enable LDAP logging handler
PULP_GALAXY_LDAP_LOGGING=true

缓存

# Change the caching lifetime in seconds (for groups and users search)
PULP_AUTH_LDAP_CACHE_TIMEOUT=3600

LDAP 转介

MS 活动目录,但搜索操作可能会导致异常ldap.OPERATIONS_ERROR,诊断消息文本为“为了执行此操作,必须在连接上完成成功的绑定”。或者,Samba 4 AD 返回诊断消息“未经身份验证则无法使用此操作”。

要解决此问题,可以禁用 LDAP 转介查找

PULP_GALAXY_LDAP_DISABLE_REFERRALS=true

以上将在设置中将适当的选项设置为AUTH_LDAP_CONNECTION_OPTIONS


更多设置可以在https://django-auth-ldap.readthedocs.io/en/latest/reference.html#settings找到