適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的安全性

適用於:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器

多層安全性可用來在適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器執行個體上協助保護資料。 本文將概述這些安全性選項。

由於組織日益依賴資料庫中儲存的資料來推動重要決策活動,從而提高競爭優勢,因此對可靠資料庫安全性措施的需求變得前所未有的重要。 安全漏洞可能會觸發災難性後果,包括公開機密資料,造成組織的信譽受損。

資訊保護和加密

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器會透過兩種方式加密資料:

  • 傳輸中的資料:適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器會使用安全通訊端層和傳輸層安全性 (SSL/TLS) 來加密傳輸中資料。 系統預設會強制執行加密作業。 如需 SSL\TLS 連線安全性的詳細資訊,請參閱此文件。 為了獲得更好的安全性,您可能選擇在適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中啟用 SCRAM 驗證

    雖然強烈不建議這麼做,但如有需要,由於舊版用戶端不相容,您可以選擇在連線至適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器時停用 TLS\SSL,方法是將 require_secure_transport 伺服器參數更新為 OFF。 您也可以設定 ssl_max_protocol_version 伺服器參數來設定 TLS 版本。

  • 待用資料:針對儲存體加密,適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器會使用經過 FIPS 140-2 驗證的加密模組。 磁碟上的資料會加密,包括備份以及查詢執行時所建立的暫存檔案。

    此服務會使用Galois/Counter Mode (GCM) 模式搭配 Azure 儲存體加密中包含的 AES 256 位加密,且金鑰是由系統管理。 這與其他待用加密技術類似,例如 SQL Server 或 Oracle 資料庫中的透明資料加密。 儲存體加密會一律啟用,且無法停用。

網路安全性

當您執行適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器時,會有兩個主要的網路選項:

  • 私人存取:您可以將伺服器部署到 Azure 虛擬網路。 Azure 虛擬網路有助於提供私人且安全的網路通訊。 這可讓虛擬網路中的資源透過私人 IP 位址通訊。 如需詳細資訊,請參閱適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器網路概觀

    網路安全性群組中的安全性規則能讓您篩選可在虛擬網路子網路及網路介面中流入和流出的網路流量類型。 如需詳細資訊,請參閱網路安全性群組概觀

  • 公用存取:可透過公用端點來存取伺服器。 公用端點是可公開解析的 DNS 位址。 在對其進行存取時,系統會透過預設封鎖所有連線的防火牆來提供保護。

    IP 防火牆規則會根據每個要求的來源 IP 位址授與伺服器存取權。 如需詳細資訊,請參閱防火牆規則概觀

適用於雲端的 Microsoft Defender 支援

適用於開放原始碼關聯式資料庫的 Microsoft Defender 會偵測異常活動,其指出有人嘗試以不尋常且潛在有害的方式存取或惡意探索資料庫。 適用於雲端的 Defender 會針對異常活動提供安全性警示,讓您可以偵測潛在威脅,並在發生威脅時對其做出回應。 當您啟用此方案時,適用於雲端的 Defender 會在偵測到異常資料庫存取和查詢模式,以及可疑資料庫活動時提供警示。

這些警示會出現在適用於雲端的 Defender 的安全性警示頁面中,並包括:

  • 觸發了這些警示的可疑活動詳細資料
  • 相關聯的 MITRE ATT&CK 策略
  • 如何調查並減輕威脅的建議動作
  • 使用 Microsoft Sentinel 繼續調查的選項

適用於雲端的 Microsoft Defender 和暴力密碼破解攻擊

儘管是最不複雜的駭客攻擊方法,暴力密碼破解攻擊是最常見且相當成功的駭客方法之一。 這類攻擊背後的理論是,如果您無限次嘗試猜測密碼,最終一定會猜對。 當適用於雲端的 Microsoft Defender 偵測到暴力密碼破解攻擊時,會觸發警示,讓您意識到發生了暴力密碼破解攻擊。 它也可以將簡單的暴力密碼破解攻擊與有效使用者的暴力密碼破解攻擊,或成功的暴力密碼破解攻擊分開。

若要從 Microsoft Defender 方案取得警示,您必須先將其啟用,如下所示。

使用適用於雲端的 Microsoft Defender 啟用增強式安全性

  1. Azure 入口網站中,瀏覽至左窗格中的 [安全性] 功能表
  2. 挑選適用於雲端的 Microsoft Defender
  3. 選取右側窗格中的 [啟用]。

Azure 入口網站的螢幕擷取畫面,其中顯示如何啟用 Cloud Defender。

注意

如果已在 Microsoft Defender 方案中啟用「開放原始碼關聯式資料庫」功能,您將會觀察到預設會針對適用於 PostgreSQL 的 Azure 資料庫彈性伺服器資源自動啟用 Microsoft Defender。

存取管理

大規模管理適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器資料庫存取權限的最佳方式是使用角色的概念。 角色可以是資料庫使用者或資料庫使用者的群組。 角色可以擁有資料庫物件,並將這些物件的權限指派給其他角色,以控制誰可以存取哪些物件。 也可以將角色中的成員資格授與另一個角色,從而允許成員角色使用指派給另一個角色的權限。 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器可讓您將權限直接授與資料庫使用者。 作為良好的安全性做法,建議您根據最低應用程式和存取需求,建立具有特定權限集的角色。 然後,您可以將適當的角色指派給每個使用者。 這些角色用來強制執行「最低權限模型」,以存取資料庫物件。

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器執行個體建立時,除了 PostgreSQL 建立的內建角色之外,還定義了三個預設角色。 您可以執行下列命令來查看這些角色:

SELECT rolname FROM pg_roles;

角色列示於下:

  • azure_pg_admin
  • azuresu
  • 管理員角色

在建立適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器執行個體時,您會提供管理員角色的認證。 這個管理員角色可用來建立更多的 PostgreSQL 角色

例如,在下面我們可以建立稱為 'demouser' 的範例使用者/角色


 CREATE USER demouser PASSWORD password123;

應用程式從不應該使用管理員角色

在雲端式 PaaS 環境中,存取適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器超級使用者帳戶限制為僅透過雲端操作員控制平面作業。 因此,azure_pg_admin 帳戶會以虛擬超級使用者帳戶的形式存在。 您的管理員角色是 azure_pg_admin 角色的成員。
不過,伺服器管理員帳戶不是 azuresu 角色的一部分,此角色具有超級使用者權限且用來執行控制平面作業。 由於此服務是受控 PaaS 服務,因此只有 Microsoft 是超級使用者角色的一部分。

您可以定期稽核伺服器中的角色清單。 例如,您可以使用 psql 用戶端進行連線並查詢 pg_roles 資料表,其中會列出所有角色以及建立其他角色、建立資料庫、複寫等權限。


select * from pg_roles where rolname='demouser';
-[ RECORD 1 ]--+---------
rolname        | demouser
rolsuper       | f
rolinherit     | t
rolcreaterole  | f
rolcreatedb    | f
rolcanlogin    | f
rolreplication | f
rolconnlimit   | -1
rolpassword    | ********
rolvaliduntil  |
rolbypassrls   | f
rolconfig      |
oid            | 24827

重要

最近,我們已啟用在適用於 PostgreSQL 的 Azure 資料庫中建立 CAST 命令 (英文) 的支援。 請注意,目前此功能會如預期般運作,但 DROP 陳述式除外。 換句話說,CAST 目前在建立之後無法將其卸除。 我們正積極努力新增這項功能,並預計在近期推出。

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中的稽核記錄也可與適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器搭配使用,來追蹤資料庫中的活動。

控制結構描述存取

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器中新建立的資料庫,在資料庫的公用結構描述中具有一組預設權限,可讓所有資料庫使用者和角色建立物件。 為了更好地限制應用程式使用者存取您在適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器執行個體上建立的資料庫,建議您考慮撤銷這些預設的公用權限。 這麼做之後,您就可以更細微地為資料庫使用者授與特定權限。 例如:

  • 若要防止應用程式資料庫使用者在公用結構描述中建立物件,請從 public 角色中撤銷 public 結構描述的建立權限。

    REVOKE CREATE ON SCHEMA public FROM PUBLIC;
    
  • 接下來,建立新的資料庫。

    CREATE DATABASE Test_db;
    
  • 在這個新資料庫上,從 PUBLIC 結構描述中撤銷所有權限。

    REVOKE ALL ON DATABASE Test_db FROM PUBLIC;
    
  • 為應用程式資料庫使用者建立自訂角色

    CREATE ROLE Test_db_user;
    
  • 讓具有此角色的資料庫使用者能夠連線至資料庫。

    GRANT CONNECT ON DATABASE Test_db TO Test_db_user;
    GRANT ALL PRIVILEGES ON DATABASE Test_db TO Test_db_user;
    
  • 建立資料庫使用者

    CREATE USER user1 PASSWORD 'Password_to_change'
    
  • 將具有其連線和選取權限的角色指派給使用者

    GRANT Test_db_user TO user1;
    

在此範例中,使用者 user1 可以連線並具有測試資料庫 Test_db 中的所有權限,但不適用於伺服器上的任何其他資料庫。 進一步的建議是,不要為此使用者角色提供該資料庫及其物件上的 ALL PRIVILEGES,而是提供更具選擇性的權限,例如 SELECTINSERTEXECUTE 等。如需 PostgreSQL 資料庫中權限的詳細資訊,請參閱 PostgreSQL 文件中的 GRANTREVOKE 命令。

PostgreSQL 15 中的公用結構描述擁有權變更

從 Postgres 第 15 版開始,公用結構描述的擁有權已變更為新的 pg_database_owner 角色。 其可讓每個資料庫擁有者擁有資料庫的公用結構描述。
您可以在 PostgreSQL 發行備註中找到詳細資訊。

具有角色型安全性的 PostgreSQL 16 變更

在 PostgreSQL 資料庫中,角色可有許多定義其權限的屬性。有一個這類屬性是 CREATEROLE 屬性,這對使用者和角色的 PostgreSQL 資料庫管理很重要。 在 PostgreSQL 16 中,已對這個屬性引進了重大變更。 在 PostgreSQL 16 中,具有 CREATEROLE 屬性的使用者無法再將任何角色中的成員資格分發給任何人;相反地,就像其他使用者一樣,若沒有這個屬性,其只能分發角色中其擁有 ADMIN OPTION 的成員資格。 此外,在 PostgreSQL 16 中,CREATEROLE 屬性仍然允許非超級使用者能夠佈建新使用者,不過,只能卸除其本身建立的使用者。 嘗試卸除不是由具有 CREATEROLE 屬性的使用者所建立的使用者,將會產生錯誤。

PostgreSQL 16 也引進了新的和改善的內建角色。 PostgreSQL 16 中的新 pg_use_reserved_connections 角色允許使用透過 reserved_connections 保留的連線位置。pg_create_subscription 角色可讓超級使用者建立訂用帳戶。

重要

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器不允許授與使用者 pg_write_all_data 屬性,此屬性可讓使用者寫入所有資料 (資料表、檢視表、序列),就好像對這些物件具有 INSERT、UPDATE 和 DELETE 權限,以及對所有結構描述具有 USAGE 權限,即使沒有明確授與也一樣。 作為因應措施,建議對每個資料庫和物件的更有限層級授與類似權限。

資料列層級安全性

資料列層級安全性 (RLS) 是適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器安全性功能,可讓資料庫管理員定義原則,以控制特定資料列如何針對一或多個角色顯示及操作。 資料列層級安全性是一種額外的篩選條件,您可以將其套用至適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器資料庫資料表。 當使用者嘗試對資料表執行動作時,此篩選條件會在查詢準則或其他篩選之前先行套用,並根據您的安全原則縮減或拒絕資料。 您可以為 SELECTINSERTUPDATEDELETE 等特定命令建立資料列層級安全性原則,並為 ALL 命令指定它。 資料列層級安全性的使用案例包括符合 PCI 規範的實作、分類的環境,以及共用的裝載/多租用戶應用程式。

只有具有 SET ROW SECURITY 權限的使用者才能將資料列安全性權限套用至資料表。 資料表擁有者可能會在資料表上設定資料列安全性。 就像 OVERRIDE ROW SECURITY 一樣,這目前是隱含權限。 資料列層級安全性不會覆寫現有的 GRANT 權限,其會新增更精細的控制層級。 例如,將 ROW SECURITY FOR SELECT 設定為允許指定使用者提供資料列,只有在使用者對有問題的資料行或資料表也具有 SELECT 權限時,才會授與該使用者存取權。

以下範例會說明如何建立一個原則,確保只有自訂建立「管理員」角色的成員,才能存取特定帳戶的資料列。 下列範例中的程式碼已在 PostgreSQL 文件中共用。

CREATE TABLE accounts (manager text, company text, contact_email text);

ALTER TABLE accounts ENABLE ROW LEVEL SECURITY;

CREATE POLICY account_managers ON accounts TO managers
    USING (manager = current_user);

USING 子句會隱含地新增 WITH CHECK 子句,確保管理員角色的成員無法對屬於其他管理員的資料列執行 SELECTDELETEUPDATE 作業,也無法對屬於另一個管理員的新資料列執行 INSERT 作業。 您可以使用 DROP POLICY 命令,卸除資料列安全原則,如下列範例所示:



DROP POLICY account_managers ON accounts;

雖然您可能已卸除原則,但角色管理員仍然無法檢視屬於任何其他管理員的任何資料。 這是因為帳戶資料表上仍啟用資料列層級安全性原則。 如果預設啟用資料列層級安全性,PostgreSQL 會使用預設拒絕原則。 您可以停用資料列層級安全性,如下列範例所示:

ALTER TABLE accounts DISABLE ROW LEVEL SECURITY;

略過資料列層級安全性

PostgreSQL 具有 BYPASSRLSNOBYPASSRLS 權限,這些權限可指派給角色;預設會指派 NOBYPASSRLS。 透過適用於 PostgreSQL 的 Azure 資料庫中 - 彈性伺服器中新佈建的伺服器,略過資料列層級安全性權限 (BYPASSRLS) 實作如下:

  • 針對 Postgres 16 及以上版本的伺服器,我們會遵循標準 PostgreSQL 16 行為azure_pg_admin 管理員角色所建立的非管理使用者,可讓您視需要建立具有 BYPASSRLS 屬性\權限的角色。
  • 針對 Postgres 15 及以下版本的伺服器, 您可以使用 azure_pg_admin 使用者,來執行需要 BYPASSRLS 權限的管理工作,但無法建立具有 BypassRLS 權限的非管理員使用者,因為管理員角色沒有超級使用者權限,這在雲端式 PaaS PostgreSQL 服務中很常見。

更新密碼

為了獲得更好的安全性,建議您定期輪替您的管理員密碼和資料庫使用者密碼。 建議您使用強式密碼,其中使用大寫和小寫、數字和特殊字元。

使用 SCRAM

Salted Challenge Response Authentication Mechanism (SCRAM) 藉由新增數個重要安全性功能,防止彩虹資料表攻擊、中間人攻擊和預存密碼攻擊,同時也對包含非 ASCII 字元的多個雜湊演算法和密碼新增支援,來大幅改善密碼型使用者驗證的安全性。

在 SCRAM 驗證中,用戶端會參與執行加密工作,以便產生身分識別證明。 因此,SCRAM 驗證會將部分計算成本轉移給其用戶端,在大部分情況下都是應用程式伺服器。 因此,除了更強大的雜湊演算法之外,採用 SCRAM 也會提供保護,以防範針對 PostgreSQL 的分散式阻斷服務 (DDoS) 攻擊,方法是防止伺服器 CPU 超載來計算密碼雜湊。

如果您的用戶端驅動程式支援 SCRAM,您可以使用 SCRAM 作為 scram-sha-256 與預設 md5設定對適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器的存取

重設系統管理員密碼

請遵循操作指南來重設系統管理員密碼。

更新資料庫使用者密碼

您可以透過用戶端工具來更新資料庫使用者密碼。
例如,

ALTER ROLE demouser PASSWORD 'Password123!';
ALTER ROLE

Azure 原則支援

Azure 原則有助於強制執行組織標準及大規模評估合規性。 其合規性儀表板會提供彙總檢視,以評估環境的整體狀態,並能夠向下切入至每個資源和每個原則的細微性。 也可透過對現有資源進行大規模補救,以及自動對新資源進行補救來協助您的資源達到合規性。

內建原則定義

內建原則是由 Microsoft 所開發和測試,確保它們符合一般標準和最佳做法,可快速部署而不需要額外的設定,因此非常適合標準合規性需求。 內建原則通常涵蓋廣泛公認的標準和合規性架構。

以下頁面是「適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器」的 Azure 原則內建原則定義的索引。 使用 [來源] 資料行中的連結查看 Azure 原則 GitHub 存放庫上的來源。

名稱 (Azure 入口網站) 說明 效果 版本 (GitHub)
應為 PostgreSQL 彈性伺服器佈建 Microsoft Entra 管理員 稽核 PostgreSQL 彈性伺服器的 Microsoft Entra 管理員佈建,以啟用 Microsoft Entra 驗證。 Microsoft Entra 驗證可針對資料庫使用者及其他 Microsoft 服務,簡化權限管理及集中管理身分識別 AuditIfNotExists, Disabled 1.0.0
應針對 PostgreSQL 彈性伺服器啟用 PgAudit 稽核 此原則可協助稽核您環境中未啟用使用 pgaudit 的任何 PostgreSQL 彈性伺服器。 AuditIfNotExists, Disabled 1.0.0
應為 PostgreSQL 彈性伺服器啟用連線節流 此原則可協助稽核您環境中任何未啟用連線節流的 PostgreSQL 彈性伺服器。 此設定可針對每個發生太多無效密碼登入失敗的 IP 啟用暫時連線節流。 AuditIfNotExists, Disabled 1.0.0
將 PostgreSQL 彈性伺服器的診斷設定部署至 Log Analytics 工作區 針對 PostgreSQL 彈性伺服器部署診斷設定,以在任何缺少此診斷設定的 PostgreSQL 彈性伺服器建立或更新時串流至區域 Log Analytics 工作區。 DeployIfNotExists, Disabled 1.0.0
應為 PostgreSQL 彈性伺服器記錄中斷連線。 此原則可協助稽核您環境中任何未啟用 log_disconnections 的 PostgreSQL 彈性伺服器。 AuditIfNotExists, Disabled 1.0.0
應為 PostgreSQL 彈性伺服器啟用 [強制執行 SSL 連線] 適用於 PostgreSQL 的 Azure 資料庫支援使用安全通訊端層 (SSL),將適用於 PostgreSQL 的 Azure 資料庫彈性伺服器連線至用戶端應用程式。 在您的資料庫彈性伺服器和用戶端應用程式之間強制使用 SSL 連線,可將兩者之間的資料流加密,有助於抵禦「中間人」攻擊。 此設定會強制一律啟用 SSL,以存取您的 PostgreSQL 彈性伺服器 AuditIfNotExists, Disabled 1.0.0
應為適用於 PostgreSQL 的 Azure 資料庫彈性伺服器啟用異地備援備份 適用於 PostgreSQL 的 Azure 資料庫彈性伺服器可讓您為資料庫伺服器選擇備援選項。 可以設定為異地備援備份儲存體,其中的資料不只會儲存在裝載您伺服器的區域內,也會複寫至配對的區域,以在發生區域失敗時提供復原選項。 只可在伺服器建立期間,為備份設定異地備援儲存體 Audit, Disabled 1.0.0
應為 PostgreSQL 彈性伺服器啟用記錄檢查點 此原則可協助稽核您環境中任何未啟用 log_checkpoints 設定的 PostgreSQL 彈性伺服器 AuditIfNotExists, Disabled 1.0.0
應為 PostgreSQL 彈性伺服器啟用記錄連線 此原則可協助稽核您環境中任何未啟用 log_connections 設定的 PostgreSQL 彈性伺服器 AuditIfNotExists, Disabled 1.0.0
PostgreSQL 彈性伺服器應使用客戶自控金鑰為待用資料加密 使用客戶自控金鑰來管理 PostgreSQL 彈性伺服器的待用加密。 根據預設,資料會使用服務管理的金鑰進行待用加密,但通常需要有客戶自控金鑰才能符合法規合規性標準。 客戶自控金鑰可讓您使用由您建立及擁有的 Azure Key Vault 金鑰來加密資料。 您對金鑰生命週期擁有完全的控制權和責任,包括輪替和管理。 Audit, Deny, Disabled 1.0.0
PostgreSQL 彈性伺服器應該執行 TLS 1.2 版或更新版本 此原則可協助稽核您環境中執行 TLS 1.2 版以下版本的任何 PostgreSQL 彈性伺服器 AuditIfNotExists, Disabled 1.0.0
PostgreSQL 彈性伺服器應啟用私人端點 私人端點連線透過啟用與適用於 PostgreSQL 的 Azure 資料庫的私人連線,可強制執行安全通訊。 設定私人端點連線,僅存取來自已知網路的流量,並防止其他所有 IP 位址 (包括 Azure 內) 的存取 AuditIfNotExists, Disabled 1.0.0

自訂原則定義

您可以精確量身打造自訂原則,以符合貴組織的特定需求,包括唯一的安全性原則或合規性授權。 透過自訂原則,您可以完全控制原則邏輯和參數,以允許複雜且精細的原則定義。