想像一下這種夜驚:你是資料庫管理員,結果重要的客戶資料表突然就...消失了。誰幹的?為什麼?也許是菜鳥實習生不小心寫了 DROP TABLE。也可能是有惡意的用戶拿到資料庫權限...不管怎樣,這時候再慌也來不及啦!只能醒來,冷靜一下,開始研究資料庫的防護。畢竟沒有安全設定的資料庫,就像沒地基的房子一樣。
對資料庫來說,安全性一定要顧好,才能防止像這些威脅:
- 未經授權的存取:有人拿到他本來沒權限看的資料。
- 資料外洩:密碼、信用卡或機密資訊流到不該拿的人手上。
- SQL 注入:這種陰險的手法可以讓壞人透過沒防護好的查詢操控你的資料庫。
- 人為失誤:不小心刪掉資料,或做了無法回復的更動。
在 PostgreSQL 裡,安全性是多層次的:從建立角色、權限控管,到網路存取限制。這讓你可以很彈性地設定誰能對你的資料做什麼。
PostgreSQL 的主要安全層級
在 PostgreSQL 裡,你可以在三個主要層級控管存取:
1. 資料庫層級的存取管理。 在這層你決定誰能連進你的資料庫,以及連進來後能做什麼。比如說,可以直接禁止某些用戶進來。也可以只讓某些人讀資料。這裡的關鍵工具就是 角色。
2. 資料表、資料列和欄位層級的存取控管。
在 PostgreSQL 裡,你可以很細緻地限制資料存取。你可以:
- 只讓用戶讀特定欄位。
- 只讓用戶讀自己擁有的資料列。這叫做 ROW LEVEL SECURITY (RLS),我們之後的課會詳細講。
- 只開放特定 schema(資料庫分區)裡的重要資料。
3. 網路存取設定。 資料庫可以設定只接受信任的 client 連線。這要透過 PostgreSQL 的設定檔 pg_hba.conf 來搞定。你可以用這個檔案只允許本機或特定 IP 連線。
PostgreSQL 的安全工具
來看看 PostgreSQL 提供哪些安全工具,以及它們實際怎麼用。
先從 角色和權限 開始——這是存取管理系統的基礎。在 PostgreSQL 裡,角色不只是用戶,還可以很彈性地設定。它可以代表一個人,也可以是一整個群組。比如你可以建立一個叫 manager 的角色,給他訂單表的全部權限;實習生就用 intern 角色,只給讀取權限——這樣他就不會不小心搞砸東西。
角色本身可以很彈性地設定:有人權限多,有人少,還可以讓一個角色繼承另一個角色的權限。這樣就能決定誰能連資料庫、能看哪些 schema 和資料表,甚至能看到或改哪些資料列。
接下來是 設定檔。PostgreSQL 有兩個很重要的設定檔,對安全性超關鍵。
第一個是 pg_hba.conf。它負責資料庫的網路存取。這裡設定誰能連 server、從哪個 IP 來、用什麼認證方式。如果你只想讓特定機器或用戶連線,就是在這裡搞定。
第二個檔案是 postgresql.conf。它管整個 server 的設定,裡面也有 log 和稽核(audit)相關的參數。這讓你可以追蹤誰做了什麼,及時發現可疑行為,必要時還能細查細節。
最後是 log 和稽核。老話一句:「log 是你最好的朋友」。聽起來怪怪的,但對資料庫管理員來說這是鐵律。在 PostgreSQL 裡你可以設定記錄所有查詢和用戶行為。這樣如果出事了,就能查出誰對資料庫做了什麼。
範例:防止 SQL 注入
SQL 注入是攻擊資料庫最常見的手法之一。你一定要會防這招。想像你有個 app,讓用戶輸入自己的帳號 ID 來看個人資料。app 會發出這樣的查詢:
SELECT * FROM users WHERE id = 123;
但如果用戶輸入 123 OR 1=1 呢?查詢就會變成:
SELECT * FROM users WHERE id = 123 OR 1=1;
結果本來只該有一筆資料,整個 users 表都被看光光。
怎麼防?PostgreSQL 讓你用 參數化查詢 或預備語句(PREPARE 和 EXECUTE),這樣用戶資料就不會跟 SQL 程式碼混在一起。像這樣:
PREPARE get_user_by_id (int) AS
SELECT * FROM users WHERE id = $1;
EXECUTE get_user_by_id(123);
更多真實威脅範例
讓你更有感,為什麼安全性這麼重要,來兩個真實 scenario:
範例 1:「員工把整個表刪了」
有家公司(其實不只一家,這種事常發生...)實習生不小心在 console 輸入了:
DROP TABLE employees;
10 年的員工資料就這樣沒了。怎麼避免?
- 控管權限!比如
intern角色只給讀取權限。 - 設定稽核!log 會記錄誰下了致命指令。
範例 2:「資料外洩,因為連線沒加密」
如果用戶連 PostgreSQL server 沒加密,帳號密碼就可能被駭客攔截。記得設定 SSL,確保連線有加密。
管理員的關鍵任務
這堂課最後,幫你整理 PostgreSQL 管理員的三大重點:
- 權限分級。確保只有授權用戶能做特定操作。
- 加密。機密資料一定要加密存放和傳輸。
- 監控。設定稽核,隨時注意 log 裡的可疑行為。
接下來的課你會學到怎麼建立角色、用 GRANT 和 REVOKE 控管存取、實作資料列層級控管,還有用加密保護資料。
GO TO FULL VERSION