預存程序的安全和權限 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

預存程序的安全和權限

根據預設,所有使用者具有建立程序的權限。若要建立程序,您必須有 PL/pgSQL 語言的 USAGE 權限,此權限預設會授予 PUBLIC。根據預設,只有超級使用者和擁有者才有權限呼叫程序。如果超級使用者想要防止使用者建立預存程序,他們可以在 PL/pgSQL 上對使用者執行 REVOKE USAGE。

若要呼叫程序,您必須獲授予程序的 EXECUTE 權限。根據預設,新程序的 EXECUTE 權限會授予程序擁有者和超級使用者。如需詳細資訊,請參閱GRANT

根據預設,建立程序的使用者就是擁有者。根據預設,擁有者具有程序的 CREATE、DROP 和 EXECUTE 權限。超級使用者具備所有權限。

SECURITY 屬性控制程序對資料物件的存取權限。當您建立預存程序時,您可以將 SECURITY 屬性設為 DEFINER 或 INVOKER。如果您指定 SECURITY INVOKER,程序會使用程序叫用使用者的權限。如果您指定 SECURITY DEFINER,程序會使用程序擁有者的權限。INVOKER 為預設值。

因為 SECURITY DEFINER 程序是以擁有使用者的權限執行,請務必確保不能誤用程序。若要確保不能誤用 SECURITY DEFINER 程序,請執行下列動作:

  • 將 SECURITY DEFINER 程序的 EXECUTE 授予特定使用者,而非 PUBLIC。

  • 以結構描述名稱來限定程序需要存取的所有資料庫物件。例如,使用 myschema.mytable,而不只是 mytable

  • 如果您無法以結構描述來限定物件名稱,請在建立程序時使用 SET 選項來設定 search_path。設定 search_path 來排除不受信任使用者所能撰寫的任何結構描述。此方法防止此程序的任何發起人建立物件 (例如,資料表或檢視),而遮罩應該由程序使用的物件。如需 SET 選項的詳細資訊,請參閱 CREATE PROCEDURE

下列範例將 search_path 設為 admin,以確保從 admin 結構描述存取 user_creds 資料表,而不是從 public 或發起人的 search_path 中任何其他結構描述來存取。

CREATE OR REPLACE PROCEDURE sp_get_credentials(userid int, o_creds OUT varchar) AS $$ BEGIN SELECT creds INTO o_creds FROM user_creds WHERE user_id = $1; END; $$ LANGUAGE plpgsql SECURITY DEFINER -- Set a secure search_path SET search_path = admin;