本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
考量事項
以下是使用 RLS 政策時的考量事項:
Amazon Redshift 會將 RLS 政策套用至 SELECT、UPDATE 或 DELETE 陳述式。
Amazon Redshift 不會將 RLS 政策套用至 INSERT、COPY、ALTER TABLE APPEND 陳述式。
-
RLS 政策可以連接到資料表、檢視、延遲繫結檢視 LBVs) 和具體化檢視 MVs)。
資料列層級安全可搭配資料欄層級安全來保護您的資料。
針對來源關係開啟 RLS 時,Amazon Redshift 會針對超級使用者、已明確授予系統許可 IGNORE RLS 的使用者或 sys:secadmin 角色支援 ALTER TABLE APPEND 陳述式。在這種情況下,您可以執行 ALTER TABLE APPEND 陳述式,藉由從現有來源資料表移動資料來將資料列附加至目標資料表。Amazon Redshift 會將所有元組從來源關係移動到目標關係。目標關係的 RLS 狀態不會影響 ALTER TABLE APPEND 陳述式。
若要協助從其他資料倉儲系統移轉,您可以指定變數名稱和值,以設定和擷取用於連線的自訂工作階段內容變數。
下列範例會針對資料列層級安全 (RLS) 政策設定工作階段內容變數。
-- Set a customized context variable. SELECT set_config(‘app.category’, ‘Concerts’, FALSE); -- Create a RLS policy using current_setting() to get the value of a customized context variable. CREATE RLS POLICY policy_categories WITH (catgroup VARCHAR(10)) USING (catgroup = current_setting('app.category', FALSE)); -- Set correct roles and attach the policy on the target table to one or more roles. ATTACH RLS POLICY policy_categories ON tickit_category_redshift TO ROLE analyst, ROLE dbadmin;
如需如何設定和擷取自訂工作階段內容變數的詳細資訊,請前往 SET、SET_CONFIG、SHOW、 CURRENT_SETTING和 RESET。如需修改伺服器組態的一般詳細資訊,請前往 修改伺服器組態。
重要
在 RLS 政策中使用工作階段內容變數時,安全政策依賴於叫用政策的使用者或角色。在 RLS 政策中使用工作階段內容變數時,請小心避免安全漏洞。
在 DECLARE 和 FETCH 之間或後續 FETCH 陳述式之間使用 SET SESSION AUTHORIZATION 變更工作階段使用者,將不會根據 DECLARE 時間的使用者政策重新整理已就緒的計劃。當游標與受 RLS 保護的資料表搭配使用時,請避免變更工作階段使用者。
當檢視物件中的基底物件受到 RLS 保護時,附加至執行查詢之使用者的政策會套用至個別的基底物件。這與物件層級許可檢查不同,檢視擁有者的許可會根據檢視基礎物件進行檢查。您可以在查詢的 EXPLAIN 計畫輸出中檢視受到 RS 保護的關係。
在附加至使用者的關係的 RLS 政策中參照使用者定義函數 (UDF) 時,使用者必須擁有 UDF 的 EXECUTE 許可,才能查詢關係。
資料列層級安全性可能會限制最佳查詢效果。在大型資料集上部署受 RLS 保護的視觀表之前,我們建議您仔細評估查詢效能。
套用至最新繫結視觀表的資料列層級安全政策,可能會推入聯合資料表。這些 RLS 政策可能會顯示在外部處理引擎日誌檔中。
限制
下列是使用 RLS 政策時的限制:
-
RLS 政策無法連接到外部資料表和其他多種關係類型。如需詳細資訊,請參閱ATTACH RLS POLICY。
-
Amazon Redshift 可針對具有複雜聯結的特定 RLS 政策支援 SELECT 陳述式,但不支援 UPDATE 或 DELETE 陳述式。如果使用 UPDATE 或 DELETE,Amazon Redshift 會傳回以下錯誤:
ERROR: One of the RLS policies on target relation is not supported in UPDATE/DELETE.
-
每當在附加至使用者的關係的 RLS 政策中參照使用者定義函數 (UDF) 時,使用者必須擁有 UDF 的 EXECUTE 許可,才能查詢關係。
不支援相關子查詢。Amazon Redshift 會傳回以下錯誤:
ERROR: RLS policy could not be rewritten.
Amazon Redshift 不支援使用 RLS 進行資料共用。如果關係沒有關閉用於資料共用的 RLS,則取用者叢集上的查詢會失敗,並出現下列錯誤:
RLS-protected relation "rls_protected_table" cannot be accessed via datasharing query.
您可以使用 ALTER TABLE 命令搭配參數 ROW LEVEL SECURITY OFF FOR DATASHARES,關閉資料共用的 RLS。如需使用 ALTER TABLE 啟用或停用 RLS 的詳細資訊,請前往 ALTER TABLE。
在跨資料庫查詢中,Amazon Redshift 會阻止您讀取受 RLS 保護的關係。具有 IGNORE RLS 許可的使用者可以使用跨資料庫查詢存取受保護的關係。當沒有 IGNORE RLS 許可的使用者透過跨資料庫查詢存取受 RLS 保護的關係時,會出現下列錯誤:
RLS-protected relation "rls_protected_table" cannot be accessed via cross-database query.
ALTER RLS POLICY 只支援 USING ( using_predicate_exp ) 子句修改 RLS 政策。執行 ALTER RLS POLICY 時,您無法使用 WITH 子句修改 RLS 政策。
-
如果下列任一組態選項的值不符合工作階段的預設值,您就無法查詢已開啟資料列層級安全的關係:
enable_case_sensitive_super_attribute
enable_case_sensitive_identifier
downcase_delimited_identifier
如果您嘗試查詢已開啟資料列層級安全的關係,並看到「受 RLS 保護的關係不支援工作階段層級組太,因為區分大小寫設定與其預設值不同」的訊息,請考慮重設工作階段的組態選項。
當您佈建的叢集或無伺服器命名空間具有任何資料列層級安全性政策時,一般使用者會無法使用下列命令:
ALTER <current_user> SET enable_case_sensitive_super_attribute/enable_case_sensitive_identifier/downcase_delimited_identifier
建立 RLS 政策時,建議您變更一般使用者的預設組態選項設定,以符合建立政策時的工作階段組態選項設定。超級使用者和擁有 ALTER USER 權限的使用者可以使用參數群組設定或 ALTER USER 命令來執行此操作。如需有關參數群組的詳細資訊,請參閱《Amazon Redshift 管理指南》中的 Amazon Redshift 參數群組。如需 ALTER USER 命令的相關資訊,請參閱 ALTER USER。
-
使用 CREATE VIEW 命令的一般使用者,無法取代具有資料列層級安全政策的視觀表和近期繫結視觀表。若要以 RLS 政策取代視觀表或 LBV,請先卸離任何附加的 RLS 政策、取代視觀表或 LBV,然後重新附加政策。具有
sys:secadmin permission
的超級使用者和一般使用者都可以在具有 RLS 政策,但未卸離政策的視觀表或 LBV 上使用 CREATE VIEW。 -
具有資料列層級安全政策的視觀表無法參考系統資料表和系統視觀表。
-
一般視觀表所參考的近期繫結視觀表,不得為受 RLS 保護。
-
RLS 保護的關係和來自資料湖的巢狀資料,均無法在相同的查詢中存取。