Hive 安全配置

身分驗證

Hive 連接器的預設安全配置在連線到 Hadoop 叢集時不會使用身分驗證。所有查詢都以執行 Presto 處理程序的使用者身分執行,無論哪個使用者提交查詢。

Hive 連接器提供額外的安全性選項,以支援已設定為使用 Kerberos 的 Hadoop 叢集。

在存取 HDFS 時,Presto 可以模擬執行查詢的最終使用者。這可以與 HDFS 權限和 ACL 搭配使用,為資料提供額外的安全性。

警告

當使用 Kerberos 身分驗證 Hadoop 服務時,應使用 Kerberos 來保護對 Presto 協調器的存取。未能保護對 Presto 協調器的存取可能會導致未經授權存取 Hadoop 叢集上的敏感資料。

請參閱協調器 Kerberos 身分驗證CLI Kerberos 身分驗證,以了解有關設定 Kerberos 身分驗證的資訊。

Kerberos 支援

為了將 Hive 連接器與使用 kerberos 身分驗證的 Hadoop 叢集搭配使用,您需要設定連接器以使用 Hadoop 叢集上的兩個服務

  • Hive Metastore Thrift 服務

  • Hadoop 分散式檔案系統 (HDFS)

Hive 連接器對這些服務的存取是在包含一般 Hive 連接器組態的屬性檔案中設定。

注意

如果您的 krb5.conf 位置與 /etc/krb5.conf 不同,您必須在 jvm.config 檔案中使用 java.security.krb5.conf JVM 屬性明確設定。

範例:-Djava.security.krb5.conf=/example/path/krb5.conf

Hive Metastore Thrift 服務身分驗證

在 Kerberos 化的 Hadoop 叢集中,Presto 使用 SASL 連線到 Hive Metastore Thrift 服務,並使用 Kerberos 進行身分驗證。Metastore 的 Kerberos 身分驗證是在連接器的屬性檔案中使用下列屬性來設定

屬性名稱

描述

hive.metastore.authentication.type

Hive Metastore 身分驗證類型。

hive.metastore.service.principal

Hive Metastore 服務的 Kerberos 主體。

hive.metastore.client.principal

Presto 在連線到 Hive Metastore 服務時將使用的 Kerberos 主體。

hive.metastore.client.keytab

Hive Metastore 用戶端金鑰表位置。

hive.metastore-impersonation-enabled

啟用 Metastore 最終使用者模擬。

hive.metastore.authentication.type

其中一個為 NONEKERBEROS。當使用預設值 NONE 時,Kerberos 身分驗證會停用,且無需設定其他屬性。

當設定為 KERBEROS 時,Hive 連接器將使用 SASL 連線到 Hive Metastore Thrift 服務,並使用 Kerberos 進行身分驗證。

此屬性為選擇性;預設值為 NONE

hive.metastore.service.principal

Hive Metastore 服務的 Kerberos 主體。Presto 協調器將使用此主體來驗證 Hive Metastore。

此屬性值可以使用 _HOST 預留位置。在連線到 Hive Metastore 時,Hive 連接器會將它替換為其連線的 metastore 伺服器的主機名稱。如果 metastore 在多個主機上執行,這會很有用。

範例:hive/hive-server-host@EXAMPLE.COMhive/_HOST@EXAMPLE.COM

此屬性為選擇性;沒有預設值。

hive.metastore.client.principal

Presto 在連線到 Hive Metastore 時將使用的 Kerberos 主體。

此屬性值可以使用 _HOST 預留位置。在連線到 Hive Metastore 時,Hive 連接器會將它替換為 Presto 執行的 worker 節點的主機名稱。如果每個 worker 節點都有自己的 Kerberos 主體,這會很有用。

範例:presto/presto-server-node@EXAMPLE.COMpresto/_HOST@EXAMPLE.COM

此屬性為選擇性;沒有預設值。

警告

hive.metastore.client.principal 指定的主體必須具有足夠的權限才能移除 hive/warehouse 目錄中的檔案和目錄。如果主體沒有權限,則只會移除中繼資料,且資料將繼續佔用磁碟空間。

發生此狀況的原因是 Hive Metastore 負責刪除內部資料表資料。當 Metastore 設定為使用 Kerberos 驗證時,Metastore 執行的所有 HDFS 操作都會被模擬成其他使用者。刪除資料時的錯誤會被靜默忽略。

hive.metastore.client.keytab

包含由 hive.metastore.client.principal 指定的主體金鑰的 keytab 檔案路徑。此檔案必須可由執行 Presto 的作業系統使用者讀取。

此屬性為選擇性;沒有預設值。

使用 NONE 驗證的組態範例

hive.metastore.authentication.type=NONE

Hive Metastore 的預設驗證類型為 NONE。當驗證類型為 NONE 時,Presto 會連線到不安全的 Hive Metastore。不會使用 Kerberos。

使用 KERBEROS 驗證的組態範例

hive.metastore.authentication.type=KERBEROS
hive.metastore.service.principal=hive/hive-metastore-host.example.com@EXAMPLE.COM
hive.metastore.client.principal=presto@EXAMPLE.COM
hive.metastore.client.keytab=/etc/presto/hive.keytab

當 Hive Metastore Thrift 服務的驗證類型為 KERBEROS 時,Presto 會以 hive.metastore.client.principal 屬性指定 Kerberos 主體身分連線。Presto 會使用 hive.metastore.client.keytab 屬性指定的 keytab 來驗證此主體身分,並驗證 Metastore 的身分是否符合 hive.metastore.service.principal

Keytab 檔案必須散佈到叢集中執行 Presto 的每個節點。

關於 Keytab 檔案的其他資訊。

HDFS 驗證

在 Kerberized Hadoop 叢集中,Presto 使用 Kerberos 向 HDFS 進行驗證。HDFS 的 Kerberos 驗證是在連接器的屬性檔案中使用下列屬性進行設定

屬性名稱

描述

hive.hdfs.authentication.type

HDFS 驗證類型。可能的值為 NONEKERBEROS

hive.hdfs.impersonation.enabled

啟用 HDFS 最終使用者模擬。

hive.hdfs.presto.principal

Presto 連線到 HDFS 時將使用的 Kerberos 主體。

hive.hdfs.presto.keytab

HDFS 用戶端 keytab 位置。

hive.hdfs.authentication.type

其中一個為 NONEKERBEROS。當使用預設值 NONE 時,Kerberos 身分驗證會停用,且無需設定其他屬性。

當設定為 KERBEROS 時,Hive 連接器會使用 Kerberos 向 HDFS 進行驗證。

此屬性為選擇性;預設值為 NONE

hive.hdfs.impersonation.enabled

啟用最終使用者 HDFS 模擬。

章節 最終使用者模擬 詳細說明 HDFS 模擬。

此屬性是可選的;預設值為 false

hive.hdfs.presto.principal

Presto 連線到 HDFS 時將使用的 Kerberos 主體。

此屬性值中可以使用 _HOST 預留位置。連線到 HDFS 時,Hive 連接器會替換為執行 Presto 的工作節點的主機名稱。如果每個工作節點都有自己的 Kerberos 主體,這會很有用。

範例:presto-hdfs-superuser/presto-server-node@EXAMPLE.COMpresto-hdfs-superuser/_HOST@EXAMPLE.COM

此屬性為選擇性;沒有預設值。

hive.hdfs.presto.keytab

包含由 hive.hdfs.presto.principal 指定的主體金鑰的 keytab 檔案路徑。此檔案必須可由執行 Presto 的作業系統使用者讀取。

此屬性為選擇性;沒有預設值。

使用 NONE 驗證的組態範例

hive.hdfs.authentication.type=NONE

HDFS 的預設驗證類型為 NONE。當驗證類型為 NONE 時,Presto 會使用 Hadoop 的簡單驗證機制連線到 HDFS。不會使用 Kerberos。

使用 KERBEROS 驗證的組態範例

hive.hdfs.authentication.type=KERBEROS
hive.hdfs.presto.principal=hdfs@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/presto/hdfs.keytab

當驗證類型為 KERBEROS 時,Presto 會以 hive.hdfs.presto.principal 屬性指定的主體身分存取 HDFS。Presto 會使用 hive.hdfs.presto.keytab keytab 指定的 keytab 來驗證此主體身分。

Keytab 檔案必須散佈到叢集中執行 Presto 的每個節點。

關於 Keytab 檔案的其他資訊。

HDFS 線路加密

在啟用 HDFS 線路加密的 Kerberized Hadoop 叢集中,您可以透過使用 hive.hdfs.wire-encryption.enabled 屬性來啟用 Presto 存取 HDFS。

屬性名稱

描述

hive.hdfs.wire-encryption.enabled

啟用 HDFS 線路加密。可能的值為 truefalse

注意

根據 Presto 安裝組態,使用線路加密可能會影響查詢執行效能。

最終使用者模擬

模擬存取 HDFS

Presto 可以模擬執行查詢的最終使用者。如果使用者從命令列介面執行查詢,則最終使用者是與 Presto CLI 程序相關聯的使用者名稱,或是選用的 --user 選項引數。如果使用 HDFS 權限或 ACL,模擬最終使用者在存取 HDFS 時可以提供額外的安全性。

HDFS 權限和 ACL 在 HDFS 權限指南中說明。

使用 HDFS 模擬的 NONE 驗證

hive.hdfs.authentication.type=NONE
hive.hdfs.impersonation.enabled=true

當使用 NONE 驗證和模擬時,Presto 在存取 HDFS 時會模擬執行查詢的使用者。如Hadoop 中的模擬章節中所述,必須允許執行 Presto 的使用者模擬此使用者。不會使用 Kerberos。

使用 HDFS 模擬的 KERBEROS 驗證

hive.hdfs.authentication.type=KERBEROS
hive.hdfs.impersonation.enabled=true
hive.hdfs.presto.principal=presto@EXAMPLE.COM
hive.hdfs.presto.keytab=/etc/presto/hdfs.keytab

當使用 KERBEROS 驗證和模擬時,Presto 在存取 HDFS 時會模擬執行查詢的使用者。如Hadoop 中的模擬章節中所述,必須允許由 hive.hdfs.presto.principal 屬性指定的主體模擬此使用者。Presto 會使用 hive.hdfs.presto.keytab 指定的 keytab 來驗證 hive.hdfs.presto.principal

Keytab 檔案必須散佈到叢集中執行 Presto 的每個節點。

關於 Keytab 檔案的其他資訊。

模擬存取 Hive Metastore

Presto 目前不支援在存取 Hive Metastore 時模擬最終使用者。

Hadoop 中的模擬

為了使用使用 HDFS 模擬的 NONE 驗證使用 HDFS 模擬的 KERBEROS 驗證,必須將 Hadoop 叢集設定為允許執行 Presto 的使用者或主體模擬登入 Presto 的使用者。Hadoop 中的模擬是在檔案 core-site.xml 中設定。組態選項的完整說明可以在Hadoop 文件中找到。

關於 Keytab 檔案的其他資訊

Keytab 檔案包含用於驗證主體到 Kerberos KDC 的加密金鑰。這些加密金鑰必須安全儲存;您應該採取與保護 ssh 私密金鑰相同的預防措施來保護它們。

特別是,對 keytab 檔案的存取權限應該僅限於實際需要使用它們進行驗證的帳戶。實際上,這就是 Presto 程序執行的使用者。應該設定 keytab 檔案的擁有權和權限,以防止其他使用者讀取或修改檔案。

Keytab 檔案需要散佈到每個執行 Presto 的節點。在常見的部署情況下,所有節點上的 Hive 連接器組態都會相同。這表示 keytab 需要在每個節點上的相同位置。

您應該確保在散佈後,keytab 檔案在每個節點上都具有正確的權限。

授權

透過在 Hive 目錄屬性檔案中設定 hive.security 屬性,啟用 Hive 連接器的授權檢查。此屬性必須是下列其中一個值:

屬性值

描述

legacy (預設值)

強制執行的授權檢查很少,因此允許大多數操作。使用組態屬性 hive.allow-drop-tablehive.allow-rename-tablehive.allow-add-columnhive.allow-drop-columnhive.allow-rename-column

read-only

允許讀取資料或中繼資料的操作,例如 SELECT,但不允許任何寫入資料或中繼資料的操作,例如 CREATEINSERTDELETE

file

使用 Hive 組態屬性 security.config-file 指定的組態檔案來強制執行授權檢查。請參閱基於檔案的授權以瞭解詳細資訊。

sql-standard

只要使用者具有符合 SQL 標準的必要權限,就允許使用者執行操作。在此模式下,Presto 會根據 Hive 中繼資料庫中定義的權限,強制執行查詢的授權檢查。若要變更這些權限,請使用 GRANTREVOKE 命令。請參閱基於 SQL 標準的授權以瞭解詳細資訊。

ranger

允許使用者根據 Ranger Hive 服務中設定的授權原則執行操作。請參閱基於 Ranger 的授權以瞭解詳細資訊。

基於 SQL 標準的授權

啟用 sql-standard 安全性時,Presto 會強制執行與 Hive 相同的基於 SQL 標準的授權。

由於 Presto 的 ROLE 語法支援與 SQL 標準相符,而 Hive 並未完全遵循 SQL 標準,因此存在以下限制和差異:

  • 不支援 CREATE ROLE role WITH ADMIN

  • 必須啟用 admin 角色才能執行 CREATE ROLEDROP ROLE

  • 不支援 GRANT role TO user GRANTED BY someone

  • 不支援 REVOKE role FROM user GRANTED BY someone

  • 依預設,除了 admin 以外,使用者的所有角色都會在新使用者工作階段中啟用。

  • 可以透過執行 SET ROLE role 來選取特定角色。

  • SET ROLE ALL 會啟用使用者除了 admin 以外的所有角色。

  • 必須執行 SET ROLE admin 才能明確啟用 admin 角色。

基於檔案的授權

組態檔案是使用 JSON 指定的,由三個區段組成,每個區段都是規則清單,這些規則會按照組態檔案中指定的順序進行比對。系統會授予使用者來自第一個符合規則的權限。如果未指定,則所有 regex 預設為 .*

綱要規則

這些規則決定誰被視為綱要的擁有者。

  • user (選用):用於比對使用者名稱的 regex。

  • schema (選用):用於比對綱要名稱的 regex。

  • owner (必要):布林值,指出所有權。

資料表規則

這些規則決定授予特定資料表的權限。

  • user (選用):用於比對使用者名稱的 regex。

  • schema (選用):用於比對綱要名稱的 regex。

  • table (選用):用於比對資料表名稱的 regex。

  • privileges (必要):零或多個 SELECTINSERTDELETEOWNERSHIPGRANT_SELECT

工作階段屬性規則

這些規則決定誰可以設定工作階段屬性。

  • user (選用):用於比對使用者名稱的 regex。

  • property (選用):用於比對工作階段屬性名稱的 regex。

  • allowed (必要):布林值,指出是否可以設定此工作階段屬性。

請參閱以下範例。

{
  "schemas": [
    {
      "user": "admin",
      "schema": ".*",
      "owner": true
    },
    {
      "user": "guest",
      "owner": false
    },
    {
      "schema": "default",
      "owner": true
    }
  ],
  "tables": [
    {
      "user": "admin",
      "privileges": ["SELECT", "INSERT", "DELETE", "OWNERSHIP"]
    },
    {
      "user": "banned_user",
      "privileges": []
    },
    {
      "schema": "default",
      "table": ".*",
      "privileges": ["SELECT"]
    }
  ],
  "sessionProperties": [
    {
      "property": "force_local_scheduling",
      "allow": true
    },
    {
      "user": "admin",
      "property": "max_split_size",
      "allow": true
    }
  ]
}

基於 Ranger 的授權

Apache Ranger 是一個廣泛使用的框架,用於提供集中式安全管理。Ranger 支援各種元件外掛程式,以允許透過與元件整合來進行授權原則管理和驗證。Ranger Hive 外掛程式用於擴充 Hive 用戶端 (例如 Beeline) 的授權。Presto 的 Hive 連接器 Ranger 外掛程式可以與 Ranger 整合為存取控制系統,以針對使用 Ranger Hive 元件定義的原則設定的 Presto Hive 連接器查詢執行授權。當查詢提交至 Presto 時,Presto 會剖析並分析查詢,以瞭解使用者存取綱要和資料表等物件所需的權限。建立這些物件的清單後,Presto 會與 Ranger 服務通訊,以判斷要求是否有效。如果要求有效,則查詢會繼續執行。如果要求無效,因為使用者沒有查詢物件的必要權限,則會傳回錯誤。Ranger 原則會快取在 Presto 中,以提升效能。

驗證是在 Ranger 外部處理,例如使用 LDAP,而 Ranger 會使用已驗證的使用者和使用者群組來與原則定義建立關聯。

需求

在您設定 Presto 與 Apache Ranger 的任何整合之前,請確認以下先決條件:

Presto 協調器和工作站具有與 Ranger 服務通訊的適當網路存取權。通常是連接埠 6080。

必須使用 Apache Ranger 2.1.0 或更高版本

原則

原則是一組資源和相關權限的組合。Ranger 提供使用者介面,或者選擇性地提供 REST API,以建立和管理這些存取控制原則。

使用者、群組和角色

Apache Ranger 具有 UserGroups 同步機制,藉由此機制,使用者、群組和角色會從您與 Apache Ranger 設定的驗證系統中取得。

支援的授權

Ranger Hive 服務允許在綱要、資料表和資料行層級設定權限。請注意,若要限制特定使用者和群組的存取權,需要使用明確的拒絕條件設定 Ranger 原則。

依預設會啟用列出綱要、顯示資料表中繼資料和設定工作階段屬性的存取權。

組態屬性

屬性名稱

描述

預設值

hive.ranger.rest-endpoint

Ranger REST 服務的 URL 位址。目前不支援 Kerberos 驗證。

hive.ranger.refresh-policy-period

快取原則的重新整理間隔

60 秒

hive.ranger.policy.hive-servicename

Ranger Hive 外掛程式服務名稱

hive.ranger.service.basic-auth-username

針對基本 HTTP 驗證設定的 Ranger Hive 外掛程式使用者名稱。

hive.ranger.service.basic-auth-password

針對基本 HTTP 驗證設定的 Ranger Hive 外掛程式密碼。

hive.ranger.audit.path

Ranger 稽核組態 - Ranger 稽核檔案路徑

ranger.http-client.key-store-path

Ranger SSL 組態 - 用戶端金鑰儲存檔案路徑

ranger.http-client.key-store-password

Ranger SSL 組態 - 用戶端金鑰儲存密碼

ranger.http-client.trust-store-path

Ranger SSL 組態 - 用戶端信任儲存檔案路徑

ranger.http-client.trust-store-password

Ranger SSL 組態 - 用戶端信任儲存密碼