本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 AD 安全性群組進行 Aurora SQL 存取控制
從 Aurora 波斯特 SQL 14.10 和 15.5 版本,Aurora Postgre SQL 訪問控制可以使用管理 AWS Microsoft 活動目錄(AD)安全組的 Directory Service。早期版本的 Aurora Postgre SQL 支援基於 Kerberos 的驗證,並且僅針對個別使用者使用 AD。每個 AD 使用者都必須明確佈建至資料庫叢集才能取得存取權。
您可以利用 AD 安全性群組,而不是根據業務需求明確佈建每個 AD 使用者至資料庫叢集,如下所述:
AD 使用者是活動目錄中各種 AD 安全性群組的成員。這些不是由資料庫叢集系統管理員指定的,而是以業務需求為基礎,並由 AD 系統管理員處理。
-
資料庫叢集管理員會根據業務需求在資料庫執行個體中建立資料庫 這些資料庫角色可能具有不同的權限或權限。
-
資料庫叢集管理員會以每個資料庫叢集為基礎,設定從 AD 安全群組到資料庫角色的對應。
-
資料庫使用者可以使用其 AD 認證存取資料庫叢集。存取權是以 AD 安全性群組成員資格為基礎。AD 使用者會根據 AD 群組成員資格自動取得或失去存取權。
必要條件
在設定 AD 安全性群組的擴充功能之前,請確定您具備下列項目:
-
為郵政資料庫叢集設定 Kerberos 驗證。SQL如需詳細資訊,請參閱為 Postgre SQL 資料庫叢集設定 Kerberos 驗證。
注意
針對 AD 安全性群組,請略過此安裝程序中的步驟 7:為您的 Kerberos 主體建立 Postgre SQL 使用者。
管理網域中的資料庫叢集。如需詳細資訊,請參閱管理網域中的資料庫叢集。
設定 pg_ad_ 映射擴充功能
Aurora Postgre 現SQL在提供pg_ad_mapping
擴充功能,以管理 AD 安全性群組和 Aurora Postgre SQL 叢集中資料庫角色之間的對應。若要取得有關提供之函數的更多資訊pg_ad_mapping
,請參閱〈〉使用pg_ad_mapping擴展程序中的函數。
若要在 Aurora Postgre SQL 資料庫叢集上設定pg_ad_mapping
擴充功能,請先為 Aurora Postgre SQL 資料庫叢集新增pg_ad_mapping
至自訂資料庫叢集參數群組上的共用程式庫。如需建立自訂資料庫叢集參數群組的詳細資訊,請參閱Amazon Aurora 的參數組 RDS。接下來,安裝pg_ad_mapping
擴展程序。本節中的程序展示做法。您可以使用 AWS Management Console 或 AWS CLI.
您必須具有做為 rds_superuser
角色的許可,才能執行所有這些任務。
下列步驟假設您的 Aurora Postgre SQL 資料庫叢集與自訂資料庫叢集參數群組相關聯。
若要設定pg_ad_mapping
擴充功能
登入 AWS Management Console 並在打開 Amazon RDS 控制台https://console.aws.amazon.com/rds/
。 -
在瀏覽窗格中,選擇您的 Aurora Postgre SQL 資料庫叢集的寫入器執行個體。
-
開啟 Aurora Postgre SQL 資料庫叢集寫入器執行個體的組態索引標籤。在執行個體詳細資訊之間,尋找 Parameter group (參數群組) 連結。
-
選擇連結以開啟與您的 Aurora Postgre SQL 資料庫叢集相關聯的自訂參數。
-
在 Parameters (參數) 搜尋欄位中,輸入
shared_pre
以尋找shared_preload_libraries
參數。 -
選擇 Edit parameters (編輯參數) 以存取屬性值。
-
在 Values (值) 欄位中,將
pg_ad_mapping
新增至清單。使用逗號區隔值清單中的項目。 重新啟動 Aurora Postgre SQL 資料庫叢集的寫入器執行個體,以便對
shared_preload_libraries
參數的變更生效。當執行個體可用時,請驗證
pg_ad_mapping
是否已初始化。用於連線psql
至 Aurora Postgre SQL 資料庫叢集的寫入器執行個體,然後執行下列命令。SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)
在初始化
pg_ad_mapping
之後,您現在可以建立延伸模組。您需要在初始化程式庫之後建立擴充功能,才能開始使用此擴充功能所提供的函式。CREATE EXTENSION pg_ad_mapping;
關閉
psql
工作階段。labdb=>
\q
若要設定 pg_ad 對應
若要使用 AWS CLI,您可以呼叫modify-db-parameter-group作業,將此參數新增到自訂參數群組中,如下列程序所示。
使用以下內容 AWS CLI 要新增
pg_ad_mapping
至shared_preload_libraries
參數的指令。aws rds modify-db-parameter-group \ --db-parameter-group-name
custom-param-group-name
\ --parameters "ParameterName=shared_preload_libraries,ParameterValue=pg_ad_mapping,ApplyMethod=pending-reboot" \ --regionaws-region
-
使用以下內容 AWS CLI 重新啟動 Aurora Postgre SQL 資料庫叢集的寫入器執行個體的命令,以便初始化 pg_ad_map。
aws rds reboot-db-instance \ --db-instance-identifier
writer-instance
\ --regionaws-region
當執行個體可用時,您可以驗證
pg_ad_mapping
是否已初始化。用於連線psql
至 Aurora Postgre SQL 資料庫叢集的寫入器執行個體,然後執行下列命令。SHOW shared_preload_libraries;
shared_preload_libraries -------------------------- rdsutils,pg_ad_mapping (1 row)
初始化 pg_ad_map 後,您現在可以創建擴展名。
CREATE EXTENSION pg_ad_mapping;
關閉工
psql
作階段,以便您可以使用 AWS CLI.labdb=>
\q
擷取作用中目錄群組SID於 PowerShell
安全性識別碼 (SID) 可用來唯一識別安全性主體或安全性群組。每當在 Active Directory 中建立安全性群組或帳戶時,SID就會指派給它。若要SID從使用中的目錄擷取 AD 安全性群組,您可以使用從 Windows 用戶端電腦取得ADGroup指令程式,這是與該 Active Directory 網域加入。Identity 參數會指定要取得對應的作用中目錄群組名稱SID。
下面SID的例子返回 AD 組 adgroup1
.
C:\Users\Admin>
Get-ADGroup -Identity adgroup1 | select SID
SID ----------------------------------------------- S-1-5-21-3168537779-1985441202-1799118680-1612
對應資料庫角色與 AD 安全性群組
您必須明確佈建資料庫中的 AD 安全性群組做為 Postgre 資料SQL庫角色。AD 使用者 (至少屬於一個佈建的 AD 安全性群組的一部分) 將可存取資料庫。您不應授予rds_ad role
以 AD 群組安全性為基礎的資料庫角色。安全組的 Kerberos 身份驗證將通過使用域名後綴來觸發 user1@example.com
。 此數據庫角色不能使用密碼或IAM身份驗證來訪問數據庫。
注意
AD 使用者在資料庫中具有對應的資料庫rds_ad
角色並授予他們的角色,無法作為 AD 安全性群組的一部分登入。他們將獲得通過數據庫角色作為一個單獨的用戶訪問。
例如,帳戶群組是 AD 中的一個安全性群組,您想要在 Aurora Postgre SQL 中佈建此安全性群組做為帳戶角色。
AD 安全性群組 | SQL數據庫角色 |
---|---|
帳戶群組 | 帳戶角色 |
將資料庫角色與 AD 安全性群組對應時,您必須確定資料庫角色已設定LOGIN屬性,且具有必要登入資料庫的CONNECT權限。
postgres =>
alter role
accounts-role
login;ALTER ROLE
postgres =>
grant connect on databaseaccounts-db
toaccounts-role
;
管理員現在可以繼續創建 AD 安全組和 Postgre SQL 數據庫角色之間的映射。
admin=>
select pgadmap_set_mapping(
'accounts-group'
,'accounts-role'
,<SID>
,<Weight>
);
如需擷取 AD 安全性群組SID的相關資訊,請參閱擷取作用中目錄群組SID於 PowerShell。
在某些情況下,AD 使用者屬於多個群組,在這種情況下,AD 使用者將繼承資料庫角色的權限,這是以最高權重佈建的。如果這兩個角色具有相同的權重,AD 使用者將繼承與最近新增的對應相對應的資料庫角色的權限。建議指定權重,以反映個別資料庫角色的相對權限/權限。資料庫角色的權限或權限越高,應與對應項目相關聯的權數越高。這將避免兩個具有相同權重的映射的歧義。
下表顯示從 AD 安全群組對應至 Aurora Postgre SQL 資料庫角色的範例。
AD 安全性群組 | SQL數據庫角色 | Weight |
---|---|---|
帳戶群組 | 帳戶角色 | 7 |
銷售組 | 銷售角色 | 10 |
開發群組 | 開發角色 | 7 |
在下列範例中,user1
將繼承銷售角色的權限,因dev-role
為它具有較高的權限,而在之後建立此角色的對應時user2
將繼承的權限accounts-role
,其權重與之相同。accounts-role
使用者名稱 | 安全性群組成員 |
---|---|
user1 | 帳戶-群組銷售群組 |
user2 | 帳戶群組開發群組 |
建立、列出和清除對映的 psql 指令如下所示。目前無法修改單一對應項目。需要刪除現有項目並重新建立對應。
admin=>
select pgadmap_set_mapping('accounts-group', 'accounts-role', 'S-1-5-67-890', 7);
admin=>
select pgadmap_set_mapping('sales-group', 'sales-role', 'S-1-2-34-560', 10);
admin=>
select pgadmap_set_mapping('dev-group', 'dev-role', 'S-1-8-43-612', 7);
admin=>
select * from pgadmap_read_mapping();
ad_sid | pg_role | weight | ad_grp -------------+----------------+--------+--------------- S-1-5-67-890 | accounts-role | 7 | accounts-group S-1-2-34-560 | sales-role | 10 | sales-group S-1-8-43-612 | dev-role | 7 | dev-group (3 rows)
AD用戶身份記錄/稽核
使用下列命令來判斷目前或工作階段使用者繼承的資料庫角色:
postgres=>
select session_user, current_user;
session_user | current_user -------------+-------------- dev-role | dev-role (1 row)
若要判斷 AD 安全性主體識別碼,請使用下列命令:
postgres=>
select principal from pg_stat_gssapi where pid = pg_backend_pid();
principal ------------------------- user1@example.com (1 row)
目前,稽核記錄中看不到 AD 使用者身分。可啟用此log_connections
參數來記錄資料庫工作階段建立。如需詳細資訊,請參閱 Log_Connect。此輸出包括 AD 使用者身分,如下所示。然後,與此輸出PID相關聯的後端可以幫助屬性動作回到實際 AD 使用者。
pgrole1@postgres:[615]:LOG: connection authorized: user=pgrole1 database=postgres application_name=psql GSS (authenticated=yes, encrypted=yes, principal=Admin@EXAMPLE.COM)
限制
不支援稱為 Azure 作用中目錄的 Microsoft 項目識別碼。
使用pg_ad_mapping
擴展程序中的函數
pg_ad_mapping
擴展提供了以下功能的支持:
集合映射
此函數會建立 AD 安全性群組和資料庫角色與相關權數之間的對應。
語法
pgadmap_set_mapping(
ad_group,
db_role,
ad_group_sid,
weight)
引數
參數 | 描述 |
---|---|
廣告組 | 廣告群組的名稱。值不能為空值或空字串。 |
數據庫角色 | 要對應至指定 AD 群組的資料庫角色。值不能為空值或空字串。 |
廣告群組 | 用來唯一識別 AD 群組的安全性識別碼。值以 'S-1-' 開頭,不能為空或空字符串。如需詳細資訊,請參閱擷取作用中目錄群組SID於 PowerShell。 |
重量 | 與資料庫角色相關聯的加權。當使用者是多個群組的成員時,權重最高的角色會獲得優先順序。重量的默認值是 1。 |
傳回類型
None
使用須知
此函數會新增 AD 安全性群組至資料庫角色的新對應。它只能由具有 rds_superuser 權限的使用者在資料庫叢集的主要資料庫執行個體上執行。
範例
postgres=>
select pgadmap_set_mapping('accounts-group','accounts-role','S-1-2-33-12345-67890-12345-678',10);pgadmap_set_mapping (1 row)
讀取映射
此函數會列出 AD 安全性群組與使用函pgadmap_set_mapping
數設定的資料庫角色之間的對應。
語法
pgadmap_read_mapping()
引數
None
傳回類型
參數 | 描述 |
---|---|
廣告群組 | 用來唯一識別 AD 群組的安全性識別碼。值以 'S-1-' 開頭,不能為空或空字符串。如需詳細資訊,請參閱 擷取作用中目錄群組SID於 PowerShell .accounts-role@example.com |
數據庫角色 | 要對應至指定 AD 群組的資料庫角色。值不能為空值或空字串。 |
重量 | 與資料庫角色相關聯的加權。當使用者是多個群組的成員時,權重最高的角色會獲得優先順序。重量的默認值是 1。 |
廣告組 | 廣告群組的名稱。值不能為空值或空字串。 |
使用須知
呼叫此函數以列出 AD 安全性群組和資料庫角色之間的所有可用對應。
範例
postgres=>
select * from pgadmap_read_mapping();ad_sid | pg_role | weight | ad_grp ------------------------------------+---------------+--------+------------------ S-1-2-33-12345-67890-12345-678 | accounts-role | 10 | accounts-group (1 row) (1 row)
重置映射
此函數重置一個或所有使用pgadmap_set_mapping
功能設置的映射。
語法
pgadmap_reset_mapping(
ad_group_sid,
db_role,
weight)
引數
參數 | 描述 |
---|---|
廣告群組 | 用來唯一識別 AD 群組的安全性識別碼。 |
數據庫角色 | 要對應至指定 AD 群組的資料庫角色。 |
重量 | 與資料庫角色相關聯的加權。 |
如果未提供引數,則會重設所有 AD 群組至資料庫角色對應。要么所有參數都需要提供或不提供。
傳回類型
None
使用須知
呼叫此函數可刪除特定 AD 群組至資料庫角色對應,或重設所有對應。此函數只能由具有rds_superuser
權限的使用者在資料庫叢集的主要資料庫執行個體上執行。
範例
postgres=>
select * from pgadmap_read_mapping();
ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+------------------- S-1-2-33-12345-67890-12345-678 | accounts-role| 10 | accounts-group S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (2 rows)
postgres=>
select pgadmap_reset_mapping('S-1-2-33-12345-67890-12345-678', 'accounts-role', 10);
pgadmap_reset_mapping (1 row)
postgres=>
select * from pgadmap_read_mapping();
ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+--------------- S-1-2-33-12345-67890-12345-666 | sales-role | 10 | sales-group (1 row)
postgres=>
select pgadmap_reset_mapping();
pgadmap_reset_mapping (1 row)
postgres=>
select * from pgadmap_read_mapping();
ad_sid | pg_role | weight | ad_grp --------------------------------+--------------+-------------+-------------- (0 rows)