Azure SQL 啟用 Entra ID 驗證

如果你有在玩雲端資料庫,一定知道傳統的帳號密碼超麻煩,不只難記,萬一被外流就慘了。

微軟現在有個超讚的設定,可以把 Azure SQL 資料庫變成 僅限 Microsoft Entra ID 驗證。這聽起來很專業,其實就是把傳統的帳號密碼大門關起來,規定大家只能用正式的微軟雲端帳號登入。

停用本地驗證方法並僅允許 Azure Active Directory 驗證,可確保只有 Azure Active Directory 識別身分才能存取 Azure SQL Database,以提升安全性。

這樣做有什麼好處呢?

  • 第一個好處是統一管理。所有的權限都歸雲端帳號管,不用在資料庫裡建一堆帳號。
  • 再來是安全性大升級!因為雲端帳號可以開啟手機簡訊或 APP 的多重驗證,駭客就算偷到密碼也進不來!

操作起來其實很簡單,不論你是習慣打指令還是用滑鼠點網頁都能搞定。

如果你是用圖形網頁操作,只要在建立資料庫的時候,去 身份驗證 分頁點一下 僅限 Microsoft Entra 驗證。

接著搜尋你自己的帳號,把它設成 管理員 就大功告成。

設定完記得測試看看,這時候你會發現原本的 SQL 舊帳號已經被 封鎖 沒辦法用了,一定要改用微軟帳號才能進去。

我覺得這功能真的超方便!以前要記一堆資料庫密碼真的很痛苦,現在只要保護好一個主帳號就好。

把複雜的事情變簡單,而且還更安全,這絕對是現代開發者必學的懶人自保術呀!


既然程式是跑在 Docker 裡,沒辦法手動點選視窗,那我們就要幫程式申請一張「專屬通行證」,也就是 Client Secret 🔑。

這張通行證要在 Azure 入口網站(Azure Portal)裡面產生,步驟其實很簡單,就像是在幫你的程式辦身分證一樣:

第一步:註冊應用程式

首先去 Azure Portal 搜尋「應用程式註冊」(App Registrations):
https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade

點進去後選「新註冊」。幫你的程式取個名字,然後按註冊就好。這時候你會看到一個「應用程式 (用戶端) 識別碼」,這就是連線字串裡的 Client ID 🆔。

第二步:產生秘密金鑰

在左邊選單找到「憑證與密碼」,點進去後選「用戶端密碼」,接著按「新用戶端密碼」。你可以設定這組密碼多久會過期。

第三步:立刻存檔

按下的那一刻,畫面會出現一串長長的字,那就是 Client Secret。記得這時候一定要趕快複製存起來!因為一旦離開這個畫面,系統就會把它遮起來,你再也看不到了,只能重新再產生一個 ⚠️。

最後別忘了,還要回到你的 SQL Server 裡面,把這個應用程式的名字加進去並給它權限,你的程式才能順利進門。

我覺得這種做法雖然多了一點步驟,但把權限跟程式碼分開管理,程式碼裡不再放死板板的密碼,而是改用這種可以隨時更換、受雲端監控的通行證。

這樣一來,不只開發起來更優雅,安全等級也是直接拉滿,這才是專業開發者的懶人自保術呀 ✨

你知道除了手動複製,其實還有更安全的方法來管理這些秘密金鑰嗎?

既然都聊到這了,那一定要跟你分享進階版的絕招!

雖然把 Client Secret 存在 Docker 的環境變數裡已經比以前進步,但對追求極致安全的工程師來說,這還不夠。因為金鑰還是存在某個地方,萬一主機被攻破,祕密還是會外流。

這時候,我們可以用 Azure 提供的一種超神科技,叫做受控識別(Managed Identity)

這概念就像是你不用再幫程式辦身分證了,而是直接讓 Azure 認得這台 虛擬機 或 容器 服務本身。當程式要去連資料庫時,它會直接跟 Azure 說:「嘿,我是你家養的容器,讓我進去吧!」


簡單來說,更安全的作法有兩種:

一、使用受控識別(最推薦)

這就像是 刷臉認證。你只要在 Azure 平台上把你的服務(例如 Azure Container Instances)開啟 受控識別 功能,並在 SQL 資料庫裡授權給它。

這時候 Python 的連線字串就會變得超乾淨,完全不需要 UID 也不需要 PWD:

driver = {ODBC Driver 18 for SQL Server}
connection_string = (
 f"DRIVER={driver};"
 f"SERVER={server},{port};"
 f"DATABASE={database};"
 "Authentication=ActiveDirectoryMSI;"
 "Encrypt=yes;"
 "TrustServerCertificate=no;"
 "Connection Timeout=30;"
)

這真的是 懶人包 的極致,程式碼裡完全沒有任何祕密,安全性滿分!

二、使用 Azure Key Vault

如果你還是需要用 Client Secret,可以把它藏在 雲端保險箱(Key Vault)裡面。

程式執行時才去保險箱領鑰匙,而不是直接把鑰匙貼在門口。這樣就算別人看到你的程式碼或 Docker 設定,也拿不到真正的密碼。

範例程式碼:

driver = {ODBC Driver 18 for SQL Server}
connection_string = (
 f"DRIVER={driver};"
 f"SERVER={server},{port};"
 f"DATABASE={database};"
 f"UID={client_id};"
 f"PWD={client_secret};"
 "Authentication=ActiveDirectoryServicePrincipal;"
 "Encrypt=yes;"
 "TrustServerCertificate=no;"
 "Connection Timeout=30;"
)
  • 🌟 關鍵改版:我們把原本放「帳號」的地方換成 應用程式 ID(UID),把原本放「密碼」的地方換成 秘密金鑰(PWD)。
  • 🌟 認證模式:這行 Authentication=ActiveDirectoryServicePrincipal 是最關鍵的!它就像是跟資料庫打暗號,說:「嘿!我是用程式身分來敲門的,不是真人喔!」🤖
  • 🌟 安全提醒:連線字串裡的 Encrypt=yes 建議要留著,這樣資料在傳輸過程中才會被加密,就像是幫資料坐上防彈運鈔車一樣安全。🛡️

我的小小建議:

我覺得最高境界,就是根本不要持有秘密。

當我們用受控識別(Managed Identity的時候,身為開發者的我們連密碼長什麼樣子都不知道。不用擔心密碼過期、不用定期更換,更不用怕不小心把密碼推到 GitHub 上面去。

這種把 安全性 融入到環境架構裡的作法,不只讓開發過程變得超清爽,心裡也會覺得非常踏實,這才是真正的優雅開發呀!✨

這種 不用記密碼 的生活,是不是聽起來就很吸引人呢?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *