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

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

多層安全性可用來協助保護 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器實例上的數據。 本文概述這些安全性選項。

資訊保護和加密

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

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

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

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

    該服務使用包含在 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. 選取右側窗格中的 [啟用]。

顯示如何啟用 Cloud Defender 的 Azure 入口網站 螢幕快照。

注意

如果您的 Microsoft Defender 方案中已啟用「開放原始碼關係資料庫」功能,您將會發現預設會針對 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器資源啟用 Microsoft Defender。

存取管理

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

適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器實例是使用定義的三個預設角色所建立。 您可以執行 命令來檢視這些角色:

SELECT rolname FROM pg_roles;
  • azure_pg_admin

  • azuresu

  • 系統管理員角色

當您建立 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器實例時,您會提供系統管理員角色認證。 這個管理員角色可用來建立更多的 PostgreSQL 角色
例如,下面我們可以建立名為 demouser的範例使用者/角色。

postgres=> CREATE USER demouser PASSWORD 'password123';

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

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

注意

只有超級用戶的許可權數目,例如建立特定隱含轉換,不適用於 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器,因為azure_pg_admin角色不符合 PostgreSQL 超級使用者角色的許可權。

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

postgres=> \x
Expanded display is on.
postgres=> 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 資料庫 中的稽核記錄 - 彈性伺服器也可搭配 適用於 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 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角色可讓超級使用者建立訂用帳戶。

資料列層級安全性

數據列層級安全性 (RLS) 是一項 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器安全性功能,可讓資料庫管理員定義原則,以控制數據的特定數據列如何顯示及操作一或多個角色。 數據列層級安全性是您可以套用至 適用於 PostgreSQL 的 Azure 資料庫 - 彈性伺服器資料庫數據表的額外篩選。 當使用者嘗試在數據表上執行動作時,此篩選會在查詢準則或其他篩選之前套用,並根據安全策略縮小或拒絕數據。 您可以為 SELECT、INSERTUPDATEDELETE特定命令建立數據列層級安全策略,針對 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 機制 (SCRAM) 藉由新增數個主要安全性功能來防止彩虹數據表攻擊、中間人攻擊和預存密碼攻擊,同時新增對包含非 ASCII 字元的多個哈希演算法和密碼的支援,藉此大幅改善密碼型使用者驗證的安全性。

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

重設系統管理員密碼

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

更新資料庫用戶密碼

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

postgres=> ALTER ROLE demouser PASSWORD 'Password123!';
ALTER ROLE