Seafile Pro 版本对接 LDAP

Seafile 是如何管理 LDAP 用户的

Seafile 中的用户分为两类:

Seafile 会自动从内部数据库和 LDAP 中查找用户,只要用户存在于任何一个来源,他们都能登录。

基本的 LDAP/AD 集成配置

Seafile 要求 LDAP/AD 服务器中每个用户都有一个唯一的 ID。这个 ID 只能使用邮箱地址格式。一般来说,AD 有两个用户属性可以用作 Seafile 用户的 ID:

集成配置

把下面的配置添加到 seahub_settings.py

# 基础配置

ENABLE_LDAP = True
LDAP_SERVER_URL = 'ldap://192.168.0.125'     # LDAP 服务器的地址 URL
LDAP_BASE_DN = 'ou=test,dc=seafile,dc=ren'   # LDAP 服务器中可以登陆Seafile的用户的根节点
LDAP_ADMIN_DN = 'administrator@seafile.ren'  # 用于查询 LDAP 服务器中信息的管理员的 DN
LDAP_ADMIN_PASSWORD = 'Hello@123'            # LDAP_ADMIN_DN 对应的用户的密码
LDAP_PROVIDER = 'ldap'                       # 标识用户的来源,默认为 'ldap'
LDAP_LOGIN_ATTR = 'userPrincipalName'        # 用于登录 Seafile 的用户属性,可以为mail或userPrincipalName
LDAP_CONTACT_EMAIL_ATTR = ''                 # 用户的联系邮箱属性 (contact_email)
LDAP_USER_ROLE_ATTR = ''                     # 用户的角色属性
LDAP_USER_FIRST_NAME_ATTR = 'givenName'      # 用于同步用户的 name
LDAP_USER_LAST_NAME_ATTR = 'sn'              # 用于同步用户的 name
LDAP_USER_NAME_REVERSE = False               # 用于同步用户的 name
LDAP_FILTER = 'memberOf=CN=testgroup,OU=test,DC=seafile,DC=ren'  # 额外的过滤条件,符合过滤条件的用户可以登陆,否则无法登陆

关于如何选定 LDAP_BASE_DN 和 LDAP_ADMIN_DN 的一些技巧:

设置LDAP/AD用户同步(可选)

在Seafile Pro中,除了在用户登录时将用户导入到内部数据库之外,还可以配置Seafile来定期将用户信息从LDAP/AD服务器同步到内部数据库。

同步完成后,您可以在它的个人资料页上看到用户的全名、部门和电子邮件。

Active Directory 用户同步配置

把以下配置添加到 seahub_settings.py 里:

# 基础配置项目
ENABLE_LDAP = True
.......
# LDAP 用户信息同步配置项目
LDAP_SYNC_INTERVAL = 60      # LDAP定时同步任务的周期,单位为分钟
ENABLE_LDAP_USER_SYNC = True             # 是否允许同步用户
LDAP_USER_OBJECT_CLASS = 'person'        # 用户对象的 class 名字
LDAP_DEPT_ATTR = ''                      # LDAP 用户的部门属性
LDAP_UID_ATTR = ''                       # LDAP 用户的 login_id 属性
LDAP_AUTO_REACTIVATE_USERS = True        # 是否自动激活已禁用的用户
LDAP_USE_PAGED_RESULT = False            # 是否使用结果分页扩展,LDAP 协议 v3 支
IMPORT_NEW_USER = True                   # 同步用户信息时,是否导入新用户
ACTIVATE_USER_WHEN_IMPORT = False        # 导入新用户时,是否激活用户
DEACTIVE_USER_IF_NOTFOUND = False        # 同步时,是否删除LDAP中不存在的用户
ENABLE_EXTRA_USER_INFO_SYNC = True       # 是否同步 login_id、contact_email 等用户信息

在不激活用户的情况下导入用户

默认情况下,使用上述配置导入的用户将被自动激活。对于一些拥有大量用户的组织,它们可能希望导入用户信息(例如:用户全名),而不自动激活导入的用户,因为激活所有导入的用户将需要AD/LDAP中所有用户的许可证。

Seafile为这种情况提供了一组选项:

ACTIVATE_USER_WHEN_IMPORT = False    # Seafile 导入用户为未激活用户
ACTIVATE_AFTER_FIRST_LOGIN = True    # 第一次登录到 Seafile 时,该选项将自动激活用户

使用这些配置,导入的用户可以被正常搜索到,但是在用户首次登录之前不会占用license中的授权数。

重新激活已禁用的用户

当您设置“DEACTIVE_USER_IF_NOTFOUND”选项时,当在LDAP服务器中找不到用户时,该用户将被停用。默认情况下,即使此用户重新出现在LDAP服务器中,也不会自动重新激活它,这是为了防止自动重新激活被系统管理员手动停用的用户,这个选项适用于企业版本7.1.8+版本。

但是,有时需要自动重新激活此类用户,您可以在seahub_settings.py 添加以下选项:

LDAP_AUTO_REACTIVATE_USERS = True    # 默认是false

手动触发 AD/LDAP 用户信息同步

在配置完成后,你可以手工执行同步命令来测试配置是否有效。

cd seafile-server-latest
./pro/pro.py ldapsync 

同步 AD 群组 (可选)

工作原理

导入或同步的过程是从 LDAP 服务器上的组映射到 seafile 的内部数据库中的组。这个过程是单向的。

有两种同步模式:

配置

在启用 LDAP 组同步之前,您应该已配置 LDAP 身份验证,有关详细信息,请参阅本文章开头:基本的 LDAP/AD 集成配置

以下是 LDAP 组同步相关选项:

ENABLE_LDAP_GROUP_SYNC = True            # 是否允许同步群组
LDAP_GROUP_OBJECT_CLASS = 'group'        # 这是用于搜索组对象的类的名称,在 Active Directory 中,通常是“group”
                                         # 在 OpenLDAP 或其他服务器中,您可以使用“groupOfNames”、“groupOfUniqueNames”或“posixGroup”、这取决于您的LDAP服务器。
                                         # 默认值是“group”。
LDAP_GROUP_MEMBER_ATTR = 'member'        # 在加载组的成员时使用的属性字段
                                         # 对于大多数directory服务器,属性是“member”,这也是默认值        
                                         #  对于"posixGroup",它应该被设置为"memberUid"。
LDAP_USER_ATTR_IN_MEMBERUID = 'uid'      # LDAP_GROUP_MEMBER_ATTR 选项中的用户属性集
LDAP_GROUP_UUID_ATTR = 'objectGUID'      # 用于唯一识别 LDAP 中的群组
LDAP_GROUP_FILTER = ''                   # 群组同步过滤条件
LDAP_USE_GROUP_MEMBER_RANGE_QUERY = False # 当一个组包含太多成员时,AD将只返回其中的一部分。
                                          # 将此选项设置为 TRUE 可使 LDAP 同步适用于大型组。
DEL_GROUP_IF_NOT_FOUND = False           # 同步时,是否删除LDAP中不存在的群组
LDAP_SYNC_GROUP_AS_DEPARTMENT = False    # 是否将群组同步为Seafile中的顶级部门
LDAP_DEPT_NAME_ATTR = ''                 # 用以同步部门名称的属性

查找群组的根节点是 seahub_settings.py 设置的 “LDAP_BASE_DN”。

一些LDAP服务器,例如 Active Directory,允许一个组作为另一个组的成员。这称为“组嵌套”。如果我们在A组中找到一个嵌套的B组,我们应该递归地将B组中的所有成员添加到A组中,并且B组仍然应该导入为一个独立的群组。也就是说,B组的所有成员也是A组的成员。

在某些LDAP服务器(如OpenLDAP)中,通常使用 "Posix" 组来存储组成员关系。如果要导入 "Posix" 组作为 Seafile 的群组,请将 LDAP_GROUP_OBJECT_CLASS选项设置为 "posixGroup"。LDAP中的 "posixGroup" 对象通常包含了成员 UID 的多值属性列表。可以使用 LDAP_GROUP_MEMBER_ATTR 选项设置此属性的名称。默认情况下是 "MemberUid"。"MemberUid" 属性的值是一个可以用来标识用户的ID,它对应于用户对象中的属性。这个ID属性的名称通常是 "uid",但是可以通过 LDAP_USER_ATTR_IN_MEMBERUID 选项设置。注意,"posixGroup" 不支持嵌套组。

同步OU为Seafile组织架构

Seafile 中的“部门”是一个特殊的组,除了可以作为群组进行处理之外,还有两个“部门”特有的新的关键特性:

Seafile 支持从AD/LDAP到“部门”的OU(Organizational Units)同步,同步过程保持了OU的层次结构。

从OU中导入“部门”的同步选项:

LDAP_SYNC_DEPARTMENT_FROM_OU = True      # 是否同步OU为Seafile部门
LDAP_DEPT_NAME_ATTR = 'description'      # 用以同步部门名称的属性
LDAP_CREATE_DEPARTMENT_LIBRARY = False   # 将群组同步为顶级部门时,是否自动创建带有群组名称的部门资料库
LDAP_DEPT_REPO_PERM = 'rw'               # 设置部门资料库的权限,默认权限为'rw'
LDAP_DEFAULT_DEPARTMENT_QUOTA = -2       # 为部门设置空间配额(单位为MB),默认为无限制
DEL_DEPARTMENT_IF_NOT_FOUND = False      # 同步时,是否删除LDAP中不存在的部门

周期性同步和手动同步

周期性同步不会在您重新启动seafile server后立即发生。它在第一个同步间隔之后被调度。例如,如果您将同步间隔设置为30分钟,那么第一次自动同步将在服务重新启动30分钟后发生。要立即同步,您需要手动触发它。

运行同步后,您应该在日志 logs/seafevents.log 中看到如下所示的日志信息。并且在系统管理页面中应该能看到那些组。

[2023-03-30 18:15:05,109] [DEBUG] create group 1, and add dn pair CN=DnsUpdateProxy,CN=Users,DC=Seafile,DC=local<->1 success.
[2023-03-30 18:15:05,145] [DEBUG] create group 2, and add dn pair CN=Domain Computers,CN=Users,DC=Seafile,DC=local<->2 success.
[2023-03-30 18:15:05,154] [DEBUG] create group 3, and add dn pair CN=Domain Users,CN=Users,DC=Seafile,DC=local<->3 success.
[2023-03-30 18:15:05,164] [DEBUG] create group 4, and add dn pair CN=Domain Admins,CN=Users,DC=Seafile,DC=local<->4 success.
[2023-03-30 18:15:05,176] [DEBUG] create group 5, and add dn pair CN=RAS and IAS Servers,CN=Users,DC=Seafile,DC=local<->5 success.
[2023-03-30 18:15:05,186] [DEBUG] create group 6, and add dn pair CN=Enterprise Admins,CN=Users,DC=Seafile,DC=local<->6 success.
[2023-03-30 18:15:05,197] [DEBUG] create group 7, and add dn pair CN=dev,CN=Users,DC=Seafile,DC=local<->7 success.

手动触发 LDAP 同步:

 cd seafile-server-lastest
 ./pro/pro.py ldapsync

LDAP/AD 集成高级配置选项

使用多个 BASE DN

当您想把公司中多个 OU 加入 Seafile 中时,您可以使用在配置中指定多个 BASE DN。您可以在"BASE"配置中指定一个 DN 的列表,标识名由";"分开, 比如: cn=developers,dc=example,dc=com;cn=marketing,dc=example,dc=com

用户过滤选项

当你的公司组织庞大,但是只有一小部分人使用 Seafile 的时候,搜索过滤器(Search filter)会很有用处. 过滤器可以通过修改"FILTER"配置来实现,例如,在 seahub_settings.py配置中增加以下语句:

FILTER = memberOf=CN=group,CN=developers,DC=example,DC=com

请注意上面的示例只是象征性的简介, memberOf只有在活动目录(Active Directory)中才适用。

把 Seafile 用户限定在 AD 的一个组中

您可以利用用户过滤器选项来只允许 AD 某个组中的用户使用 Seafile。

  1. 首先,您需要找到这个组的 DN。我们再次使用 dsquery 命令。比如,如果组的名字是 'seafilegroup',那么您可以运行 dsquery group -name seafilegroup

  2. 然后您可以把一下配置加入seahub_settings.py 中:

LDAP_FILTER = 'memberOf={output of dsquery command}'

使用 TLS 连接到 LDAP 服务器

如果您的 LDAP 服务支持 TLS 连接,则可以配置为 ldaps 协议的访问地址,以使用 TLS 连接到 LDAP 服务,例如:LDAP_SERVER_URL

LDAP_SERVER_URL = 'ldaps://192.168.0.1:636/'

使用结果分页扩展(paged results extension)

LDAP 协议 v3 支持一个称为 "paged results" 的扩展功能,当您在 LDAP 中有大量用户的时候,这个选项能够大大提高列出用户的速度。而且,AD 限制了单次请求中返回的用户条目数量,您需要启用这个选项才能避免查询错误。

在 Seafile 企业版中,在seahub_settings.py 配置中加入以下设置:

LDAP_USE_PAGED_RESULT = True

配置集成多个ldap服务器

Seafile Pro版本支持同时对接多个ldap服务器,多ldap服务器意味着,当获取或搜索ldap用户时,它将迭代所有配置的ldap服务器,直到找到匹配的ldap服务器;在列出所有ldap用户时,它将迭代所有ldap服务器以获得所有用户;对于LDAP同步,它将所有配置 ldap 服务器中的所有用户/组信息同步到seafile。

目前,仅支持两个 LDAP 服务器。​

把下列选项添加到seahub_settings.py 配置中:

# Basic config options
ENABLE_LDAP = True
......
# Multi ldap config options
ENABLE_MULTI_LDAP_1 = True
MULTI_LDAP_1_SERVER_URL = 'ldap://192.168.0.2'
MULTI_LDAP_1_BASE_DN = 'ou=test,dc=seafile,dc=top'
MULTI_LDAP_1_ADMIN_DN = 'administrator@example.top'
MULTI_LDAP_1_ADMIN_PASSWORD = 'Hello@123'
MULTI_LDAP_1_PROVIDER = 'ldap1'
MULTI_LDAP_1_LOGIN_ATTR = 'userPrincipalName'
......

注意:所有LDAP服务器仍然使用一些共享配置选项,如下所示:

# Common basic config options
LDAP_USER_FIRST_NAME_ATTR = 'givenName'      # For sync user's first name
LDAP_USER_LAST_NAME_ATTR = 'sn'              # For sync user's last name
LDAP_USER_NAME_REVERSE = False               # Whether to reverse the user's first and last name
# Common user sync options
LDAP_SYNC_INTERVAL = 60
IMPORT_NEW_USER = True                   # Whether to import new users when sync user
ACTIVATE_USER_WHEN_IMPORT = True         # Whether to activate the user when importing new user
DEACTIVE_USER_IF_NOTFOUND = False        # Set to "true" if you want to deactivate a user 
                                         # when he/she was deleted in AD server.
ENABLE_EXTRA_USER_INFO_SYNC = True       # Whether to enable sync of additional user information,
                                         # including user's full name, department, and Windows login name, etc.
# Common group sync options
DEL_GROUP_IF_NOT_FOUND = False           # Set to "true", sync process will delete the group if not found it in LDAP server.
DEL_DEPARTMENT_IF_NOT_FOUND = False      # Set to "true", sync process will deleted the department if not found it in LDAP server.

LDAP 角色导入

Seafile Pro 版本支持从 LDAP 或 Active Directory 同步角色

要启用此功能,请将以下选项添加到 seahub_settings.py配置文件中:

LDAP_USER_ROLE_ATTR = 'title'

LDAP_USER_ROLE_ATTR是在 LDAP 中配置角色的属性字段,我们提供了一个用户定义的函数来映射角色:在conf/下创建并对其进行编辑,如下所示:

# -*- coding: utf-8 -*-
def ldap_role_mapping(role):
    if 'staff' in role:
        return 'Staff'
    if 'guest' in role:
        return 'Guest'
    if 'manager' in role:
        return 'Manager'

您可以重写此函数(在 python 中)以制定自己的映射规则,如果文件或函数不存在,则将同步LDAP_USER_ROLE_ATTR中的所有角色。

Last modified by Daniel Pan, 2024-03-25

Seafile 是如何管理 LDAP 用户的
基本的 LDAP/AD 集成配置
设置LDAP/AD用户同步(可选)
Active Directory 用户同步配置
在不激活用户的情况下导入用户
重新激活已禁用的用户
手动触发 AD/LDAP 用户信息同步
同步 AD 群组 (可选)
工作原理
配置
同步OU为Seafile组织架构
周期性同步和手动同步
LDAP/AD 集成高级配置选项
使用多个 BASE DN
把 Seafile 用户限定在 AD 的一个组中
使用 TLS 连接到 LDAP 服务器
使用结果分页扩展(paged results extension)
配置集成多个ldap服务器
LDAP 角色导入