IIS Encrypt Web.config (Single Server, AppSettings, Web Farm)


  1. 說明
    1. SecureAppSettings
    2. WebFarm Encryption
  2. 相關連結

筆記 IIS 如何對 Web.config 進行加密,以保護連線資料庫的 Login 資訊無法被任意取得 Web.config 檔案者進行檢視。

logo

說明

加密需要使用 ASPNET_REGISS 並且使用 -pef 參數,並指定要加密的 config 檔部分與資料夾路徑。

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
  -pef "connectionStrings" "D:\WebApps\"

如果要進行解密,可以改使用參數 -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>

接著再加入 secureAppSettingsWeb.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

相關連結

IIS 筆記整理

IIS 網頁伺服器的安全設定 (IIS Security Configuration)