內建系統存取控制

系統存取控制外掛程式會在任何連接器層級授權之前,於全域層級強制執行授權。您可以使用 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-only 的行為與 read-only 系統存取控制外掛程式相同。

注意

預設情況下,所有使用者都可以存取 system 目錄。您可以新增規則來覆寫此行為。

為了支援回溯相容性,也支援布林值 truefalse 作為 allow 的舊值。true 對應到 all,而 false 對應到 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 (必要): 布林值,指示使用者是否被視為 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 主體名稱完全相同的名稱,並允許 alicebob 使用名為 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
    }
  ]
}