如果你有在玩雲端資料庫,一定知道傳統的帳號密碼超麻煩,不只難記,萬一被外流就慘了。
微軟現在有個超讚的設定,可以把 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 上面去。
這種把 安全性 融入到環境架構裡的作法,不只讓開發過程變得超清爽,心裡也會覺得非常踏實,這才是真正的優雅開發呀!✨
這種 不用記密碼 的生活,是不是聽起來就很吸引人呢?
