硬碟被偷走的那一刻,你的資料庫有幾層保護?

DP-300 第三天的主題只有一個字:安全。從最基礎的「誰可以連進來」到「DBA 自己都解不開的加密」,一整天下來把 SQL Server 的安全體系從頭到尾走了一遍。這篇筆記整理了考試會考的重點,也記錄了一些實務上容易搞混的觀念。

安全主體 - 搞清楚 Login、User、Role 的關係

授權的第一步是搞清楚「你是誰」。SQL Server 把身份分成三層:

Login 是伺服器層級的門票,讓你進入 SQL Server 的第一關。User 是 Login 映射到特定資料庫後產生的身份。Role 等同群組概念,你不直接對 User 授權,而是把 User 加進 Role,再對 Role 授權。

⚠️ AWS 的 Role、Azure RBAC 的 Role、SQL Server 的 Role 雖然名稱都叫 Role,含義完全不同。踩過這個坑的人應該不少。

Contained Database User - 雲端時代的解法

傳統模式下 Login 跟 User 是分開的,遷移資料庫的時候 Login 不會跟著走,結果 AlwaysOn AG 故障轉移直接炸開。SQL Server 2008 之後出現了 Contained Database User,把安全資訊打包在資料庫裡面,搬到哪台伺服器都能用。Azure SQL Database 預設就是這個模式。

權限模型 - 從 Instance 到 Cell

四部分命名

SQL Server 的完整物件名稱是 [Server].[Database].[Schema].[Object]。平常在同個 Schema 底下只寫 Object 名就好,跨 Schema 要加 dbo.Orders,跨資料庫要三段式,跨伺服器才需要四段全寫。

Schema 在 SQL Server 2005 之後跟 Owner 脫鉤了。以前人員異動要改一大堆物件歸屬,現在不用。

精細到 Cell 的權限控制

Row-Level Security(RLS)控制你能看到哪些資料列,Column Permission 控制你能看到哪些欄位,兩者交叉就是 Cell-Level 權限。實務上的場景像是:同一張銷售表,經理看全部,業務員只看自己負責的區域。不需要改程式碼,資料庫層級就搞定。

權限操作只有三個動詞:GRANT 授予、REVOKE 收回、DENY 拒絕。記住 DENY 優先權最高,會覆蓋 GRANT。

所有權鏈 - 為什麼只授權一層就夠了

View A 引用 View B,View B 引用 Table C。如果整條鏈路的物件擁有者都是 dbo(通常都是),你只需要對 View A 授權,後面自動繼承。這就是所有權鏈。

最佳實踐是用 View 或 Stored Procedure 封裝面向使用者的入口,後端幾百張表完全不用逐一授權。授權工作量直接砍九成。

三種加密技術

這邊是考試重點中的重點。

TDE - 靜態加密

Transparent Data Encryption 做的事情很單純:資料寫進磁碟之前加密,讀出來的時候解密。防的是硬碟實體被竊。效能影響大概 5%,現代 CPU 完全撐得住。

雲端預設開啟,本地端要手動開。金鑰不可遺失,這點要特別注意。

Always Encrypted - 連 DBA 都看不到

這個設計哲學很有意思:加解密在資料庫外部完成,金鑰不存放在 DB 裡面。結果就是 DBA 有完整的管理權限,但看到的全是密文。

兩種加密類型要分清楚:確定性加密用固定金鑰,同樣的值加密出來結果一樣,所以支援等值查詢(WHERE SSN = @value)。隨機加密每次結果不同,安全等級最高,但沒辦法做查詢。

Always Encrypted with Secure Enclaves

SQL Server 2019 以後的進化版,在伺服器記憶體的安全區域內做加解密,效能比傳統 Always Encrypted 好,支援更多查詢操作。算是兩者之間的平衡點。

傳輸加密

TDS over TLS,概念等同 HTTPS。雲端預設強制啟用。公開在 Internet 的 DB 搭配 AD 驗證加 TLS,安全性可以做到跟內網相當。

SQL Injection - 沒辦法根治,只能從源頭杜絕

講師特別強調這是資料庫領域最大的安全威脅。防護原則很直白:後台不接受使用者輸入的地方可以用動態 SQL,前台只要會碰到使用者輸入的地方,禁止動態 SQL,改用 Stored Procedure 做參數化查詢。應用程式框架的防注入功能只能當輔助,不能當唯一防線。

網路防火牆 - 雙層架構

Azure SQL Database 的防火牆是串行的兩層:

伺服器級防火牆預設啟用,可以用 SSMS 或 T-SQL 設定。資料庫級防火牆預設不啟用,只能用 T-SQL。兩層同時開的時候,連線要過兩關。伺服器級規則所有 DB 共用,資料庫級可以針對個別 DB 獨立設定。

這兩個方案都是讓內網流量不走 Internet 直達 Azure SQL Database:

VNet Service Endpoint 設定簡單、費用低,但只限當前 VNet。Private Link 支援所有 VNet 和跨網路,適用所有 Azure 服務,但設定複雜、費用較高。趨勢上越來越多人選 Private Link。

弄了半天要記住一點:這兩個是安全功能,不是效能優化。私有連線的速度可能還略低於 Internet 直連,差異可忽略就是了。

Azure Key Vault - 金鑰跟資料庫分離

把 TDE 金鑰、Always Encrypted 金鑰、連接字串、密碼全部集中存放在 Key Vault。應用程式啟動時從 Key Vault 取得,開發者跟 DBA 都碰不到。雲端設定很簡單,本地也能用但配置比較複雜。

稽核與帳本

稽核(Auditing)記錄「誰在什麼時候做了什麼」,異步運作,效能影響極低。PaaS 環境下管理員無法竄改稽核紀錄。

帳本(Ledger)是 SQL Server 2022 之後的功能,用區塊鏈技術加密稽核紀錄,連 Microsoft 自己都改不了。可以直接當法律證據。這個設計蠻猛的。

其他安全功能速記

Dynamic Data Masking:動態遮罩,手機號碼只顯示前三後四那種。注意對 db_owner 無效。Microsoft Defender for SQL:主動威脅偵測,僅 PaaS。Microsoft Purview:資料分類加 DLP 策略,防敏感資訊外洩。

重點整理

DP-300 第三天把 SQL Server 的安全體系分成六大塊:

  1. 驗證:Login → User(或 Contained User)
  2. 授權:角色 + 所有權鏈 + Cell-Level 精細權限
  3. 加密:TDE(靜態)+ Always Encrypted(欄位)+ TLS(傳輸)
  4. 網路:雙層防火牆 + VNet Endpoint / Private Link
  5. 稽核:Auditing + Ledger(區塊鏈)
  6. 防護:Data Masking + RLS + Defender + Purview

考試會考 TDE 跟 Always Encrypted 的差異、防火牆雙層架構的行為、還有 VNet Endpoint 跟 Private Link 的取捨。安全這塊的考題比例不低,花時間讀絕對值得。


本文整理自 DP-300 Azure 資料庫管理員認證課程第三天內容。前兩天筆記請見: