CodeGym /課程 /SQL SELF /存取管理與安全性

存取管理與安全性

SQL SELF
等級 47, 課堂 0
開放

想像一下這種夜驚:你是資料庫管理員,結果重要的客戶資料表突然就...消失了。誰幹的?為什麼?也許是菜鳥實習生不小心寫了 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 控管存取、實作資料列層級控管,還有用加密保護資料。

2
任務
SQL SELF, 等級 47, 課堂 0
上鎖
使用 pgAdmin 來監控交易
使用 pgAdmin 來監控交易
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION