Try   HackMD

IIS web.config 連線字串帳號密碼加密

tags: 資安

問題

IIS 的網站會有一個檔案 web.config,通常裡面會放一些設定或是機密資料,例如資料庫連線字串,甚至包含帳號密碼。

為了避免這些資訊被竊取,理想的情況是使用另一個程式將字串加密,有許多教學或開發人員會分享自己開發的加解密程式,雖然安全性高,但管理上較不方便,比方說

  1. 遺失加解密工具或遺失使用方法
  2. 開發人員離職後無人維護(加解密演算法過時未更新)
  3. 教導新人需要特別學習這套獨一無二的程式增加學習成本

解決方法 使用 ASP .NET IIS 註冊工具 (Aspnet_regiis.exe) 把 web.config 加密

ASP.NET IIS 註冊工具 (Aspnet_regiis.exe) 是微軟提供的小程式,他能針對 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 了

加密方式

在管理員權限的 cmd 介面輸入以下指令

aspnet_regiis -pef connectionStrings D:\web  -prov "RsaProtectedConfigurationProvider"

執行後的結果如下

C:\Windows\Microsoft.NET\Framework64\v2.0.50727>
aspnet_regiis -pef appSettings D:\web  -prov "RsaProtectedConfigurationProvider"
正在加密組態區段...
成功!

加密後 web.config 會像這樣

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

指令說明

指令中的第一個參數 -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"

參考文件