內建系統存取控制¶
系統存取控制外掛程式會在任何連接器層級授權之前,於全域層級強制執行授權。您可以使用 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
(必要): 布林值,指示使用者是否被視為 schema 的擁有者。預設值為false
。
例如,若要將所有 schema 的擁有權提供給使用者 admin
,將所有使用者視為 default
schema 的擁有者,並阻止使用者 guest
擁有任何 schema 的擁有權,您可以使用以下規則
{
"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
使用名為 group@example.net
的群組主體,您可以使用以下規則。
{
"catalogs": [
{
"allow": true
}
],
"principals": [
{
"principal": "([^/]+)/?.*@example.net",
"principal_to_user": "$1",
"allow": true
},
{
"principal": "group@example.net",
"user": "alice|bob",
"allow": true
}
]
}