2017年11月6日 星期一

使用相同的 RSA 金鑰對 Web.config 加密

最近面臨到越來越多客戶針對資安的問題提出各種要求,首要對付的問題就是對 Web.config 檔裡的各項連線資訊加密,通常我們會讓所有伺服器共用同樣的 RSA 金鑰,所以就會先在某一台主機上建立金鑰容器


1. 開啟 Windows 命令提示字窗,先切換到 aspnet_regiis.exe 工具目錄下


$ cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

or

$ cd C:\Windows\Microsoft.NET\Framework64\v4.0.30319


2. 建立一個自己的金鑰容器(參數 -exp 代表允許匯出)


$ aspnet_regiis.exe -pc "MyCustomKeys" -exp

PS: 若出現建立失敗的訊息,請先確認目前的使用者是否有 C:\ProgramData\Microsoft\Crypto\RSA 目錄下的 MachineKeys 資料夾 Write 權限


3. 在 Web.config 檔的 configuration 內任一地方加入 configProtectedData 區塊,如以下


<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <section name="nlog" type="NLog.Config.ConfigSectionHandler, NLog" />
  </configSections>
  ......
  ......
  <configProtectedData defaultProvider="MyProtectedProvider">
    <providers>
      <add name="MyProtectedProvider"
      type="System.Configuration.RsaProtectedConfigurationProvider, System.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
      keyContainerName="MyCustomKeys"
      useMachineContainer="true" />
    </providers>
  </configProtectedData>
......
......
</configuration>


4. 使用 MyProtectedProvider 來對 Web.config 裡的 appSettings 區段加密


$ aspnet_regiis.exe -pef appSettings "C:\Users\CoCo\WorkSpace\MyWebProject" -prov "MyProtectedProvider"

//補充:若欲加密區段不在第一層,寫法如以下
$ aspnet_regiis.exe -pef system.web/machineKey/.../... "C:\Users\CoCo\WorkSpace\MyWebProject" -prov "MyProtectedProvider"


5. 加密測試成功後,接著就是要匯出目前使用的金鑰


$ aspnet_regiis.exe -px "MyCustomKeys" D:\MyCustomKeys.xml -pri


6. 將匯出的金鑰複製到目標伺服器然後輸入以下指令即完成


$ aspnet_regiis.exe -pi “MyCustomKeys” C:\MyCustomKeys.xml


7. 若有權限相關問題,導致伺服器無法開啟 RSA 金鑰容器時可參考以下補充第 4 點給予應用程式權限,EX.


$ aspnet_regiis.exe -pa "MyCustomKeys" "IIS AppPool\DefaultAppPool"


8. 若之後要移除 RSA 金鑰容器時可以輸入以下指令


$ aspnet_regiis.exe -pz "MyCustomKeys"



補充:使用預設的 RSA 金鑰加密,通常用在本機端測試

1. 一樣先切換到 aspnet_regiis.exe 工具目錄下,輸入以下指令

$ aspnet_regiis.exe -pef appSettings "C:\Users\CoCo\WorkSpace\MyWebProject"

2. 這時 Web.config 裡的 appSettings 區段就會被加密,如下圖


3. 此時,執行程式後,我遇到了以下問題(若你沒有,則直接跳到步驟5)


4. 此問題代表你當前沒有存取主機金鑰的權限,解決方式為輸入以下指令,賦予當前使用者權限

$ aspnet_regiis.exe -pa "MyCustomKeys" "CoCo-PC\CoCo"

當然之後可能也需要 IIS 有權限存取,所以我也會多輸入以下指令(非必要)

$ aspnet_regiis.exe -pa "MyCustomKeys" "NT AUTHORITY\NETWORK SERVICE"

IIS 7.5 後預設會使用 IIS AppPool\DefaultAppPool 帳號而非NT AUTHORITY\NETWORK SERVICE,這時就需改輸入以下

$ aspnet_regiis.exe -pa "MyCustomKeys" "IIS AppPool\DefaultAppPool"

假如不清楚目標網站是使用哪一個帳戶,可先使用下列程式碼取得

var currentIdentity = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

若測試完畢後想要移除權限,只需將參數 a 改成 r 即可,如下

$ aspnet_regiis.exe -pr "MyCustomKeys" "CoCo-PC\CoCo"

PS: 還有一個更直接的做法,直接將 C:\ProgramData\Microsoft\Crypto\RSA 目錄下的 MachineKeys 資料夾 Read 權限開啟給每個人,也能直接解決該權限問題

5. 當確定程式執行一切沒問題後,就會需要用到解密


$ aspnet_regiis.exe -pdf appSettings "C:\Users\CoCo\WorkSpace\MyWebProject"





參考資料:


[ASP.NET] 使用相同 RSA 金鑰容器幫 web.config 連線字串加密

[黑暗執行緒] web.config連線字串加密工具

訪客統計