LDAP (Light-weight Directory Access Protocol) 是企业广泛部署的用户信息管理服务器,微软的活动目录服务器(Active Directory)完全兼容 LDAP。这个文档假定您已经了解了 LDAP 相关的知识和术语。
注: 对于 seafile Pro 11 版本 请查看:Seafile Pro 11 文档
Seafile 中的用户分为两类:
Seafile 会自动从内部数据库和 LDAP 中查找用户,只要用户存在于任何一个来源,他们都能登录。
Seafile 要求 LDAP/AD 服务器中每个用户都有一个唯一的 ID。这个 ID 只能使用邮箱地址格式。一般来说,AD 有两个用户属性可以用作 Seafile 用户的 ID:
用户登录名@域名
。尽管这个不是真实的 email 地址,但是它也能作为 Seafile 的用户 ID。如果机构的用户没有 email 地址,可以使用这个属性。把下面的配置添加到 ccnet.conf 中。
如果你使用 email 地址作为用户唯一 ID:
[LDAP]
HOST = ldap://192.168.1.123/
BASE = cn=users,dc=example,dc=com
USER_DN = administrator@example.local
PASSWORD = secret
LOGIN_ATTR = mail
如果你使用 UserPrincipalName 作为用户 ID:
[LDAP]
HOST = ldap://192.168.1.123/
BASE = cn=users,dc=example,dc=com
USER_DN = administrator@example.local
PASSWORD = secret
LOGIN_ATTR = userPrincipalName
各个配置选项的含义如下:
FOLLOW_REFERRALS = false
到配置中。这个选项的含义将在下面的部分中解释。mail
或者 userPrincipalName
。注意:如果配置项包含中文,需要确保配置文件使用 UTF8 编码保存。
关于如何选定 BASE 和 USER_DN 的一些技巧:
dsquery
命令行工具来查找相应 OU 的 DN。比如,如果 OU 的名字是 'staffs',您可以运行 dsquery ou -name staff
。更多的信息可以参考这里。USER_DN
。比如您可以使用 administrator@example.com 作为 USER_DN
。有些时候 AD 不能正确识别这种格式。此时您可以使用 dsquery
来查找用户的 DN。比如,假设用户名是 'seafileuser',运行 dsquery user -name seafileuser
来找到该用户的 DN。更多的信息可以参考这里。把以下配置添加到 ccnet.conf 中:
[LDAP]
HOST = ldap://192.168.1.123/
BASE = ou=users,dc=example,dc=com
USER_DN = cn=admin,dc=example,dc=com
PASSWORD = secret
LOGIN_ATTR = mail
配置选项的含义与 AD 配置相同。不过,你只能使用 mail 作为用户的 ID,因为其他 LDAP 服务器不支持 UserPrincipalName。
从专业版 5.0.0 开始,我们提供了一个测试你的 LDAP 配置合法性的命令行工具。
使用这个工具之前,请先确定你使用的是专业版而且 Linux 系统中安装了 python-ldap
这个包。
sudo apt-get install python-ldap
然后你可以执行测试:
cd seafile-server-latest
./pro/pro.py ldapsync --test
测试脚本会检查 ccnet.conf 里面 [LDAP]
下面的配置。如果一切正常工作,它会打印出搜索的前十个用户。如果出错,它会打印出可能出错的配置信息。
注意当前这个脚本并不支持测试 [LDAP_SYNC]
下面的 LDAP 同步配置。
在更新了 ccnet.conf 之后,你必须重启 Seafile 服务以使得配置生效。
在Seafile Pro中,除了在用户登录时将用户导入到内部数据库之外,还可以配置Seafile来定期将用户信息从LDAP/AD服务器同步到内部数据库。
同步完成后,您可以在它的个人资料页上看到用户的全名、部门和电子邮件。
把以下配置添加到 ccnet.conf 里:
[LDAP]
......
[LDAP_SYNC]
ENABLE_USER_SYNC = true
DEACTIVE_USER_IF_NOTFOUND = true
SYNC_INTERVAL = 60
USER_OBJECT_CLASS = person
ENABLE_EXTRA_USER_INFO_SYNC = true
FIRST_NAME_ATTR = givenName
LAST_NAME_ATTR = sn
USER_NAME_REVERSE = true
UID_ATTR = sAMAccountName
各个选项的含义:
如果你选择了 "userPrincipalName" 作为用户的唯一 ID,Seafile 不能使用这个 ID 作为 email 地址来发送通知邮件给用户。如果你的 AD 中也有用户的 email 地址属性,你可以把这个属性同步到 Seafile 的内部数据库中。配置的选项是:
将以下配置项添加到 ccnet.conf
:
[LDAP]
......
[LDAP_SYNC]
ENABLE_USER_SYNC = true
DEACTIVE_USER_IF_NOTFOUND = true
SYNC_INTERVAL = 60
USER_OBJECT_CLASS = userOfNames
ENABLE_EXTRA_USER_INFO_SYNC = true
FIRST_NAME_ATTR = givenName
LAST_NAME_ATTR = sn
UID_ATTR = uid
各配置项含义:
默认情况下,使用上述配置导入的用户将被自动激活。对于一些拥有大量用户的组织,它们可能希望导入用户信息(例如:用户全名),而不自动激活导入的用户。因为激活所有导入的用户将需要AD/LDAP中所有用户的许可证。
Seafile为这种情况提供了一组选项。 首先,您必须在ccnet.conf
的"[ldap_sync]"部分添加以下选项:
ACTIVATE_USER_WHEN_IMPORT = false
这可以防止Seafile在导入用户的同时激活这些用户。其次,在seahub_settings.py
中添加以下选项:
ACTIVATE_AFTER_FIRST_LOGIN = True
而当用户第一次登录到Seafile时,该选项将自动激活用户。
使用这些配置,导入的用户可以被正常搜索到,但是在用户首次登录之前不会占用license中的授权数。
在配置完成后,你可以手工执行同步命令来测试配置是否有效。
cd seafile-server-latest
./pro/pro.py ldapsync
当您设置“DEACTIVE”选项时,当在LDAP服务器中找不到用户时,该用户将被停用。默认情况下,即使此用户重新出现在LDAP服务器中,也不会自动重新激活它。这是为了防止自动重新激活被系统管理员手动停用的用户。这个选项适用于企业版本7.1.8+版本
AUTO_REACTIVATE_USERS=true ### 默认是false
当您想把公司中多个 OU 加入 Seafile 中时,您可以使用在配置中指定多个 BASE DN。您可以在"BASE"配置中指定一个 DN 的列表,标识名由";"分开, 比如: cn=developers,dc=example,dc=com;cn=marketing,dc=example,dc=com
当你的公司组织庞大,但是只有一小部分人使用 Seafile 的时候,搜索过滤器(Search filter)会很有用处. 过滤器可以通过修改"FILTER"配置来实现,例如,在 LDAP 配置中增加以下语句:
FILTER = memberOf=CN=group,CN=developers,DC=example,DC=com
请注意上面的示例只是象征性的简介. memberOf
只有在活动目录(Active Directory)中才适用.
您可以利用用户过滤器选项来只允许 AD 某个组中的用户使用 Seafile。
dsquery
命令。比如,如果组的名字是 'seafilegroup',那么您可以运行 dsquery group -name seafilegroup
。FILTER = memberOf={dsquery 命令的输出}
LDAP 协议 v3 支持一个称为 "paged results" 的扩展功能。当您在 LDAP 中有大量用户的时候,这个选项能够大大提高列出用户的速度。而且,AD 限制了单次请求中返回的用户条目数量,您需要启用这个选项才能避免查询错误。
在 Seafile 企业版中,在 LDAP 配置中加入以下设置:
USE_PAGED_RESULT = true
要使用TLS连接到LDAP/AD服务器,您应该在LDAP/AD服务器上安装有效的SSL证书。
当前版本的Seafile Linux服务器包是在CentOS上编译的。我们在包中包含ldap客户端库,以维护与旧Linux发行版的兼容性。但是由于不同的Linux发行版对于OpenSSL库有不同的路径或配置,所以有时Seafile无法使用TLS连接到AD服务器。
绑定在Seafile包中的ldap库(libldap)是2.4版本的。如果您的Linux发行版足够新(比如CentOS 6、Debian 7或Ubuntu 12.04或更高版本),则可以使用操作系统中安装的libldap。
在Ubuntu 14.04和Debian 7/8上,将绑定的ldap相关库移出库路径应该可以使TLS连接正常工作。
cd ${SEAFILE_INSTALLATION_DIR}/seafile-server-latest/seafile/lib
mkdir disabled_libs_use_local_ones_instead
mv liblber-2.4.so.2 libldap-2.4.so.2 libsasl2.so.2 libldap_r-2.4.so.2 disabled_libs_use_local_ones_instead/
在CentOS 6上,您必须移动libnssutil库:
cd ${SEAFILE_INSTALLATION_DIR}/seafile-server-latest/seafile/lib
mkdir disabled_libs_use_local_ones_instead
mv libnssutil3.so disabled_libs_use_local_ones_instead/
这可以有效地从库搜索路径中删除绑定的库。 当服务器启动时,它将找到并使用操作系统中的库(如果它们已经安装)。 每次升级Seafile时都必须执行这些操作。
从Seafile 5.1.4 pro 开始,我们支持同时对接多个ldap服务器,除了"[ldap]"部分中的基本ldap服务器信息外,还可以在"[ldap_multi_1]、[ldap_multi_2]……[ldap_multi_9]"部分中设置其他ldap服务器信息,因此您可以配置10个ldap服务器来对接Seafile。多ldap服务器意味着,当获取或搜索ldap用户时,它将迭代所有配置的ldap服务器,直到找到匹配的ldap服务器;在列出所有ldap用户时,它将迭代所有ldap服务器以获得所有用户;对于Ldap同步,它将所有配置Ldap服务器中的所有用户/组信息同步到seafile。
此处有一个 ccnet.conf
的配置示例如下:
[LDAP]
HOST = ldap://192.168.1.123/
BASE = ou=users,dc=example,dc=com
USER_DN = cn=admin,dc=example,dc=com
PASSWORD = secret
LOGIN_ATTR = mail
接着可以在ccnet.conf
添加另一个ldap服务器的配置如下:
[LDAP_MULTI_1]
HOST = ldap://192.168.1.124/
BASE = ou=users,dc=example,dc=com
USER_DN = cn=admin,dc=example,dc=com
PASSWORD = secret
在6.3.8之前,所有ldap服务器都共享"[ldap]"部分中的"LOGIN_ATTR、USE_PAGED_RESULT、FOLLOW_REFERRALS"属性;对于ldap用户/组同步,所有ldap服务器都共享"[ldap_sync]"部分中与ldap同步相关的所有属性。
从 Seafile 6.3.8 pro 开始,我们为每个ldap服务器支持更多独立的配置部分。可以在每个"[ldap_multi_x]"部分独立设置"LOGIN_ATTR、USE_PAGED_RESULT和FOLLOW_REFERRALS"选项。此外,可以为每个LDAP服务器设置独立的"[ldap_sync_multi_x]"部分。也就是说,每个LDAP服务器可以使用不同的LDAP同步选项。
仍然有一些共享配置选项只能在"[ldap_sync]"部分中设置,该部分用于所有LDAP服务器。
这些选项用于控制同步行为,因此它们被所有LDAP服务器共享。
注意:对于每个"[ldap_multi_x]"部分,建议使用与之相对应的"[ldap_sync_multi_x]"。否则,LDAP同步过程将使用"[ldap_sync]"部分中的选项作为与改 LDAP 服务器同步的选项。
请参考英文的文档
Last modified by 郑杰, 2023-09-05