Seafile 中的用户分为两类:
保存在 Seafile 内部数据库中的用户,这些用户关联了一些属性,比如是否管理员,是否已激活等。这类用户又分为两个子类别:
系统管理员直接创建的用户,这些用户保存在 ccnet 数据库里面的 EmailUser 表中。
由 LDAP 导入的用户,当 LDAP 里的用户第一次登录 Seafile 时,Seafile 会把该用户的信息导入到内部数据库。
在 LDAP 中存在的用户,管理员可以通过配置文件指定 LDAP 中可以使用 Seafile 服务的用户范围,这些用户在第一次登录时被导入到 Seafile 数据库 中,Seafile 只会直接操作存在数据库中的用户。
Seafile 会自动从内部数据库和 LDAP 中查找用户,只要用户存在于任何一个来源,他们都能登录。
Seafile 要求 LDAP/AD 服务器中每个用户都有一个唯一的 ID。这个 ID 只能使用邮箱地址格式。一般来说,AD 有两个用户属性可以用作 Seafile 用户的 ID:
email 地址:一般的机构都会给每个成员分配唯一的 email 地址,所以这是最常见配置。
UserPrincipalName (UPN):这个 AD 赋予给每个用户的一个唯一 ID。它的格式为 用户登录名@域名
。尽管这个不是真实的 email 地址,但是它也能作为 Seafile 的用户 ID。如果机构的用户没有 email 地址,可以使用这个属性。
把下面的配置添加到 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 的一些技巧:
要确定您的 BASE_DN 属性,您首先需要打开域管理器的图形界面,并浏览您的组织架构。
如果您想要让系统中所有用户都能够访问 Seafile,您可以用 'cn=users,dc=yourdomain,dc=com' 作为 BASE 选项(需要替换成你们的域名)。
如果您只想要某个部门的人能访问,您可以把范围限定在某个 OU (Organization Unit)中。您可以使用 dsquery
命令行工具来查找相应 OU 的 BASE_DN。比如,如果 OU 的名字是 'staffs',您可以运行 dsquery ou -name staff
。更多的信息可以参考这里。
AD 支持使用 'user@domain.com' 格式的用户名作为 LDAP_ADMIN_DN
,比如您可以使用 administrator@example.com 作为 LDAP_ADMIN_DN
,有些时候 AD 不能正确识别这种格式。此时您可以使用 dsquery
来查找用户的 DN。比如,假设用户名是 'seafileuser',运行 dsquery user -name seafileuser
来找到该用户的 DN。更多的信息可以参考这里。
在Seafile Pro中,除了在用户登录时将用户导入到内部数据库之外,还可以配置Seafile来定期将用户信息从LDAP/AD服务器同步到内部数据库。
用户的全名,部门和电子邮件地址可以同步到内部数据库。用户使用这些信息可以更容易地搜索特定的用户。
用户的Windows或Unix登录id可以同步到内部数据库。这允许用户使用熟悉的登录id登录。
当用户从LDAP/AD中删除时,将禁用Seafile中相应的用户。否则,他仍然可以与Seafile客户机同步文件或访问web界面。
同步完成后,您可以在它的个人资料页上看到用户的全名、部门和电子邮件。
把以下配置添加到 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为这种情况提供了一组选项:
seahub_settings.py
添加以下选项: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
在配置完成后,你可以手工执行同步命令来测试配置是否有效。
cd seafile-server-latest
./pro/pro.py ldapsync
导入或同步的过程是从 LDAP 服务器上的组映射到 seafile 的内部数据库中的组。这个过程是单向的。
数据库中对组的任何改变都不会回传到 LDAP;
除了“设置成员为组管理员” 之外,数据库中对组的任何更改将被下一个LDAP同步操作覆盖,如果要添加或删除成员则只能在LDAP服务器上执行此操作。
导入组的创建者将会被设置为系统管理员。
有两种同步模式:
周期:同步过程将在固定的时间间隔内执行;
手动:可以通过执行一个脚本来触发同步过程;
在启用 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" 不支持嵌套组。
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
当您想把公司中多个 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)中才适用。
您可以利用用户过滤器选项来只允许 AD 某个组中的用户使用 Seafile。
首先,您需要找到这个组的 DN。我们再次使用 dsquery
命令。比如,如果组的名字是 'seafilegroup',那么您可以运行 dsquery group -name seafilegroup
。
然后您可以把一下配置加入seahub_settings.py
中:
LDAP_FILTER = 'memberOf={output of dsquery command}'
如果您的 LDAP 服务支持 TLS 连接,则可以配置为 ldaps 协议的访问地址,以使用 TLS 连接到 LDAP 服务,例如:LDAP_SERVER_URL
LDAP_SERVER_URL = 'ldaps://192.168.0.1:636/'
LDAP 协议 v3 支持一个称为 "paged results" 的扩展功能,当您在 LDAP 中有大量用户的时候,这个选项能够大大提高列出用户的速度。而且,AD 限制了单次请求中返回的用户条目数量,您需要启用这个选项才能避免查询错误。
在 Seafile 企业版中,在seahub_settings.py
配置中加入以下设置:
LDAP_USE_PAGED_RESULT = True
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.
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