功能简介
天翼云云搜索服务中的OpenSearch和Elasticsearch都支持细粒度权限管控,包括文档级别和字段级别的权限控制,为企业级用户提供了精确的数据访问管理能力。这一功能使得管理员能够针对不同的用户或角色,灵活地配置他们对特定文档或字段的访问权限,确保敏感信息得到有效保护,同时实现数据的高效共享和管理。
核心原理
细粒度权限管控允许管理员在多个层次上定义用户访问权限。具体来说,文档级别的权限控制使得管理员能够基于文档的内容或属性,决定某个用户是否可以访问或查询该文档。字段级别的权限控制则进一步细化,允许管理员指定某些用户只能查看或操作文档中的特定字段,而隐藏其他字段内容。
例如,在一个包含敏感信息的客户数据库中,管理员可以配置权限,使得某些用户只能访问客户的联系方式,而不能查看财务信息或个人身份信息。通过这样的精细控制,搜索引擎能够确保数据的安全性和合规性,同时满足不同业务场景下的访问需求。
应用场景与优势
数据安全与隐私保护
通过文档级别和字段级别的权限控制,企业可以确保敏感信息仅对经过授权的用户可见。这在金融、医疗等对数据隐私有严格要求的行业中尤为重要,能够帮助企业满足合规性要求。
个性化数据访问
细粒度权限管控允许为不同用户或角色定制数据访问视图。例如,在一个销售系统中,销售人员可能只需要访问客户的基本信息,而经理则可以查看更详细的销售记录和分析数据。这种个性化的权限配置提高了工作效率。
多租户环境
在多租户环境中,细粒度权限管控能够有效隔离不同租户的数据,确保每个租户只能访问自己的数据。即使多个租户共享同一个搜索引擎集群,他们的数据依然能够得到严格的保护。
最小权限原则
细粒度权限控制支持最小权限原则(Principle of Least Privilege),确保用户仅能访问其工作所需的最小数据范围,从而减少潜在的安全风险。
技术实现与应用
管理员可以通过 OpenSearch 的安全模块,使用文档级别安全(Document-Level Security, DLS)和字段级别安全(Field-Level Security, FLS)配置细粒度权限。DLS 允许基于查询条件限制用户对特定文档的访问,而 FLS 则允许管理员指定哪些字段对特定用户可见或不可见。
这些权限配置可以通过 OpenSearch 的 REST API 或管理工具来实现和管理。管理员还可以结合角色和用户组的概念,为不同用户群体配置统一的权限策略,从而简化权限管理流程。
操作示例
我们创建一个role public_role,创建一个user public_user1,目标是让这个user只能查看pub开头的索引里public字段为true的文档。
创建角色:
PUT _plugins/_security/api/roles/public_role
{
"cluster_permissions": [
"*"
],
"index_permissions": [{
"index_patterns": [
"pub*"
],
"dls": "{\"term\": { \"public\": \"true\"}}",
"allowed_actions": [
"read"
]
}]
}
创建用户:
PUT _plugins/_security/api/internalusers/public_user1
{
"password": "******"
}
创建Mapping:
PUT _plugins/_security/api/rolesmapping/public_role
{
"users" : [ "public_user1" ]
}
创建索引:
- pub索引,插入两条数据
POST pub_index/_doc/
{
"name": "robert",
"age": "30",
"public": "true"
}
POST pub_index/_doc/
{
"name": "mike",
"age": "55",
"public": "false"
}
- 非pub索引
POST sec_index/_doc/
{
"name": "jane",
"age": "18",
"public": "true"
}
我们开始搜索,预期是public_user1搜索pub_index可以返回一条结果,搜索sec_index无结果。而admin用户搜索pub_index可以返回两条结果,搜索sec_index可以返回一条结果。
GET pub_index/_search
{"size": 10,"query": {"match_all": {}}}
{
"took" : 4,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 2.0,
"hits" : [
{
"_index" : "pub_index",
"_id" : "xBnh0okBxCORqeQrGobf",
"_score" : 2.0,
"_source" : {
"name" : "robert",
"age" : "30",
"public" : "true"
}
}
]
}
}
GET pub_index/_search
{"size": 10,"query": {"match_all": {}}}
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 2,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "pub_index",
"_id" : "xBnh0okBxCORqeQrGobf",
"_score" : 1.0,
"_source" : {
"name" : "robert",
"age" : "30",
"public" : "true"
}
},
{
"_index" : "pub_index",
"_id" : "xRnh0okBxCORqeQrMobq",
"_score" : 1.0,
"_source" : {
"name" : "mike",
"age" : "55",
"public" : "false"
}
}
]
}
}
GET sec_index/_search
{"size": 10,"query": {"match_all": {}}}
{
"error" : {
"root_cause" : [
{
"type" : "security_exception",
"reason" : "no permissions for [indices:data/read/search] and User [name=public_user1, backend_roles=[], requestedTenant=null]"
}
],
"type" : "security_exception",
"reason" : "no permissions for [indices:data/read/search] and User [name=public_user1, backend_roles=[], requestedTenant=null]"
},
"status" : 403
}
GET sec_index/_search
{"size": 10,"query": {"match_all": {}}}
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : {
"value" : 1,
"relation" : "eq"
},
"max_score" : 1.0,
"hits" : [
{
"_index" : "sec_index",
"_id" : "xhnh0okBxCORqeQrTYbM",
"_score" : 1.0,
"_source" : {
"name" : "jane",
"age" : "18",
"public" : "true"
}
}
]
}
}
搜索引擎的细粒度权限管控功能通过支持文档级别和字段级别的权限控制,为企业提供了强大的数据安全和管理能力。
这种精确的权限配置不仅帮助企业保护敏感信息,还能够在多租户环境和个性化数据访问需求下提供高效的解决方案。通过细粒度的权限管控,企业可以确保数据的安全性、隐私性和合规性,同时实现灵活的业务支持。