了解 PostgreSQL 角色和許可 - Amazon Aurora

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

了解 PostgreSQL 角色和許可

當您使用建立 Aurora PostgreSQL 資料庫叢集 個體時 AWS Management Console,系統會同時建立一個管理員帳戶。依預設,其名稱為 postgres,如下列螢幕擷取畫面所示:

Create database (建立資料庫) 頁面中的憑證預設登入身分為 postgres。

您可以選擇其他名稱,而不是接受預設值 (postgres)。若是如此,則選擇的名稱必須以字母開頭,且介於 1 到 16 個英數字元之間。為簡單起見,我們在本指南中使用主要使用者帳戶的預設值 (postgres),來指稱主要使用者帳戶。

如果您使用create-db-cluster AWS CLI 而不是 AWS Management Console,您可以透過使用master-username參數傳遞使用者名稱來建立使用者名稱。如需詳細資訊,請參閱步驟 2:建立 Aurora PostgreSQL 資料庫叢集

無論您使用 AWS Management Console、或 Amazon RDS API AWS CLI,以及使用預設postgres名稱還是選擇其他名稱,此第一個資料庫使用者帳戶都是該rds_superuser群組的成員,並具有rds_superuser權限。

了解 rds_superuser 角色

於 PostgreSQL 中,角色可定義使用者、群組或授予群組或使用者對資料庫中各種物件的一組特定權限。CREATE USERCREATE GROUP 的 PostgreSQL 命令已為更為通用的 CREATE ROLE 所取代,其具有可區分資料庫使用者的特定屬性。資料庫使用者可視為具有 LOGIN 權限的角色。

注意

CREATE USERCREATE GROUP 命令仍可使用。如需詳細資訊,請參閱 PostgreSQL 文件中的資料庫角色

postgres 使用者是 Aurora PostgreSQL 資料庫叢集上具最高權限的資料庫使用者。其具有下列 CREATE ROLE 陳述式所定義的特性。

CREATE ROLE postgres WITH LOGIN NOSUPERUSER INHERIT CREATEDB CREATEROLE NOREPLICATION VALID UNTIL 'infinity'

屬性 NOSUPERUSERNOREPLICATIONINHERIT,和 VALID UNTIL 'infinity' 為 CREATE ROLE 的預設選項,除非另有指定。

根據預設,postgres 具有授與 rds_superuser 角色的權限,以及建立角色和資料庫的許可。rds_superuser 角色可讓 postgres 使用者執行下列動作:

  • 新增可與 Aurora PostgreSQL。如需詳細資訊,請參閱使用擴充功能和外部資料包裝函式

  • 建立使用者的角色,並授予使用者權限。如需詳細資訊,請參閱 PostgreSQL 文件中的 CREATE ROLEGRANT

  • 建立資料庫。如需詳細資訊,請參閱 PostgreSQL 文件中的 CREATE DATABASE

  • rds_superuser 權限授予並無這些權限的使用者角色,並視需要撤銷這些權限。建議您僅將此角色授予執行超級使用者任務的使用者。換句話說,您可以將此角色授予資料庫管理員 (DBA) 或系統管理員。

  • 對不具 rds_replication 角色的資料庫使用者授予 (和撤銷) rds_superuser 角色。

  • 對不具 rds_password 角色的資料庫使用者授予 (和撤銷) rds_superuser 角色。

  • 使用 pg_stat_activity 檢視,取得有關所有資料庫連線的狀態資訊。如有需要,rds_superuser 可使用 pg_terminate_backendpg_cancel_backend 停止任何連線。

CREATE ROLE postgres... 陳述式中,您可看到 postgres 使用者角色明確禁止 PostgreSQL superuser 權限。Aurora PostgreSQL 為受管服務,因此您無法存取主機作業系統,也無法使用 PostgreSQL superuser 帳户進行連線。許多需要在獨立 PostgreSQL 上進行 superuser 存取的任務是由 Aurora 自動管理。

如需有關授予權限的詳細資訊,請參閱 PostgreSQL 文件中的 GRANT

rds_superuser 角色是 Aurora PostgreSQL 資料庫叢集中數個預先定義角色的其中一個。

注意

在 PostgreSQL 13 和更早版本中,預先定義角色稱為預設角色。

於下列清單中,您可以找到為新的 Aurora PostgreSQL 資料庫叢集自動建立的一些其他預先定義角色。預先定義的角色及其權限無法進行變更。您無法為這些預先定義角色停止、重新命名或修改權限。嘗試這麼做會造成錯誤。

  • rds_password – 可變更密碼並為資料庫使用者設定密碼約束的角色。依預設,此rds_superuser角色會授與此角色,而且可以將角色授與資料庫使用者。如需詳細資訊,請參閱 控制使用者對 PostgreSQL 資料庫的存取

    • 對於 14 版本以上的 RDS for PostgreSQL,rds_password角色可以為資料庫使用者和具rds_superuser有角色的使用者變更密碼並設定密碼限制。從 RDS for PostgreSQL 版本 14 及更新版本,rds_password角色可以變更密碼並僅針對資料庫使用者設定密碼限制。只有具有rds_superuser角色的使用者可對具有角色的其他使用者執行這些動rds_superuser作。

  • rdsadmin – 為處理具有 superuser 權限的管理員將在獨立 PostgreSQL 資料庫上執行的許多管理任務而建立的角色。此角色由 Aurora PostgreSQL 在內部用於許多管理任務。

如要查看所有預先定義角色,您可連接至 Aurora PostgreSQL 資料庫叢集的主要執行個體 ,並使用 psql \du 中繼命令。輸出看似如下:

List of roles Role name | Attributes | Member of --------------+-----------------------------------+------------------------------------ postgres | Create role, Create DB +| {rds_superuser} | Password valid until infinity | rds_superuser | Cannot login | {pg_monitor,pg_signal_backend, | +| rds_replication,rds_password} ...

於輸出中,您可看到 rds_superuser 並非資料庫使用者角色 (無法登入),但其具有許多其他角色的權限。您還可以看到資料庫使用者 postgresrds_superuser 角色的成員。如前所述,postgres 是 Amazon RDS 主控台 Create database (建立資料庫) 頁面中的預設值。若選擇其他名稱,則該名稱將顯示於角色清單中。

注意

Aurora PostgreSQL 15.2 和 14.7 版導入了限制性的 rds_superuser 角色行為。即使已將 rds_superuser 角色授予 Aurora PostgreSQL 使用者,使用者仍需被授予對應資料庫的 CONNECT 權限才能連線。在 Aurora PostgreSQL 14.7 和 15.2 版之前,只要已將 rds_superuser 角色授予使用者,該使用者就能夠連線到任何資料庫和系統資料表。這種限制性行為符合 Amazon Aurora 對持續改善安全性的承諾。 AWS

如果您的應用程式受到上述增強功能的影響,請更新應用程式中的個別邏輯。

控制使用者對 PostgreSQL 資料庫的存取

PostgreSQL 中的新資料庫會永遠使用資料庫 public 結構描述中的一組預設權限建立,允許所有資料庫使用者和角色建立物件。例如,這些權限可讓資料庫使用者連接至資料庫,並在連線時建立暫存資料表。

為了對您 Aurora PostgreSQL 資料庫叢集主節點上建立之資料庫執行個體的使用者存取進行更好地控制,我們建議您撤消這些預設的 public 權限。完成此作業後,您可更精細地為資料庫使用者授予特定權限,如下列程序所示。

如要設定新資料庫執行個體的角色和權限

假設您正在一個剛建立的 Aurora PostgreSQL 資料庫叢集上設定資料庫,以供多位研究人員使用,其皆需要資料庫的讀寫存取權。

  1. 使用 psql (或 pgAdmin) 連接至您 Aurora PostgreSQL 資料庫叢集上的主資料庫執行個體:

    psql --host=your-cluster-instance-1.666666666666.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password

    出現提示時,輸入您的密碼。psql 用戶端連接並顯示預設管理連接資料庫 postgres=> 作為提示。

  2. 如要防止資料庫使用者在 public 結構描述中建立物件,請執行下列動作:

    postgres=> REVOKE CREATE ON SCHEMA public FROM PUBLIC; REVOKE
  3. 接下來,您會建立新的資料庫執行個體:

    postgres=> CREATE DATABASE lab_db; CREATE DATABASE
  4. 從此新資料庫上 PUBLIC 結構描述撤消所有權限。

    postgres=> REVOKE ALL ON DATABASE lab_db FROM public; REVOKE
  5. 建立一個資料庫使用者的角色。

    postgres=> CREATE ROLE lab_tech; CREATE ROLE
  6. 使具有此角色的資料庫使用者可連接至資料庫。

    postgres=> GRANT CONNECT ON DATABASE lab_db TO lab_tech; GRANT
  7. 授予具 lab_tech 角色的所有使用者此資料庫的所有權限。

    postgres=> GRANT ALL PRIVILEGES ON DATABASE lab_db TO lab_tech; GRANT
  8. 建立資料庫使用者,如下所示:

    postgres=> CREATE ROLE lab_user1 LOGIN PASSWORD 'change_me'; CREATE ROLE postgres=> CREATE ROLE lab_user2 LOGIN PASSWORD 'change_me'; CREATE ROLE
  9. 授予這兩個使用者與 lab_tech 角色關聯的權限:

    postgres=> GRANT lab_tech TO lab_user1; GRANT ROLE postgres=> GRANT lab_tech TO lab_user2; GRANT ROLE

至此,lab_user1lab_user2 便可連接 lab_db 資料庫。此範例並未遵循企業使用的最佳實務,其中可能包括建立多個資料庫執行個體、不同的結構描述,及授予有限的權限。如需更多完整資訊和其他方案,請參閱管理 PostgreSQL 使用者和角色

如需有關 PostgreSQL 資料庫中權限的詳細資訊,請參閱 PostgreSQL 文件中的 GRANT 命令。

委派和控制使用者密碼管理

作為 DBA,您可能想要委派管理使用者密碼。或者,您可能想要防止資料庫使用者變更其密碼或重新設定密碼約束 (例如密碼生命週期)。如要確保只有您選擇的資料庫使用者才可變更密碼設定,您可開啟受限制的密碼管理功能。啟動此功能時,只有那些已被授予 rds_password 角色的資料庫使用者才可管理密碼。

注意

如要使用受限制的密碼管理,您的 Aurora PostgreSQL 資料庫叢集必須執行 Amazon Aurora PostgreSQL 10.6 或更新版本。

依預設,此功能為 off,如下列所示:

postgres=> SHOW rds.restrict_password_commands; rds.restrict_password_commands -------------------------------- off (1 row)

如要開啟此功能,請使用自訂參數群組,並將 rds.restrict_password_commands 的設定變更為 1。請務必重新啟動您的 Aurora PostgreSQL 的主資料庫執行個體 ,以使設定生效。

啟用此功能後,下列 SQL 命令需要 rds_password 權限:

CREATE ROLE myrole WITH PASSWORD 'mypassword'; CREATE ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2023-01-01'; ALTER ROLE myrole WITH PASSWORD 'mypassword' VALID UNTIL '2023-01-01'; ALTER ROLE myrole WITH PASSWORD 'mypassword'; ALTER ROLE myrole VALID UNTIL '2023-01-01'; ALTER ROLE myrole RENAME TO myrole2;

若密碼使用 MD5 雜湊演算法,則重新命名角色 (ALTER ROLE myrole RENAME TO newname) 也會受到限制。

啟用此功能後,嘗試使用任何這些 SQL 命令,而不使用 rds_password 角色權限會產生下列錯誤:

ERROR: must be a member of rds_password to alter passwords

建議您僅對專用於密碼管理的一些角色授予 rds_password。若您授予不具 rds_superuser 權限之資料庫使用者 rds_password 權限,則還需要授予其 CREATEROLE 屬性。

確定您驗證用戶端上的密碼需求,例如到期時間和需要的複雜度。若您使用自己的用戶端公用程式進行與密碼相關的變更,則該公用程式必須為 rds_password 的成員並具有 CREATE ROLE 權限。

使用 SCRAM 進行 PostgreSQL 密碼加密

Salted Challenge Response Authentication Mechanism (SCRAM) 是 PostgreSQL 預設訊息摘要 (MD5) 演算法的替代選項,用於加密密碼。SCRAM 身分驗證機制被認為比 MD5 更安全。若要進一步了解這兩種不同的密碼保護方法,請參閱 PostgreSQL 文件中的 Password Authentication (密碼身分驗證)。

建議您使用 SCRAM 作為 Aurora PostgreSQL 資料庫叢集的密碼加密配置,而不是使用 MD5。從 Aurora PostgreSQL 14 版本開始,所有可用的 Aurora PostgreSQL 版本 (包括版本 10、11、12、13 和 14) 都支援 SCRAM。這是一種加密的挑戰回應機制,使用 scram-sha-256 演算法進行密碼身分驗證和加密。

您可能需要更新程式庫,用戶端應用程式才會支援 SCRAM。例如,42.2.0 之前的 JDBC 版本不支援 SCRAM。如需詳細資訊,請參閱 PostgreSQL JDBC 驅動程式文件中的 PostgreSQL JDBC Driver (PostgreSQL JDBC 驅動程式)。如需其他 PostgreSQL 驅動程式和 SCRAM 支援的清單,請參閱 PostgreSQL 文件中的 List of drivers (驅動程式清單)。

注意

Aurora PostgreSQL 14 版和更新版本預設支援 scram-sha-256 用於新資料庫叢集的密碼加密。亦即,預設資料庫叢集參數群組 (default.aurora-postgresql14) 將 password_encryption 值設定為 scram-sha-256。

設定 Aurora PostgreSQL 資料庫叢集為需要 SCRAM

對於 Aurora PostgreSQL 14.3 和更新版本,您可以要求 Aurora PostgreSQL 資料庫叢集僅接受使用 scram-sha-256 演算法的密碼。

重要

對於 PostgreSQL 資料庫的現有 RDS 代理,如果您將資料庫驗證修改為僅使用 SCRAM,則該代理會變成無法使用,最多持續 60 秒。若要避免發生此問題,請執行下列其中一項:

  • 確定資料庫同時允許 SCRAMMD5 身分驗證。

  • 若只要使用 SCRAM 身分驗證,請建立新代理、將應用程式流量遷移至新代理,然後刪除先前與資料庫相關聯的代理。

在對系統進行變更之前,請確保您了解完整過程,如下所示:

  • 獲得所有資料庫使用者的所有角色與密碼加密相關資訊。

  • 針對控制密碼加密的參數,再次檢查 Aurora PostgreSQL 資料庫叢集的參數設定。

  • 如果您的 Aurora PostgreSQL 資料庫叢集使用預設參數群組,則需要建立自訂資料庫叢集參數群組,並將其套用到 Aurora PostgreSQL 資料庫叢集,讓您可以在需要時修改參數。如果您的 Aurora PostgreSQL 資料庫叢集使用自訂參數群組,則您稍後可以視需要在過程中修改必要參數。

  • password_encryption 參數變更為 scram-sha-256

  • 通知所有資料庫使用者他們必須更新密碼。針對您的 postgres 帳戶進行相同的動作。系統會使用 scram-sha-256 演算法加密與儲存新密碼。

  • 驗證確認使用加密類型將所有密碼加密。

  • 如果所有密碼都使用 scram-sha-256,您可以將 rds.accepted_password_auth_method 參數從 md5+scram 變更為 scram-sha-256

警告

在您僅將 rds.accepted_password_auth_method 變更為 scram-sha-256 後,則任何具有 md5 加密密碼的使用者 (角色) 將無法連線。

讓您的 Aurora PostgreSQL 資料庫叢集準備好需要 SCRAM

Aurora PostgreSQL 資料庫叢集進行任何變更之前,請檢查所有現有的資料庫使用者帳戶。另外,請檢查用於密碼的加密類型。您可以使用 rds_tools 擴充功能執行這些任務。Aurora PostgreSQL 13.1 與更新版本支援此擴充功能。

獲得資料庫使用者 (角色) 與密碼加密方法清單
  1. 使用 psql 連線至 Aurora PostgreSQL 資料庫叢集上的主要執行個體 ,如下所示。

    psql --host=cluster-name-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. 安裝 rds_tools 擴充功能。

    postgres=> CREATE EXTENSION rds_tools; CREATE EXTENSION
  3. 取得角色和加密清單。

    postgres=> SELECT * FROM rds_tools.role_password_encryption_type();

    您會看到類似下列的輸出。

    rolname | encryption_type ----------------------+----------------- pg_monitor | pg_read_all_settings | pg_read_all_stats | pg_stat_scan_tables | pg_signal_backend | lab_tester | md5 user_465 | md5 postgres | md5 (8 rows)

建立自訂資料庫叢集參數群組

注意

如果您的 Aurora PostgreSQL 資料庫叢集已使用自訂參數群組,則不需要建立新的群組。

如需 Aurora 的參數群組概觀,請參閱 建立資料庫叢集參數群組

用於密碼的密碼加密類型是在某一個參數 (亦即 password_encryption) 中設定的。Aurora PostgreSQL 資料庫叢集允許的加密則是在另一個參數 (亦即 rds.accepted_password_auth_method) 中設定的。若要從這些預設值變更,則需要您建立自訂資料庫叢集參數群組,並套用到您的叢集。

您也可以使用 AWS Management Console 或 RDS API 建立自訂資料庫叢集參數群組。如需詳細資訊,請參閱建立資料庫叢集參數群組

您可以使用資料庫執行個體與自訂參數群組建立關聯。

建立自訂資料庫叢集參數群組
  1. 使用 create-db-cluster-parameter-group CLI 命令以建立叢集的自訂參數群組。以下範例使用 aurora-postgresql13 作為此自訂參數群組的來源。

    對於LinuxmacOS、或Unix:

    aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name 'docs-lab-scram-passwords' \ --db-parameter-group-family aurora-postgresql13 --description 'Custom DB cluster parameter group for SCRAM'

    在Windows中:

    aws rds create-db-cluster-parameter-group --db-cluster-parameter-group-name "docs-lab-scram-passwords" ^ --db-parameter-group-family aurora-postgresql13 --description "Custom DB cluster parameter group for SCRAM"

    現在您可以將自訂參數群組與叢集建立關聯。

  2. 使用 modify-db-cluster CLI 命令將此自訂參數群組套用至您的 Aurora PostgreSQL 資料庫叢集。

    對於LinuxmacOS、或Unix:

    aws rds modify-db-cluster --db-cluster-identifier 'your-instance-name' \ --db-cluster-parameter-group-name "docs-lab-scram-passwords

    在Windows中:

    aws rds modify-db-cluster --db-cluster-identifier "your-instance-name" ^ --db-cluster-parameter-group-name "docs-lab-scram-passwords

    若要重新同步 Aurora PostgreSQL 資料庫叢集與自訂資料庫叢集參數群組,以及 ,請重新啟動叢集的主要與所有其他執行個體。

設定密碼加密以使用 SCRAM

Aurora PostgreSQL 資料庫叢集使用的密碼加密機制是在資料庫叢集參數群組password_encryption 參數中設定的。允許的值為未設定、md5scram-sha-256。預設值視 Aurora PostgreSQL 版本而定,如下所示:

  • Aurora PostgreSQL 14 – 預設值為 scram-sha-256

  • Aurora PostgreSQL 13 – 預設值為 md5

透過將自訂資料庫叢集參數群組連接至 Aurora PostgreSQL 資料庫叢集,您可以修改密碼加密參數的值。

接著,RDS 主控台顯示 Aurora PostgreSQL 其 password_encryption 參數的預設值。
將密碼加密設定變更為 scram-sha-256
  • 將密碼加密的值變更為 scram-sha-256,如下所示。變更會立即套用,因為參數是動態的,因此不需要重新啟動即可使變更生效。

    對於LinuxmacOS、或Unix:

    aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name \ 'docs-lab-scram-passwords' --parameters 'ParameterName=password_encryption,ParameterValue=scram-sha-256,ApplyMethod=immediate'

    在Windows中:

    aws rds modify-db-parameter-group --db-parameter-group-name ^ "docs-lab-scram-passwords" --parameters "ParameterName=password_encryption,ParameterValue=scram-sha-256,ApplyMethod=immediate"

將使用者角色的密碼遷移至 SCRAM

您可以將使用者角色的密碼遷移至 SCRAM,如下說明:

將資料庫使用者 (角色) 密碼從 MD5 遷移至 SCRAM
  1. 以管理員使用者身分 (預設使用者名稱 postgres) 登入,如下所示。

    psql --host=cluster-name-instance-1.111122223333.aws-region.rds.amazonaws.com --port=5432 --username=postgres --password
  2. 使用下列命令檢查 RDS for PostgreSQL 資料庫執行個體上 password_encryption 參數的設定。

    postgres=> SHOW password_encryption; password_encryption --------------------- md5 (1 row)
  3. 將此參數的值變更為 scram-sha-256。這是動態參數,因此您在進行此變更之後不需要重新啟動執行個體。再次檢查該值以確定它現在已設定為 scram-sha-256,如下所示。

    postgres=> SHOW password_encryption; password_encryption --------------------- scram-sha-256 (1 row)
  4. 通知所有資料庫使用者變更自己的密碼。務必亦為帳戶 postgres (具有 rds_superuser 權限的資料庫使用者) 變更您自己的密碼。

    labdb=> ALTER ROLE postgres WITH LOGIN PASSWORD 'change_me'; ALTER ROLE
  5. Aurora PostgreSQL 資料庫叢集上所有的資料庫重複此程序。

變更參數為需要 SCRAM

這是程序中的最後一個步驟。在以下程序中進行變更後,仍然使用 md5 將密碼加密的任何使用者帳戶 (角色) 將無法登入 Aurora PostgreSQL 資料庫叢集。

rds.accepted_password_auth_method 指定 Aurora PostgreSQL 資料庫叢集在登入程序期間接受的使用者密碼加密方法。預設值為 md5+scram,這意味著任何一種方法都接受。在下圖中,您可以找到此參數的預設設定。

顯示 rds.accepted_password_auth_method 參數其預設值與允許值的 RDS 主控台。

此參數的允許值為 md5+scram 或僅 scram。將此參數值變更為 scram 會使此成為一個需求。

將參數值變更為需要對密碼進行 SCRAM 身分驗證
  1. 確認 Aurora PostgreSQL 資料庫叢集上所有資料庫的所有資料庫使用者密碼使用 scram-sha-256 進行密碼加密。若要這麼做,請向 rds_tools 查詢角色 (使用者) 和加密類型,如下所示。

    postgres=> SELECT * FROM rds_tools.role_password_encryption_type(); rolname | encryption_type ----------------------+----------------- pg_monitor | pg_read_all_settings | pg_read_all_stats | pg_stat_scan_tables | pg_signal_backend | lab_tester | scram-sha-256 user_465 | scram-sha-256 postgres | scram-sha-256 ( rows)
  2. 針對您的 Aurora PostgreSQL 資料庫叢集中所有的資料庫執行個體重複此查詢。

    如果所有密碼都使用 scram-sha-256,您可以繼續進行。

  3. 將接受的密碼身分驗證值變更為 scram-sha-256,如下所示。

    對於LinuxmacOS、或Unix:

    aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name 'docs-lab-scram-passwords' \ --parameters 'ParameterName=rds.accepted_password_auth_method,ParameterValue=scram,ApplyMethod=immediate'

    在Windows中:

    aws rds modify-db-cluster-parameter-group --db-cluster-parameter-group-name "docs-lab-scram-passwords" ^ --parameters "ParameterName=rds.accepted_password_auth_method,ParameterValue=scram,ApplyMethod=immediate"