IIS Encrypt Web.config (Single Server, AppSettings, Web Farm)
2022-12-06
筆記 IIS 如何對 Web.config 進行加密,以保護連線資料庫的 Login 資訊無法被任意取得 Web.config 檔案者進行檢視。
說明
加密需要使用 ASPNET_REGISS
並且使用 -pef
參數,並指定要加密的 config 檔部分與資料夾路徑。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
-pef "connectionStrings" "D:\WebApps"
路徑的指定結束不需要加上額外的反斜線,另外也不需要以 web.config 結尾,只需要用資料夾路徑即可。
如果要進行解密,可以改使用參數 -pdf
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
-pdf "connectionStrings" "D:\WebApps"
加密不限定於 connectionStrings,同樣也可以用於加密 appsettings:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
-pef "appsettings" "D:\WebApps"
SecureAppSettings
如果想要加密部分 appsettings,其餘部分保持可見,可以將需要加密的部分獨立:
參考 Anupam Maiti 所分享的方法 How To Encrypt an AppSettings Key In Web.config,另定義 secureAppSettings 用於儲存需要被加密的 key-value。
首先需要再 configuration
加入:
<configSections>
<section name="secureAppSettings"
type="System.Configuration.NameValueSectionHandler, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
</configSections>
接著再加入 secureAppSettings 於 Web.config
<secureAppSettings>
<add key="DatabasePW" value="********"/>
</secureAppSettings>
接著使用對於 connectionStrings 相同加密的方式,進行 secureAppSettings 的加密。
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
-pef "secureAppSettings" "D:\WebApps"
-prov "DataProtectionConfigurationProvider"
讀取資料的方式:
var section =
System.Web.Configuration.WebConfigurationManager.GetSection("secureAppSettings")
as NameValueCollection;
Console.WriteLine(section["DatabasePW"]);
WebFarm Encryption
參考 Nedim Sahin 的分享 Connection string encryption and decryption:不同於單一伺服器的 Config 加密方式,如果是 WebFarm 的架構,為了讓不同的機器共同存取的 Config 在不同機器上都能夠被解密讀取,必須使用 RSA key
的方式進行加密。
首先使用 aspnet_regiis
進行 RSA 金鑰的產生。
cd C:\Windows\Microsoft.NET\Framework\v4.0.30319\
.\aspnet_regiis.exe -pc "KeyName" -exp
接著將 RSA 金鑰授予所需要使用的應用程式集區:
.\aspnet_regiis.exe -pa "KeyName" "IIS AppPool\ApplicationPoolName" -full
接著在 Web.config 加入 RSA Provider:
<configuration>
<configProtectedData>
<providers>
<add name="RSAProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0,
Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a,
processorArchitecture=MSIL"
keyContainerName="KeyName"
useMachineContainer="true" />
</providers>
</configProtectedData>
</configuration>
開始進行 Web.config 的加密:
.\aspnet_regiis.exe -pe "connectionStrings" -app "/WebApps" -prov "RSAProvider"
在測試站台能夠正確作用後,將 RSA 金鑰匯出以提供 WebFarm 中的其他伺服器使用:
.\aspnet_regiis.exe -px "KeyName" "c:\keys.xml" -pri
當 RSA 金鑰準備到其他伺服器後,開始進行匯入:
.\aspnet_regiis.exe -pi "KeyName" "c:\keys.xml"
接著再將 RSA 金鑰授予所需要使用的應用程式集區,完成後進行測試:
.\aspnet_regiis.exe -pa "KeyName" "IIS AppPool\ApplicationPoolName" -full