前言
上一篇文章介绍了如何整合多个数据源实现跨源搜索。 然而,当跨源搜索成为可能后,新的问题也随之出现。 那就是如何控制”可以展示的信息”和”不可以展示的信息”。
如果人事部门的机密资料出现在全体员工的搜索结果中,将会引发严重问题。 本文将利用 Fess 的基于角色的搜索功能,设计并构建根据用户所属部门和权限来控制搜索结果的方案。
目标读者
需要对搜索结果进行访问控制的人员
希望构建考虑信息安全的企业内部搜索平台的人员
具备 Active Directory 和 LDAP 基础知识的人员
场景
某企业有3个部门:
销售部: 管理客户信息、报价单、提案书
开发部: 管理设计文档、源代码规格书、会议记录
人事部: 管理人事评估、薪资信息、就业规章
此外,还有所有部门都可以查阅的公共文档(公司规章制度、员工福利指南等)。
希望实现以下搜索体验:
销售部员工只能搜索到销售部和公共文档
开发部员工只能搜索到开发部和公共文档
人事部员工只能搜索到人事部和公共文档
管理层可以搜索到所有文档
基于角色的搜索机制
Fess 的基于角色的搜索按以下流程运作:
爬取时: 为文档附加角色信息(哪些角色可以访问)
登录时: 获取用户的角色信息(Fess 内部认证或外部认证集成)
搜索时: 仅在搜索结果中显示与用户角色匹配的文档
通过这一机制,在搜索引擎层面实现了访问控制。
角色设计
用户与组的设计
首先,整理 Fess 中用户、组和角色的关系。
| 组 | 角色 | 可访问的文档 |
|---|---|---|
| sales(销售部) | sales_role | 销售部文档 + 公共文档 |
| engineering(开发部) | engineering_role | 开发部文档 + 公共文档 |
| hr(人事部) | hr_role | 人事部文档 + 公共文档 |
| management(管理层) | management_role | 所有文档 |
在 Fess 中设置组和角色
创建角色
在管理界面中选择 [用户] > [角色]
创建以下角色
sales_roleengineering_rolehr_rolemanagement_role
创建组
选择 [用户] > [组]
创建以下组
salesengineeringhrmanagement
创建用户并分配角色
选择 [用户] > [用户]
为每个用户分配组和角色
在爬取设置中分配权限
要为文档附加访问控制信息,需要在爬取设置中指定权限。 权限以 {role}角色名、{group}组名、{user}用户名 的格式,以换行分隔输入。
各部门的爬取设置
销售部的文件服务器
[爬虫] > [文件系统] > [新建]
进行以下设置
路径:
smb://fileserver/sales/权限: 以换行分隔输入
{role}sales_role和{role}management_role
通过此设置,从销售部文件服务器爬取的文档,仅拥有 sales_role 和 management_role 的用户才能在搜索结果中查看。
开发部的文件服务器
[爬虫] > [文件系统] > [新建]
进行以下设置
路径:
smb://fileserver/engineering/权限: 以换行分隔输入
{role}engineering_role和{role}management_role
人事部的文件服务器
[爬虫] > [文件系统] > [新建]
进行以下设置
路径:
smb://fileserver/hr/权限: 以换行分隔输入
{role}hr_role和{role}management_role
公共文档
[爬虫] > [Web] 或 [文件系统] > [新建]
权限: 保持默认的
{role}guest
默认情况下会自动填入 {role}guest。由于包括访客用户在内的所有用户都拥有 guest 角色,因此所有用户都可以在搜索结果中查看。
与外部认证的集成
在实际的企业环境中,大多数情况下希望与现有的目录服务集成,而非使用 Fess 自身的用户管理。
Active Directory / LDAP 集成
Fess 支持 LDAP 集成,可以使用 Active Directory 的用户信息进行认证和角色分配。
要启用 LDAP 集成,需要在 Fess 的配置文件中设置 LDAP 连接信息。
主要配置项如下:
LDAP 服务器的 URL
绑定 DN(连接用账户)
用户搜索的基础 DN
组搜索的基础 DN
用户属性映射
启用 LDAP 集成后,用户可以使用 Active Directory 账户登录 Fess。 由于所属组的信息会自动映射为角色,因此无需在 Fess 中为每个用户手动设置角色。
SSO 集成
作为更高级的配置,还可以与单点登录(SSO)集成。 Fess 支持以下 SSO 协议:
OpenID Connect (OIDC): Entra ID (Azure AD)、Keycloak 等
SAML: 与各种 IdP 的集成
SPNEGO/Kerberos: Windows 集成认证
通过 SSO 集成,用户使用日常的登录信息即可自动访问 Fess,角色信息也会自动映射。 SSO 集成的详细内容将在第15回”安全搜索平台”中详细介绍。
验证
角色搜索设置完成后,让我们验证其运行效果。
验证步骤
使用销售部用户登录,搜索”报价单” → 确认仅显示销售部和公共文档
使用开发部用户登录,搜索相同关键词 → 确认不显示销售部的文档
使用管理层用户登录,搜索相同关键词 → 确认显示所有部门的文档
验证要点
确认没有权限的文档完全不出现在搜索结果中
确认公共文档对所有用户都能显示
确认未登录状态下的搜索行为(访客显示的范围)
设计注意事项
角色的粒度
角色的粒度应根据组织结构和安全需求来决定。
粗粒度: 按部门设置角色(本文的场景)
优点: 设置简单,管理方便
缺点: 无法在部门内部进行细粒度的访问控制
细粒度: 按项目或团队设置角色
优点: 可以实现精细的访问控制
缺点: 角色数量增多,管理变得复杂
建议先从粗粒度开始,根据需要逐步细化。
与文件服务器 ACL 的联动
在爬取文件服务器时,也可以利用文件的 ACL(访问控制列表)信息来进行权限控制。 在这种情况下,文件系统上的权限设置会直接反映到搜索结果的显示控制中。
如果要利用文件服务器的 ACL,请确认爬取设置中与权限相关的配置项。
总结
本文使用 Fess 的基于角色的搜索功能,设计并构建了按部门控制搜索结果的方案。
角色、组和用户的设计与注册
在爬取设置中分配角色
通过 Active Directory / LDAP 集成实现角色自动映射
SSO 集成的选择(OIDC、SAML、SPNEGO)
通过基于角色的搜索,可以在保障信息安全的同时,提供跨源搜索的便利性。 基础篇到此结束。从下一篇开始,我们将进入实践方案篇,介绍开发团队知识中心的构建。