内置系统访问控制

系统访问控制插件在任何连接器级别的授权之前,在全局级别强制执行授权。您可以使用 Presto 中的内置插件之一,或者按照 系统访问控制 中的指南提供您自己的插件。Presto 提供了三个内置插件

插件名称

描述

allow-all (默认值)

允许所有操作。

read-only

允许读取数据或元数据的操作,但不允许写入数据或元数据的任何操作。有关详细信息,请参见 只读系统访问控制

file

授权检查使用配置属性 security.config-file 指定的配置文件强制执行。有关详细信息,请参见 基于文件系统的访问控制

允许所有系统访问控制

此插件允许所有操作。此插件默认启用。

只读系统访问控制

在此插件下,您可以执行任何读取数据或元数据的操作,例如 SELECTSHOW。还允许设置系统级别或目录级别的会话属性。但是,任何写入数据或元数据的操作,例如 CREATEINSERTDELETE,都将被禁止。要使用此插件,请添加一个包含以下内容的 etc/access-control.properties 文件

access-control.name=read-only

基于文件系统的访问控制

此插件允许您在文件中指定访问控制规则。要使用此插件,请添加一个包含两个必需属性的 etc/access-control.properties 文件:access-control.name,它必须等于 file,以及 security.config-file,它必须等于配置文件的位置。例如,如果名为 rules.json 的配置文件位于 etc 中,请添加一个包含以下内容的 etc/access-control.properties

access-control.name=file
security.config-file=etc/rules.json

配置文件以 JSON 格式指定。

  • 它包含定义哪些用户可以访问哪些目录的规则(请参见下面的目录规则)。

  • 定义哪些用户可以访问哪些模式的模式访问规则(请参见下面的模式规则)。

  • 指定哪些主体可以标识为哪些用户的主体规则(请参见下面的主体规则)。

此插件目前支持目录访问控制规则、模式访问控制规则和主体规则。如果您想以其他方式限制系统级别的访问,则必须实现自定义 SystemAccessControl 插件(请参见 系统访问控制)。

刷新

默认情况下,当对 security.config-file 进行更改时,必须重新启动 Presto 才能加载更改。有一个可选属性可以在不需要重新启动 Presto 的情况下刷新属性。刷新周期在 etc/access-control.properties 中指定

security.refresh-period=1s

目录规则

这些规则控制特定用户可以访问的目录。用户根据从上到下读取的第一个匹配规则获得对目录的访问权限。如果没有任何规则匹配,则拒绝访问。每个规则都包含以下字段

  • user (可选):与用户名匹配的正则表达式。默认为 .*

  • catalog (可选):与目录名匹配的正则表达式。默认为 .*

  • allow (必需):指示用户是否可以访问目录的字符串。此值可以为 allread-onlynone,默认为 none。将此值设置为 read-onlyread-only 系统访问控制插件的行为相同。

注意

默认情况下,所有用户都可以访问 system 目录。您可以通过添加规则来覆盖此行为。

布尔值 truefalse 也作为 allow 的旧值支持,以支持向后兼容性。true 映射到 allfalse 映射到 none

例如,如果您只想允许用户 admin 访问 mysqlsystem 目录,允许所有用户访问 hive 目录,允许用户 alice 以只读方式访问 postgresql 目录,并拒绝所有其他访问,您可以使用以下规则

{
  "catalogs": [
    {
      "user": "admin",
      "catalog": "(mysql|system)",
      "allow": "all"
    },
    {
      "catalog": "hive",
      "allow": "all"
    },
    {
      "user": "alice",
      "catalog": "postgresql",
      "allow": "read-only"
    },
    {
      "catalog": "system",
      "allow": "none"
    }
  ]
}

模式规则

这些规则允许您授予模式的所有权。拥有模式的所有权允许用户执行 DROP SCHEMAALTER SCHEMACREATE SCHEMA。用户根据从上到下读取的第一个匹配规则获得模式的所有权。如果没有任何规则匹配,则不授予所有权。每个规则都包含以下字段

  • user (可选):与用户名匹配的正则表达式。默认为 .*

  • schema (可选):与模式名匹配的正则表达式。默认为 .*

  • owner (必需):指示用户是否被视为模式所有者的布尔值。默认为 false

例如,要为用户 admin 提供所有模式的所有权,将所有用户视为 default 模式的所有者,并阻止用户 guest 拥有任何模式,您可以使用以下规则

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "schemas": [
    {
      "user": "admin",
      "schema": ".*",
      "owner": true
    },
    {
      "user": "guest",
      "owner": false
    },
    {
      "schema": "default",
      "owner": true
    }
  ]
}

主体规则

这些规则用于强制执行主体与指定用户名之间的特定匹配。主体根据从上到下读取的第一个匹配规则获得用户授权。如果未指定任何规则,则不会执行任何检查。如果没有任何规则匹配,则拒绝用户授权。每个规则都包含以下字段

  • principal (必需):与主体匹配并进行分组的正则表达式。

  • user (可选):与用户名匹配的正则表达式。如果匹配,它将根据 allow 的值授予或拒绝授权。

  • principal_to_user(可选):用于替换主体的替换字符串。如果替换结果与用户名相同,则将根据allow的值授予或拒绝授权。

  • allow(必填):布尔值,指示主体是否可以被授权为用户。

注意

您至少需要在主体规则中指定一个条件。如果在主体规则中指定了两个条件,则在满足任一条件时将返回所需结论。

以下实现了对LDAP和Kerberos身份验证的完整主体名称的精确匹配

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "principals": [
    {
      "principal": "(.*)",
      "principal_to_user": "$1",
      "allow": true
    },
    {
      "principal": "([^/]+)/?.*@.*",
      "principal_to_user": "$1",
      "allow": true
    }
  ]
}

如果您想允许用户使用与其Kerberos主体名称完全相同的名称,并允许alicebob使用名为[email protected]的组主体,您可以使用以下规则。

{
  "catalogs": [
    {
      "allow": true
    }
  ],
  "principals": [
    {
      "principal": "([^/]+)/?.*@example.net",
      "principal_to_user": "$1",
      "allow": true
    },
    {
      "principal": "[email protected]",
      "user": "alice|bob",
      "allow": true
    }
  ]
}