内置系统访问控制¶
系统访问控制插件在任何连接器级别的授权之前,在全局级别强制执行授权。您可以使用 Presto 中的内置插件之一,或者按照 系统访问控制 中的指南提供您自己的插件。Presto 提供了三个内置插件
插件名称 |
描述 |
---|---|
|
允许所有操作。 |
|
允许读取数据或元数据的操作,但不允许写入数据或元数据的任何操作。有关详细信息,请参见 只读系统访问控制。 |
|
授权检查使用配置属性 |
允许所有系统访问控制¶
此插件允许所有操作。此插件默认启用。
只读系统访问控制¶
在此插件下,您可以执行任何读取数据或元数据的操作,例如 SELECT
或 SHOW
。还允许设置系统级别或目录级别的会话属性。但是,任何写入数据或元数据的操作,例如 CREATE
、INSERT
或 DELETE
,都将被禁止。要使用此插件,请添加一个包含以下内容的 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
(必需):指示用户是否可以访问目录的字符串。此值可以为all
、read-only
或none
,默认为none
。将此值设置为read-only
与read-only
系统访问控制插件的行为相同。
注意
默认情况下,所有用户都可以访问 system
目录。您可以通过添加规则来覆盖此行为。
布尔值 true
和 false
也作为 allow
的旧值支持,以支持向后兼容性。true
映射到 all
,false
映射到 none
。
例如,如果您只想允许用户 admin
访问 mysql
和 system
目录,允许所有用户访问 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 SCHEMA
、ALTER SCHEMA
和 CREATE 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主体名称完全相同的名称,并允许alice
和bob
使用名为[email protected]
的组主体,您可以使用以下规则。
{
"catalogs": [
{
"allow": true
}
],
"principals": [
{
"principal": "([^/]+)/?.*@example.net",
"principal_to_user": "$1",
"allow": true
},
{
"principal": "[email protected]",
"user": "alice|bob",
"allow": true
}
]
}