使用適用於 PostgreSQL 的受信任語言延伸模組 - Amazon Aurora

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

使用適用於 PostgreSQL 的受信任語言延伸模組

PostgreSQL 的受信任語言延伸模組是用於建置 PostgreSQL 延伸模組的開放原始碼開發套件。它可讓您建置高效能 PostgreSQL 延伸模組,並在 Aurora PostgreSQL 資料庫叢集上安全地執行它們 透過使用適用於 PostgreSQL 的受信任語言延伸模組 (TLE),您可以建立 PostgreSQL 延伸模組,遵循記載的方法來擴充 PostgreSQL 功能。如需詳細資訊,請參閱 PostgreSQL 文件中的將相關物件封裝為延伸模組

TLE 的一個主要優點,就是您可以在未於 PostgreSQL 執行個體之下提供檔案系統存取權的環境中使用它。先前,安裝新的延伸模組需要存取檔案系統。TLE 移除了此條件約束。它提供一個開發環境,可讓您針對任何 PostgreSQL 資料庫 (包括在 Aurora PostgreSQL 資料庫叢集上執行的資料庫) 建立新的延伸模組。

TLE 的設計旨在防止存取對您使用 TLE 建立的延伸模組而言不安全的資源。其執行時間環境會限制任何延伸模組瑕疵對單一資料庫連線的影響。TLE 還可讓資料庫管理員對可以安裝延伸模組的人員進行精細控制,並提供用於執行延伸模組的許可模型。

Aurora PostgreSQL 14.5 版及更新版本支援 TLE。

受信任語言延伸模組開發環境和執行時間會封裝成 pg_tle PostgreSQL 延伸模組 1.0.1 版。它支持在 JavaScript,Perl,Tcl,PL/PGSQL 和 SQL 中創建擴展。您可以採取您安裝其他 PostgreSQL 延伸模組的同一方式,在 Aurora PostgreSQL 資料庫叢集中安裝 pg_tle 延伸模組。在設定了 pg_tle 之後,開發人員可以使用它,建立新的 PostgreSQL 延伸模組,稱為 TLE 延伸模組

在下列主題中,您可以找到如何設定受信任語言延伸模組,以及如何開始建立您自己的 TLE 延伸模組的相關資訊。

術語

為了協助您更好地了解受信任語言延伸模組,請檢視下列詞彙表以取得本主題中使用的術語。

適用於 PostgreSQL 的受信任語言延伸模組

適用於 PostgreSQL 的受信任語言延伸模組是封裝為 pg_tle 延伸模組之開放原始碼開發套件的正式名稱。它可以在任何 PostgreSQL 系統上使用。如需詳細資訊,請參閱中的「aws/pg_tle」。 GitHub

受信任語言延伸模組

受信任語言延伸模組是適用於 PostgreSQL 的受信任語言延伸模組的簡稱。此簡稱及其縮寫 (TLE) 也會在本文件中使用。

受信任語言

受信任語言是具有特定安全性屬性的程式設計或指令碼語言。例如,受信任語言通常會限制對檔案系統的存取,而且也會限制使用指定的聯網屬性。TLE 開發套件專為支援受信任語言而設計。PostgreSQL 支援數種不同的語言,這些語言用來建立受信任或不受信任的延伸模組。如需範例,請參閱 PostgreSQL 文件中的受信任和不受信任的 PL/Perl。當您使用受信任語言延伸模組建立延伸模組時,延伸模組本質上會使用受信任語言機制。

TLE 延伸模組

TLE 延伸模組是已使用受信任語言延伸模組 (TLE) 開發套件所建立的 PostgreSQL 延伸模組。

使用適用於 PostgreSQL 的受信任語言延伸模組的需求

以下是設定和使用 TLE 開發套件時的需求。

  • Aurora PostgreSQL 版本 - 僅在 Aurora PostgreSQL 14.5 版 及更新版本上支援受信任語言延伸模組。

  • 需要 rds_superuser 權限 - 若要設定 pg_tle 延伸模組,您的資料庫使用者角色必須具有 rds_superuser 角色的許可。根據預設,會將此角色授予建立 Aurora PostgreSQL 資料庫叢集postgres 使用者。

  • 需要自訂資料庫參數群組 – 您的 Aurora PostgreSQL 資料庫叢集必須搭配自訂資料庫參數群組進行設定。您會針對 Aurora PostgreSQL 資料庫叢集的寫入器執行個體使用自訂資料庫參數群組。

建立並套用自訂資料庫參數群組

請使用下列步驟建立自訂資料庫參數群組,並設定您的 Aurora PostgreSQL 資料庫叢集來使用該群組。

建立自訂資料庫參數群組,並將其與您的 Aurora PostgreSQL 資料庫叢集搭配使用。
  1. 登入 AWS Management Console,並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 從 Amazon RDS 功能表中,選擇 Parameter groups (參數群組)。

  3. 選擇 Create parameter group (建立參數群組)

  4. Parameter group details (參數群組詳細資訊) 頁面中,輸入下列資訊:

    • 針對 Parameter group family (參數群組系列),選擇 aurora-postgresql14。

    • 針對 Type (類型),選擇 DB Parameter Group (資料庫參數群組)。

    • 針對 Group name (群組名稱),在操作內容中給與您的參數群組一個有意義的名稱。

    • 針對 Description (描述),輸入有用的描述,以便您團隊中的其他成員可以輕鬆找到它。

  5. 選擇建立。您的自訂資料庫參數群組是在 AWS 區域中建立。您現在可以遵循下列步驟修改 Aurora PostgreSQL 資料庫叢集以使用它。

  6. 從 Amazon RDS 功能表中選擇 Databases (資料庫)。

  7. 從列出的 Aurora PostgreSQL 資料庫叢集中選擇您想要哪一個與 TLE 搭配使用,然後選擇 Modify (修改)。

  8. Modify DB cluster settings (修改資料庫叢集設定) 頁面中,尋找 Database options (資料庫選項),然後使用選取器選擇您的自訂資料庫參數群組。

  9. 選擇 Continue (繼續) 以儲存變更。

  10. 選擇 Apply immediately (立即套用),以便您可以繼續設定 Aurora PostgreSQL 資料庫叢集以使用 TLE。

若要繼續針對受信任語言延伸模組設定您的系統,請參閱 在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組

如需深入了解如何使用資料庫叢集和資料庫參數群組,請參閱 使用資料庫叢集參數群組

您可以避免在使用 CLI 命令時指定 --region 引數,方法是使用您的預設 AWS 區域來設定您的 AWS CLI。如需詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的組態基礎概念

建立自訂資料庫參數群組,並將其與您的 Aurora PostgreSQL 資料庫叢集搭配使用。
  1. AWS 區域請注意,在此步驟中,您會建立資料庫參數群組,以套用至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    對於LinuxmacOS、或Unix:

    aws rds create-db-parameter-group \ --region aws-region \ --db-parameter-group-name custom-params-for-pg-tle \ --db-parameter-group-family aurora-postgresql14 \ --description "My custom DB parameter group for Trusted Language Extensions"

    在Windows中:

    aws rds create-db-parameter-group ^ --region aws-region ^ --db-parameter-group-name custom-params-for-pg-tle ^ --db-parameter-group-family aurora-postgresql14 ^ --description "My custom DB parameter group for Trusted Language Extensions"

    您的自訂資料庫參數群組可在 AWS 區域中使用,因此您可以修改 Aurora PostgreSQL 資料庫叢集的寫入器執行個體以使用它。

  2. 使用此命modify-db-instanceAWS CLI令將自訂資料庫參數群組套用至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。 此命令會立即重新啟動作用中執行個體。

    對於LinuxmacOS、或Unix:

    aws rds modify-db-instance \ --region aws-region \ --db-instance-identifier your-writer-instance-name \ --db-parameter-group-name custom-params-for-pg-tle \ --apply-immediately

    在Windows中:

    aws rds modify-db-instance ^ --region aws-region ^ --db-instance-identifier your-writer-instance-name ^ --db-parameter-group-name custom-params-for-pg-tle ^ --apply-immediately

若要繼續針對受信任語言延伸模組設定您的系統,請參閱 在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組

如需詳細資訊,請參閱在資料庫執行個體中使用資料庫參數群組

在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組

下列步驟假設您的 Aurora PostgreSQL 資料庫叢集與自訂資料庫叢集參數群組相關聯。您可以針對這些步驟使用 AWS Management Console 或 AWS CLI。

當您在 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組時,可以將其安裝在特定資料庫中,供具有該資料庫許可的資料庫使用者使用。

設定受信任語言延伸模組

使用屬於 rds_superuser 群組 (角色) 成員的帳戶執行下列步驟。

  1. 登入 AWS Management Console,並開啟 Amazon RDS 主控台,網址為 https://console.aws.amazon.com/rds/

  2. 在導覽窗格中,選擇您的 Aurora PostgreSQL 資料庫叢集的寫入器執行個體

  3. 針對您的 Aurora PostgreSQL 資料庫叢集的寫入器執行個體開啟 Configuration (組態) 索引標籤。在執行個體詳細資訊之間,尋找 Parameter group (參數群組) 連結。

  4. 選擇連結以開啟與 Aurora PostgreSQL 資料庫叢集相關聯的自訂參數。

  5. Parameters (參數) 搜尋欄位中,輸入 shared_pre 以尋找 shared_preload_libraries 參數。

  6. 選擇 Edit parameters (編輯參數) 以存取屬性值。

  7. Values (值) 欄位中,將 pg_tle 新增至清單。使用逗號區隔值清單中的項目。

    
                                已新增 pg_tle 之 shared_preload_libraries 參數的影像。
  8. 重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,以便您對 shared_preload_libraries 參數所做的變更生效。

  9. 當執行個體可用時,請驗證 pg_tle 是否已初始化。使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,然後執行下列命令。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_tle (1 row)
  10. 在初始化 pg_tle 延伸模組之後,您現在可以建立延伸模組。

    CREATE EXTENSION pg_tle;

    您可以使用下列 psql 中繼命令,驗證是否已安裝延伸模組。

    labdb=> \dx List of installed extensions Name | Version | Schema | Description ---------+---------+------------+-------------------------------------------- pg_tle | 1.0.1 | pgtle | Trusted-Language Extensions for PostgreSQL plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
  11. 在設定時,將 pgtle_admin 角色授予您已針對 Aurora PostgreSQL 資料庫叢集建立的主要使用者名稱。如果您接受預設值,其為 postgres

    labdb=> GRANT pgtle_admin TO postgres; GRANT ROLE

    您可以使用 psql 中繼命令來驗證授予是否已發生,如下列範例所示。只有 pgtle_adminpostgres 角色會顯示在輸出中。如需詳細資訊,請參閱 了解 PostgreSQL 角色和許可

    labdb=> \du List of roles Role name | Attributes | Member of -----------------+---------------------------------+----------------------------------- pgtle_admin | Cannot login | {} postgres | Create role, Create DB +| {rds_superuser,pgtle_admin} | Password valid until infinity |...
  12. 使用 \q 中繼命令關閉 psql 工作階段。

    \q

若要開始建立 TLE 延伸模組,請參閱 範例:使用 SQL 建立受信任語言延伸模組

您可以避免在使用 CLI 命令時指定 --region 引數,方法是使用您的預設 AWS 區域來設定您的 AWS CLI。如需詳細資訊,請參閱《AWS Command Line Interface 使用者指南》中的組態基礎概念

設定受信任語言延伸模組
  1. 使用modify-db-parameter-groupAWS CLI指令加入pg_tleshared_preload_libraries參數。

    aws rds modify-db-parameter-group \ --db-parameter-group-name custom-param-group-name \ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_tle,ApplyMethod=pending-reboot" \ --region aws-region
  2. 使用此reboot-db-instanceAWS CLI命令將您的 Aurora PostgreSQL 資料庫叢集 RDS 用於 PostgreSQL 資料庫執行個體的寫pg_tle

    aws rds reboot-db-instance \ --db-instance-identifier writer-instance \ --region aws-region
  3. 當執行個體可用時,您可以驗證 pg_tle 是否已初始化。使用 psql 連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,然後執行下列命令。

    SHOW shared_preload_libraries; shared_preload_libraries -------------------------- rdsutils,pg_tle (1 row)

    在初始化 pg_tle 之後,您現在可以建立延伸模組。

    CREATE EXTENSION pg_tle;
  4. 在設定時,將 pgtle_admin 角色授予您已針對 Aurora PostgreSQL 資料庫叢集建立的主要使用者名稱。如果您接受預設值,其為 postgres

    GRANT pgtle_admin TO postgres; GRANT ROLE
  5. 關閉 psql 工作階段,如下所示。

    labdb=> \q

若要開始建立 TLE 延伸模組,請參閱 範例:使用 SQL 建立受信任語言延伸模組

適用於 PostgreSQL 的受信任語言延伸模組概觀

適用於 PostgreSQL 的受信任語言延伸模組是一種 PostgreSQL 延伸模組,而您使用您設定其他 PostgreSQL 延伸模組的同一方式,將其安裝在 Aurora PostgreSQL 資料庫叢集中。在 pgAdmin 用戶端工具中範例資料庫的下列影像中,您可以檢視構成 pg_tle 延伸模組的一些元件。


                此圖顯示構成 TLE 開發套件的一些元件。

您可以查看下列詳細資訊。

  1. 適用於 PostgreSQL 的受信任語言延伸模組 (TLE) 開發套件會封裝為 pg_tle 延伸模組。因此,pg_tle 會新增至其安裝所在資料庫的可用延伸模組。

  2. TLE 有其自己的結構描述 (pgtle)。此結構描述包含協助程式函數 (3),用於安裝和管理您建立的延伸模組。

  3. TLE 提供了十幾個協助程式函數,用於安裝、註冊和管理您的延伸模組。若要進一步了解這些函數,請參閱適用於 PostgreSQL 的受信任語言延伸模組的函數參考

pg_tle 延伸套件的其他元件包含下列項目:

  • pgtle_admin 角色 – 安裝 pg_tle 延伸模組時會建立 pgtle_admin 角色。此角色具有特殊權限,且應如此對待。強烈建議您在將 pgtle_admin 角色授予資料庫使用者時遵循最低權限原則。換句話說,只將 pgtle_admin 角色授予資料庫使用者,允許其建立、安裝和管理新的 TLE 延伸模組,例如 postgres

  • pgtle.feature_info 資料表pgtle.feature_info 資料表是受保護的資料表,其中包含 TLE、掛鉤,以及其使用的自訂預存程序和函數的相關資訊。如果具有 pgtle_admin 權限,則您可以使用下列受信任語言延伸模組函數,在資料表中新增和更新該資訊。

針對 Aurora PostgreSQL 建立 TLE 延伸模組

您可以在任何已安裝延伸模組的 Aurora PostgreSQL 資料庫叢集 中安裝使用 TLE 建立的任何 pg_tle 延伸模組。pg_tle 延伸模組的範圍會限定在其安裝所在的 PostgreSQL 資料庫。您使用 TLE 建立的延伸模組,其範圍會限定在相同的資料庫。

使用各種 pgtle 函數來安裝構成 TLE 延伸模組的程式碼。下列受信任語言延伸模組函數全都需要 pgtle_admin 角色。

範例:使用 SQL 建立受信任語言延伸模組

下列範例說明如何建立名為 pg_distance 的 TLE 延伸模組,其中包含一些 SQL 函數,用於使用不同的公式計算距離。在清單中,您可以找到用於計算曼哈頓距離的函數,以及計算歐幾里得距離的函數。如需這些公式之間差異的詳細資訊,請參閱 Wikipedia 中的出租車幾何歐幾里得幾何

如果您已按照在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組中所述設定 pg_tle 延伸模組,則可以在自己的 Aurora PostgreSQL 資料庫叢集 中使用此範例。

注意

您必須具有 pgtle_admin 角色的權限才能遵循此程序。

建立範例 TLE 延伸模組

下列步驟會使用名為 labdb 的範例資料庫。此資料庫是由 postgres 主要使用者所擁有。postgres 角色也具有 pgtle_admin 角色的權限。

  1. 使用 psql 連線到 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 複製下列程式碼並將其貼入 psql 工作階段主控台中,來建立名為 pg_distance 的 TLE 延伸模組。

    SELECT pgtle.install_extension ( 'pg_distance', '0.1', 'Distance functions for two points', $_pg_tle_$ CREATE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int) RETURNS float8 AS $$ SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm); $$ LANGUAGE SQL; CREATE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 1); $$ LANGUAGE SQL; CREATE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 2); $$ LANGUAGE SQL; $_pg_tle_$ );

    您會看到如下輸出。

    install_extension --------------- t (1 row)

    構成 pg_distance 延伸模組的成品現在已安裝在您的資料庫中。這些成品包括延伸模組的控制檔和程式碼,這些是必須存在的項目,如此才能使用 CREATE EXTENSION 命令建立延伸模組。換句話說,您仍然需要建立延伸模組,以使其函數可供資料庫使用者使用。

  3. 若要建立延伸模組,請使用 CREATE EXTENSION 命令,如您對任何其他延伸模組所做一樣。與其他延伸模組一樣,資料庫使用者需要在資料庫中具有 CREATE 權限。

    CREATE EXTENSION pg_distance;
  4. 若要測試 pg_distance TLE 延伸模組,您可以使用它,計算四點之間的曼哈頓距離

    labdb=> SELECT manhattan_dist(1, 1, 5, 5); 8

    若要計算同一組點之間的歐幾里得距離,您可以使用下列命令。

    labdb=> SELECT euclidean_dist(1, 1, 5, 5); 5.656854249492381

pg_distance 延伸模組會在資料庫中載入函數,並使其可供具有資料庫權限的任何使用者使用。

修改 TLE 延伸模組

若要改善此 TLE 延伸模組中封裝之函數的查詢效能,請將下列兩個 PostgreSQL 屬性新增至其規格。

  • IMMUTABLEIMMUTABLE 屬性確保查詢最佳化工具可以使用最佳化來改善查詢回應時間。如需詳細資訊,請參閱 PostgreSQL 文件中的函數波動類別

  • PARALLEL SAFEPARALLEL SAFE 屬性是允許 PostgreSQL 以平行模式執行函數的另一個屬性。如需詳細資訊,請參閱 PostgreSQL 文件中的 CREATE FUNCTION

在下列範例中,您可以看到如何使用 pgtle.install_update_path 函數將這些屬性新增到每個函數,以建立 pg_distance TLE 延伸模組的版本 0.2。如需此函數狀態的詳細資訊,請參閱 pgtle.install_update_path。您必須具有 pgtle_admin 角色才能執行此任務。

更新現有 TLE 延伸模組並指定預設版本
  1. 使用 psql 或其他用戶端工具 (例如 pgAdmin),連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體

    psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 複製下列程式碼並將其貼入 psql 工作階段主控台中,來修改現有的 TLE 延伸模組。

    SELECT pgtle.install_update_path ( 'pg_distance', '0.1', '0.2', $_pg_tle_$ CREATE OR REPLACE FUNCTION dist(x1 float8, y1 float8, x2 float8, y2 float8, norm int) RETURNS float8 AS $$ SELECT (abs(x2 - x1) ^ norm + abs(y2 - y1) ^ norm) ^ (1::float8 / norm); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION manhattan_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 1); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION euclidean_dist(x1 float8, y1 float8, x2 float8, y2 float8) RETURNS float8 AS $$ SELECT dist(x1, y1, x2, y2, 2); $$ LANGUAGE SQL IMMUTABLE PARALLEL SAFE; $_pg_tle_$ );

    您會看到如下回應:

    install_update_path --------------------- t (1 row)

    您可以將此版本的延伸模組設為預設版本,這樣資料庫使用者就不必在資料庫中建立或更新延伸模組時指定版本。

  3. 若要指定 TLE 延伸模組的修改版本 (版本 0.2) 為預設版本,請使用 pgtle.set_default_version 函數,如下列範例所示。

    SELECT pgtle.set_default_version('pg_distance', '0.2');

    如需此函數狀態的詳細資訊,請參閱 pgtle.set_default_version

  4. 在程式碼就位之後,您可以使用 ALTER EXTENSION ... UPDATE 命令,以尋常方式更新已安裝的 TLE 延伸模組,如這裡所示:

    ALTER EXTENSION pg_distance UPDATE;

從資料庫中捨棄您的 TLE 延伸模組

您可以採取您對其他 PostgreSQL 延伸模組所用的同一方式,使用 DROP EXTENSION 命令來捨棄 TLE 延伸模組。捨棄延伸模組並不會移除構成延伸模組的安裝檔案,因而允許使用者重新建立延伸模組。若要移除延伸模組及其安裝檔案,請執行下列兩步驟程序。

捨棄 TLE 延伸模組並移除其安裝檔案
  1. 使用 psql 或其他用戶端工具,連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    psql --host=cluster-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=dbname
  2. 捨棄延伸模組,如同您對任何 PostgreSQL 延伸模組所做一般。

    DROP EXTENSION your-TLE-extension

    例如,如果您如範例:使用 SQL 建立受信任語言延伸模組所述建立 pg_distance 延伸模組,則可以捨棄延伸模組,如下所示。

    DROP EXTENSION pg_distance;

    您會看到輸出,確認已捨棄延伸模組,如下所示。

    DROP EXTENSION

    此時,延伸模組在資料庫中不再處於作用中狀態。不過,其安裝檔案和控制檔案仍然可在資料庫中使用,因此資料庫使用者可以再次建立延伸模組 (如果想要的話)。

    • 如果想要延伸模組檔案保持不變,以便資料庫使用者可以建立您的 TLE 延伸模組,您可以在此停止。

    • 如果想要移除所有構成延伸模組的檔案,請繼續下一個步驟。

  3. 若要移除延伸模組的所有安裝檔案,請使用 pgtle.uninstall_extension 函數。此函數會移除延伸模組的所有程式碼和控制檔。

    SELECT pgtle.uninstall_extension('your-tle-extension-name');

    例如,若要移除所有 pg_distance 安裝檔案,請使用下列命令。

    SELECT pgtle.uninstall_extension('pg_distance'); uninstall_extension --------------------- t (1 row)

解除安裝適用於 PostgreSQL 的受信任語言延伸模組

如果您再也不要使用 TLE 建立自己的 TLE 延伸模組,則可以捨棄 pg_tle 延伸模組並移除所有成品。此動作包括捨棄資料庫中的任何 TLE 延伸模組,以及捨棄 pgtle 結構描述。

從資料庫中捨棄 pg_tle 延伸模組及其結構描述
  1. 使用 psql 或其他用戶端工具,連線至 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    psql --host=cluster-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=dbname
  2. 從資料庫中捨棄 pg_tle 延伸模組。如果您自己的 TLE 延伸模組仍在資料庫中執行,您也需要捨棄這些延伸模組。若要這樣做,您可以使用 CASCADE 關鍵字,如下所示。

    DROP EXTENSION pg_tle CASCADE;

    如果 pg_tle 延伸模組在資料庫中仍未作用中,則您不需要使用 CASCADE 關鍵字。

  3. 捨棄 pgtle 結構描述。此動作會移除資料庫中的所有管理函數。

    DROP SCHEMA pgtle CASCADE;

    此命令會在程序完成時傳回下列內容。

    DROP SCHEMA

    pg_tle 延伸模組、其結構描述和函數,以及所有成品都會遭到移除。若要使用 TLE 建立新的延伸模組,請再次完成設定程序。如需詳細資訊,請參閱在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組

搭配您的延伸模組使用 PostgreSQL 掛鉤

掛鉤是 PostgreSQL 中提供的回呼機制,允許開發人員在一般資料庫操作期間呼叫自訂函數或其他常式。TLE 開發套件支援 PostgreSQL 掛鉤,以便您可以在執行時整合自訂函數與 PostgreSQL 行為。例如,您可以使用掛鉤,將身分驗證程序與您自己的自訂程式碼建立關聯,或因應您的特定需求修改查詢規劃和執行程序。

您的 TLE 延伸模組可以使用掛鉤。如果掛鉤在範圍內是全域的,則其在所有資料庫之中都適用。因此,如果您的 TLE 延伸模組使用全域掛鉤,則您需要在使用者可以存取的所有資料庫中建立 TLE 延伸模組。

當使用 pg_tle 延伸模組來建置您自己的受信任語言延伸模組時,您可以使用 SQL API 中可用的掛鉤來建置延伸模組的函數。您應該使用 pg_tle 註冊任何掛鉤。對於某些掛鉤,您可能還需要設定各種組態參數。例如,passcode 檢查掛鉤可以設為開啟、關閉或需要。如需可用 pg_tle 掛鉤之特定需求的詳細資訊,請參閱 適用於 PostgreSQL 的受信任語言延伸模組的掛鉤參考

範例:建立使用 PostgreSQL 掛鉤的延伸模組

本節中討論的範例使用 PostgreSQL 掛鉤,來檢查在特定 SQL 操作期間提供的密碼,並防止資料庫使用者將其密碼設為 password_check.bad_passwords 資料表中包含的任何密碼。該資料表包含前十大最常用但容易破解的密碼選擇。

若要在您的 Aurora PostgreSQL 資料庫叢集 中設定此範例,您必須已安裝受信任語言延伸模組。如需詳細資訊,請參閱 在您的 Aurora PostgreSQL 資料庫叢集中設定受信任語言延伸模組

設定密碼檢查掛鉤範例
  1. 使用 psql 連線到 Aurora PostgreSQL 資料庫叢集的寫入器執行個體。

    psql --host=db-instance-123456789012.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password --dbname=labdb
  2. 密碼檢查掛鉤程式碼清單 中複製程式碼,並將其貼入您的資料庫中。

    SELECT pgtle.install_extension ( 'my_password_check_rules', '1.0', 'Do not let users use the 10 most commonly used passwords', $_pgtle_$ CREATE SCHEMA password_check; REVOKE ALL ON SCHEMA password_check FROM PUBLIC; GRANT USAGE ON SCHEMA password_check TO PUBLIC; CREATE TABLE password_check.bad_passwords (plaintext) AS VALUES ('123456'), ('password'), ('12345678'), ('qwerty'), ('123456789'), ('12345'), ('1234'), ('111111'), ('1234567'), ('dragon'); CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext); CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean) RETURNS void AS $$ DECLARE invalid bool := false; BEGIN IF password_type = 'PASSWORD_TYPE_MD5' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE ('md5' || md5(bp.plaintext || username)) = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common password dictionary'; END IF; ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE bp.plaintext = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common common password dictionary'; END IF; END IF; END $$ LANGUAGE plpgsql SECURITY DEFINER; GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC; SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck'); $_pgtle_$ );

    將延伸模組載入資料庫後,您會看到如下輸出。

    install_extension ------------------- t (1 row)
  3. 在仍然連線到資料庫時,您現在可以建立延伸模組。

    CREATE EXTENSION my_password_check_rules;
  4. 您可以使用下列 psql 中繼命令,確認已在資料庫中建立延伸模組。

    \dx List of installed extensions Name | Version | Schema | Description -------------------------+---------+------------+------------------------------------------------------------- my_password_check_rules | 1.0 | public | Prevent use of any of the top-ten most common bad passwords pg_tle | 1.0.1 | pgtle | Trusted-Language Extensions for PostgreSQL plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language (3 rows)
  5. 開啟另一個要使用 AWS CLI 的終端機工作階段。您需要修改自訂資料庫參數群組,以開啟密碼檢查掛鉤。若要這麼做,請使用 modify-db-parameter-groupCLI 命令,如下列範例所示。

    aws rds modify-db-parameter-group \ --region aws-region \ --db-parameter-group-name your-custom-parameter-group \ --parameters "ParameterName=pgtle.enable_password_check,ParameterValue=on,ApplyMethod=immediate"

    可能需要幾分鐘,對參數群組設定所做的變更才會生效。不過,此參數是動態參數,因此您不需要重新啟動 Aurora PostgreSQL 資料庫叢集的寫入器執行個體,設定即可生效。

  6. 開啟 psql 工作階段並查詢資料庫,以驗證密碼檢查掛鉤是否已開啟。

    labdb=> SHOW pgtle.enable_password_check; pgtle.enable_password_check ----------------------------- on (1 row)

密碼檢查掛鉤現在處於作用中狀態。您可以建立新角色並使用其中一個錯誤密碼來對它進行測試,如下列範例所示。

CREATE ROLE test_role PASSWORD 'password'; ERROR: Cannot use passwords from the common password dictionary CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 21 at RAISE SQL statement "SELECT password_check.passcheck_hook( $1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"

為了方便閱讀,輸出已經過格式化處理。

下列範例顯示 pgsql 互動式中繼命令 \password 行為也受密碼檢查掛鉤的影響。

postgres=> SET password_encryption TO 'md5'; SET postgres=> \password Enter new password for user "postgres":***** Enter it again:***** ERROR: Cannot use passwords from the common password dictionary CONTEXT: PL/pgSQL function password_check.passcheck_hook(text,text,pgtle.password_types,timestamp with time zone,boolean) line 12 at RAISE SQL statement "SELECT password_check.passcheck_hook($1::pg_catalog.text, $2::pg_catalog.text, $3::pgtle.password_types, $4::pg_catalog.timestamptz, $5::pg_catalog.bool)"

如果需要,您可以捨棄此 TLE 延伸模組並解除安裝其來源檔案。如需詳細資訊,請參閱從資料庫中捨棄您的 TLE 延伸模組

密碼檢查掛鉤程式碼清單

此處顯示的範例程式碼定義了 my_password_check_rules TLE 延伸模組的規格。當您複製此程式碼並將其貼入資料庫中時,my_password_check_rules 延伸模組的程式碼會載入至資料庫,而且 password_check 掛鉤會進行註冊以供該延伸模組使用。

SELECT pgtle.install_extension ( 'my_password_check_rules', '1.0', 'Do not let users use the 10 most commonly used passwords', $_pgtle_$ CREATE SCHEMA password_check; REVOKE ALL ON SCHEMA password_check FROM PUBLIC; GRANT USAGE ON SCHEMA password_check TO PUBLIC; CREATE TABLE password_check.bad_passwords (plaintext) AS VALUES ('123456'), ('password'), ('12345678'), ('qwerty'), ('123456789'), ('12345'), ('1234'), ('111111'), ('1234567'), ('dragon'); CREATE UNIQUE INDEX ON password_check.bad_passwords (plaintext); CREATE FUNCTION password_check.passcheck_hook(username text, password text, password_type pgtle.password_types, valid_until timestamptz, valid_null boolean) RETURNS void AS $$ DECLARE invalid bool := false; BEGIN IF password_type = 'PASSWORD_TYPE_MD5' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE ('md5' || md5(bp.plaintext || username)) = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common password dictionary'; END IF; ELSIF password_type = 'PASSWORD_TYPE_PLAINTEXT' THEN SELECT EXISTS( SELECT 1 FROM password_check.bad_passwords bp WHERE bp.plaintext = password ) INTO invalid; IF invalid THEN RAISE EXCEPTION 'Cannot use passwords from the common common password dictionary'; END IF; END IF; END $$ LANGUAGE plpgsql SECURITY DEFINER; GRANT EXECUTE ON FUNCTION password_check.passcheck_hook TO PUBLIC; SELECT pgtle.register_feature('password_check.passcheck_hook', 'passcheck'); $_pgtle_$ );