C基礎:.NET環境下WebConfig的加密
在將ASP.NET項目部署到伺服器上時,內網環境下Web.Config往往是直接複製過去。對於外網環境,則需要對Web.Config文件進行加密。
.NET環境下一共提供了2種方式的加密功能,分別是DpapiProtectedConfigurationProvider和RsaProtectedConfigurationProvider提供程序。
前者在本機加密Web.Config後,只能在本機進行解密,如果需要將Config文件複製到外部主機,則無法進行解密。後者在本機加密Config文件後,可以到處密鑰容器,當把Config文件複製到外部主機後,可對先前導出的文件進行導入功能,導入後既可自動解密。
由於經常需要複製Config文件到外部主機,因此Rsa保護程序更加適用於實際業務場景,本文將詳細介紹RsaProtectedConfigurationProvider程序的使用步驟。
1. 使用RsaProvider提供程序,需要首先進入.NET Framework運行環境,可以配置環境變數或使用cd指令。
cd C:WindowsMicrosoft.NETFrameworkv2.0.50727
2. 接著便可以使用aspnet_regiis.exe創建一個Rsa密鑰容器。密鑰容器分用戶級別和計算機級別兩種情況,由於使用用戶級別密鑰沒什麼益處,一般使用計算機級別既可。
aspnet_regiis -pc "MyKeys" -exp
3. 創建密鑰容器後,還需要設置密鑰容器的訪問許可權,下面的命令授予NETWORK SERVICE 帳戶對計算機級別的 「MyKeys」 RSA 密鑰容器的訪問許可權。msdn上有一個aspx程序會展示你的asp.net程序的用戶標誌,不過本人實際執行pa指令後會報錯。
aspnet_regiis -pa "MyKeys" "NT AUTHORITYNETWORK SERVICE"
4. 在Web.Config文件中加上如下配置節點,MyProvider為你的保護程序名稱,可隨意指定。keyContainerName為前面設置的密鑰容器名稱,useMachineContainer為true表示使用計算機級別密鑰,為false表示使用使用用戶級密鑰。
這段配置節不要像msdn那樣直接放在configure配置節點下面,這樣會報錯,建議放在你需要加密節點的後面。
5 .下面的指令將對指定路徑下的config文件節點進行加密,如果配置文件中還有session的sql連接字元串,也可以對sessionState節點進行加密。
aspnet_regiis -pef "connectionStrings" "D:WebApp" -prov "MyProvider"
aspnet_regiis -pef "system.web/sessionState" "D:WebApp" -prov "MyProvider"
加密後的connectionStrings節點如下所示,此時仍可訪問ASP.NET應用程序。
如果需要解密,可以執行下面這條指令aspnet_regiis -pdf "connectionStrings" "D:WebApp"
6. 導出密鑰容器,密鑰信息將被存儲在導出的xml文件中,pri表示將公鑰和私鑰一起導出。
aspnet_regiis -px "MyKeys" "D:/MyKeys.xml" -pri
7. 有了這個xml文件,就相當於有了密鑰容器,導出密鑰容器後可以對密鑰容器進行刪除,刪除指令如下。
aspnet_regiis -pz "MyKeys"
8. 刪除密鑰容器後,如果前面你沒有對Config文件進行解密,那麼運行ASP.NET程序將會直接報錯。
在本人實際操作中發現,如果對正在運行的ASP.NET應用程序的Web.Config文件進行加密,加密後立即刪除密鑰,此時點擊運行(不調試)仍可正常訪問。這表明Rsa解密操作在內存中執行,只有重新生成解決方案或調試(會執行生成操作)後,訪問才會報錯。
9. 現在可以將加密後的config文件和導出的MyKeys.xml一起複制到伺服器上,此時運行網站將會直接報錯,需執行下面的導入指令。
aspnet_regiis -pi "MyKeys" "D:/MyKeys.xml"
導入後,在本機訪問ASP.NET網站會發現仍然報錯,提示無法open Provider。這個坑最終在網上找到解決方法,如下面指令所示,需要為應用程序池設置對密鑰容器的訪問許可權。
aspnet_regiis -pa "MyKeys" "IIS APPPOOLMyWeb" -full
自此整個流程已結束,可以將上面這些指令封裝成2個批處理程序,一個是密鑰製作bat,一個是導入bat,如下所示。
@echo on
cd C:WindowsMicrosoft.NETFrameworkv2.0.50727
::設置config地址,config文件要在E: est下面
set configAddress="E: est"
::創建RSA密鑰容器
aspnet_regiis -pc "MyKeys" -exp
::設置密鑰容器訪問許可權
aspnet_regiis -pa "MyKeys" "NT AUTHORITYNETWORK SERVICE"
::加密
aspnet_regiis -pef "connectionStrings" "D:WebApp" -prov "MyProvider"
aspnet_regiis -pef "system.web/sessionState" "D:WebApp" -prov "MyProvider"
::導出
aspnet_regiis -px "MyKeys" "D:/MyKeys.xml" -pri
::刪除密鑰容器
aspnet_regiis -pz "MyKeys"
pause
@echo on
cd C:WindowsMicrosoft.NETFrameworkv2.0.50727
::刪除舊的密鑰容器
aspnet_regiis -pz "MyKeys"
::導入新的密鑰容器
aspnet_regiis -pi "MyKeys" "D:/MyKeys.xml"
::設置應用程序池的訪問許可權
aspnet_regiis -pa "MyKeys" "IIS APPPOOLMyWeb" -full
pause
在寫完這2個bat後,我想起前面的解密指令aspnet_regiis -pdf "connectionStrings" "D:WebApp",它只需要提供節點名稱和路徑。也就是說,如果攻擊者能夠在被攻擊的伺服器上執行cmd指令,那麼他就可以對config進行解密。這個問題如有前輩有更好的解決方式,歡迎您指導留言。
如果當初微軟編寫這個指令解析方法時,加上一個key的參數。那麼即使攻擊者能夠執行cmd指令,由於不知道key的名稱,所以仍然無法對config進行解密。
聲明:本文原創發表於博客園,作者為方小白,如有錯誤歡迎指出。本文未經作者許可不許轉載,否則視為侵權。
TAG:達人科技 |
※快速搭建CentOS+ASP.NET Core環境支持WebSocket
※Linux部署Nginx+Mysql+PHP+PHPMyAdmin4環境
※在SAP雲平台的CloudFoundry環境下消費ABAP On-Premise OData服務
※Python3+Selenium3 Windows下環境搭建
※使用 Visual Studio Code 搭建 C/C+開發和調試環境
※Appium Android For Mac OS 搭建環境
※Eclipse JSP/Servlet 環境搭建
※Docker環境下搭建DNS LVS(keepAlived) OpenResty伺服器簡易集群
※Cloud Native 環境
※Ubuntu18.04LTS下搭建Web環境暨安裝Moodle平台
※阿里雲伺服器Centos7.4搭建LNMP環境 WordPress安裝
※Ubuntu Linux環境下shadowsocks-qt5的安裝與配置
※Reality Blender讓您將周圍環境帶入VR
※Win10+RTX2080環境搭建:tensorflow、mxnet、pytorch、caffe
※終極環境下的保障丨686 GLCR GORE-TEX? SMARTY? 3-in-1 Weapon雪服
※AliveinVR允許多個用戶在VR環境中控制Ableton Live
※「具備環境降噪功能」 Audio Technica ATH-SR50BT無線耳罩耳機
※JMeter+Ant+Jenkins+SVN 介面自動化環境搭建
※AR環境監測工具Clean A/R獲Unity for Humanity 2019挑戰賽最高獎
※ubuntu16.04通過Chrome搭建Postman環境