# IIS web.config 連線字串帳號密碼加密 ###### tags: `資安` ## 問題 IIS 的網站會有一個檔案 web.config,通常裡面會放一些設定或是機密資料,例如資料庫連線字串,甚至包含帳號密碼。 為了避免這些資訊被竊取,理想的情況是使用另一個程式將字串加密,有許多教學或開發人員會分享自己開發的加解密程式,雖然安全性高,但管理上較不方便,比方說 1. 遺失加解密工具或遺失使用方法 2. 開發人員離職後無人維護(加解密演算法過時未更新) 3. 教導新人需要特別學習這套獨一無二的程式增加學習成本 ## 解決方法 使用 ASP .NET IIS 註冊工具 (Aspnet_regiis.exe) 把 web.config 加密 [ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)](https://learn.microsoft.com/zh-tw/previous-versions/dotnet/netframework-2.0/k6h9cz8h(v=vs.80)?redirectedfrom=MSDN) 是微軟提供的小程式,他能針對 web.config 內的連線字串加密或解密,即使是加密狀態,同一台電腦的IIS網站可正常讀取不受有想,但直接把web.config 拿到其它電腦時無法使用,可以避免帳號密碼等敏感資訊外洩 aspnet_regiis 這個程式可以在 Windows資料夾內Microsoft.NET目錄的Framework64目錄中找到,例如以下路徑 ```C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727\aspnet_regiis.exe``` 而微軟的 Visual Studio本身也有內建 aspnet_regiis,以下採用 Visual Studio 2019預設安裝路徑位為範例,先用系統管理員的權限開cmd,然後執行下面這個bat,就能使用 aspnet_regiis 了 ```C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat ``` ### 加密方式 在管理員權限的 cmd 介面輸入以下指令 ```=cmd aspnet_regiis -pef connectionStrings D:\web -prov "RsaProtectedConfigurationProvider" ``` 執行後的結果如下 ```=cmd C:\Windows\Microsoft.NET\Framework64\v2.0.50727> aspnet_regiis -pef appSettings D:\web -prov "RsaProtectedConfigurationProvider" 正在加密組態區段... 成功! ``` 加密後 web.config 會像這樣 ![](https://hackmd.io/_uploads/S1TsROGJR.png) ### 指令說明 指令中的第一個參數 -pef connectionStrings ,代表將 connectionStrings 這個區塊加密,總共有4個區塊可以加密,請依照自己的敏感資訊躲在哪一塊自己更改 * appSettings * connectionStrings * identity * sessionState 這個指令預設會加密 D:\web\ 這個路徑的 web.config 這個檔案,如果想要特別指定其他的檔名,也可以將上面那一串改寫 D:\web\another.config 後面的 -prov "RsaProtectedConfigurationProvider" 則是指使用 Rsa 的演算法進行加密保護 這個演算法是 .NET Framework 隨附的,有這兩個可以選擇 * RSAProtectedConfigurationProvider -使用非對稱 RSA 演算法 進行加密和解密。 * DPAPIProtectedConfigurationProvider -使用 Windows 資料保護 API (DPAPI) 進行加密和解密。 ### 設定金鑰容器權限 前面加密的時候是使用系統管理員權限,還要設定讓網站應用程式執行的時候也有讀取權限,這樣程式運作時才能自己解密,指令如下 ``` aspnet_regiis -pa "NetFrameworkConfigurationKey" "NT AUTHORITY\NETWORK SERVICE" ``` 注意 "NT AUTHORITY\NETWORK SERVICE" 是IIS預設的帳號,如果網站應用程式有特別指定別的使用者,那這一段要換成其他帳號,這樣網站運作的時候才能正常運作 ### 解密方式 如果未來需要修改加密的內容,可以利用這個指令將檔案解密 ``` aspnet_regiis -pdf "connectionStrings" "D:\web" ``` ## 參考文件 * 保護連接字串與其他設定資訊 (C#) https://docs.microsoft.com/zh-tw/aspnet/web-forms/overview/data-access/advanced-data-access-scenarios/protecting-connection-strings-and-other-configuration-information-cs * [Day15] 資料使用安全(保護連接字串)下 https://ithelp.ithome.com.tw/articles/10188072 * ASP.NET 2.0 筆記:加密組態檔 https://dotblogs.com.tw/huanlin/2008/04/23/3226 * web.config 加密 https://blog.xuite.net/sugopili/computerblog/83661629-web.config+%E5%8A%A0%E5%AF%86 * Web.config connectionStrings 加密 發生錯誤 http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD2007101311071909M.html * RSA 金鑰對Web.config資料庫連線字串加密 https://medium.com/selectprogram/使用rsa-金鑰對web-config資料庫連線字串加密-19f2b66d7a