全部产品
Search
文档中心

智能开放搜索 OpenSearch:访问鉴权规则

更新时间:Feb 07, 2023

您通过云账号创建的OpenSearch应用,都是该账号自己拥有的资源。默认情况下,账号对自己的资源拥有完整的操作权限。使用阿里云的RAM(Resource Access Management)服务,可以将您云账号下OpenSearch资源的访问及管理权限授予RAM中子用户。

说明

注意: 

  • 新版控制台对RAM权限进行了细化,与旧版控制台有一定的区别;若在新版控制台上使用子账号功能,需要重新编写RAM授权策略。 

  • RAM 子账号功能只支持V3 及以上API(SDK)版本,V2 版API(SDK)不支持 RAM子账号功能。 

  • 第三方数据源产品要严格遵守 RAM 权限体系,需要在第三方产品赋予子账号对应权限。其中RAM子账号不支持授权odps服务权限。原因是:当主账号授权project给子账号后,子账号因云有云限制无权限列出主账号全部项目。因此子账号无法引用project作为数据源接入开放搜索。建议先使用主账号连ODPS,然后再通过子账号操作开放搜索应用。 

  • 使用RAM子账号在控制台中配置 RDS 数据源,必须要再对该RAM子账号进行数据源相关权限授权,否则会报错提示连接RDS服务失败,请稍后再试,参考下面的RDS访问授权。 

  • 以Search开头的 ACTION 暂不支持 IP条件鉴权,在配置后会有问题,需注意(主要是SearchApp和SearchSuggest)。

生效时间

对子用户设置或更新权限配置后,延迟5分钟后生效。

最小常见组合权限

使用RAM子账号登录访问开放搜索控制台,最小常见组合权限包括搜索一个应用的最小权限集合、应用列表权限、应用详情权限、监控与报警权限、RDS访问授权等,仅供参考。

搜索一个应用的最小权限集合

通过SDK对应用发起搜索请求,实现文档召回功能的测试,所以需要搜索一个应用的权限,以下示例是应用名为app_schema_demo实现文档召回功能的搜索测试。

{
    "Statement": [
    {
            "Effect": "Allow",
            "Action": "opensearch:SearchApp",
            "Resource": "acs:opensearch:*:*:apps/app_schema_demo"
        }
    ],
    "Version": "1"
}

应用列表权限

子账号登录后,需要查看控制台应用列表权限。

{
    "Statement": [
        {
            "Action": [
                "opensearch:ListAppGroup",
                "opensearch:DescribeAppStatistics",
                "opensearch:ListAppGroupErrors"
            ],
            "Effect": "Allow",
            "Resource": "acs:opensearch:*:*:app-groups/*"
        }
    ],
    "Version": "1"
}

应用详情权限

监控与报警功能是集成在应用详情界面中,因此需要查看应用详情权限,以下示例是查看应用名为app_schema_demo的应用详情。

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "opensearch:DescribeAppGroup",
                "opensearch:ListApp",
                "opensearch:DescribeApp"
            ],
            "Resource": "acs:opensearch:*:*:app-groups/app_schema_demo"
        },
        {
            "Action": "opensearch:ListUserAnalyzers",
            "Effect": "Allow",
            "Resource": "acs:opensearch:*:*:user-analyzers/*"
        }
    ],
    "Version": "1"
}

监控与报警权限

监控与报警功能是基于阿里云监控系统,可以通过在RAM策略模板中搜索AliyunCloudMonitorReadOnlyAccess来查看云监控只读策略。

{
    "Version": "1",
    "Statement": [
        {
            "Action": [
                "cms:Get*",
                "cms:List*",
                "cms:Query*",
                "cms:BatchQuery*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        },
        {
            "Action": "opensearch:DescribeApp",
            "Resource": "acs:opensearch:*:*:app-groups/*",
            "Effect": "Allow"
        }
    ]
}

RDS访问授权

访问RDS有两个接口,tables和fields。由于访问RDS需要添加白名单,因此还需要再为RAM子账号设置白名单权限(如果没有该权限,连接RDS时会报错提示设置RDS的IP白名单失败)。RDS 的授权直接在 RAM控制台配置,可以在概览页配置自定义授权策略或者角色,然后在用户管理页面对子账号进行授权(RDS授权参考文档)。OpenSearch 使用 RDS 授权最小集合:

  • Resource 中的变量含义(例如: $regionid,$accountid,$dbinstanceid 等)。

  • Resource 中相关参数值也可以使用通配符 * 来表示。

    {
      "Version": "1",
      "Statement": [
          {
              "Action": "rds:DescribeDBInstanceAttribute",
              "Resource": "acs:rds:$regionid:$accountid:dbinstance/$dbinstanceid",
              "Effect": "Allow"
          },
          {
              "Action": "rds:ModifySecurityIps",
              "Resource": "acs:rds:$regionid:$accountid:dbinstance/$dbinstanceid",
              "Effect": "Allow"
          },
          {
              "Action": "rds:DescribeDBInstanceIPArrayList",
              "Resource": "acs:rds:$regionid:$accountid:dbinstance/$dbinstanceid",
              "Effect": "Allow"
          },
          {
              "Action": "rds:DescribeDBInstanceNetInfoForChannel",
              "Resource": "acs:rds:$regionid:$accountid:dbinstance/$dbinstanceid",
              "Effect": "Allow"
          }
      ]
    }

流量API调用权限

通过API搜索、数据推送、访问下拉提示模型时需要添加如下权限。

{
	"Statement": [
	 {
	  "Effect": "Allow",
	  "Action": [
	   "opensearch:PushDoc",
	   "opensearch:SearchApp"
	  ],
	  "Resource": [
	   "acs:opensearch:$regionId:*:apps/$appGroupName",
	   "acs:opensearch:$regionId:*:app-groups/$appGroupName"
	  ]
	 },
	 {
	  "Action": "opensearch:SearchSuggest",
	  "Effect": "Allow",
	  "Resource": "acs:opensearch:$regionId:*:suggestions/$suggestionIdentity"
	 }
	],
	"Version": "1"
   }

授权参考

在确定要为子用户赋予某些需要操作的应用后,子用户正常登录控制台通常需要依赖多种 action 权限组合,可以考虑赋予子用户 Describe*List* 权限,当然也可以根据您的实际场景需求为子用户赋予特定的权限组合。

参考(1)

给accountId为1234的主账号下的某个子账号赋予所有区域、所有应用的所有操作权限,该策略在主账号控制台中创建后,需再通过主账号在 RAM 控制台中对子账号授权,或通过 RAM SDK对子账号授权。1、创建一个策略。

{
  "Statement": [
    {
      "Action": "opensearch:*",
      "Effect": "Allow",
      "Resource": "acs:opensearch:*:1234:apps/*"
    }
  ],
  "Version": "1"
}

2、把当前策略授权给您指定的子账号。

参考(2)

给accountId为1234的主账号下的某个子账号赋予华东1区域(cn-hangzhou)、所有应用的所有操作权限,该策略在主账号控制台中创建后,需再通过主账号在 RAM 控制台中对子账号授权,或通过 RAM SDK对子账号授权。

1、创建一个策略。

{
  "Statement": [
    {
      "Action": "opensearch:*",
      "Effect": "Allow",
      "Resource": "acs:opensearch:cn-hangzhou:1234:apps/*"
    }
  ],
  "Version": "1"
}

2、把当前策略授权给您指定的子账号。

说明

注意: 

  • 在resource格式中,如果是通过指定*通配符匹配,将包含所有资源类型。 

  • 如果在resource格式中,是通过指定应用名匹配, 即使在该策略的Action中指定opensearch:*,也只会包含资源类别为应用名的所有Action,不包含 opensearch:ListApp和opensearch:CreateApp。 

  • 每一行Action都必须对应所在行的resource格式,例如 opensearch:ListApp和opensearch:CreateApp作用范围是所有应用,必须用 *表示。注意这2个Action对应resource格式和其它Action对应 resource格式有区别。 

  • 如果您的授权策略中只包含指定应用名资源格式,并且您也依赖 opensearch:ListApp和opensearch:CreateApp权限。您需要再创建1个包含这2个资源格式为*的Action策略,并累加授权给指定RAM子账号。

控制台鉴权问题解决流程

当使用子账号访问控制台时,可能会遇到提示“RAM 子账户鉴权失败”的情况,如图:1此时:

  • 按图中所示,找到请求的POP Action,例:ListAppGroups;如果 action 出现 DryRun后缀,实际对应的是没有后缀的action,例:CreateAppDryRun 对应的action是 CreateApp;

  • 再到 应用授权规则列表中找到 ListAppGroups 对应的 RAM Action 和 Resource Pattern;(注:

    RAM Action 很有可能不等于 POP Action)

  • 最后,按照对子账号的授权需要编写授权策略。