# IIS web.config 連線字串帳號密碼加密
###### tags: `資安`
## 問題
IIS 的網站會有一個檔案 web.config,通常裡面會放一些設定或是機密資料,例如資料庫連線字串,甚至包含帳號密碼。
為了避免這些資訊被竊取,理想的情況是使用另一個程式將字串加密,有許多教學或開發人員會分享自己開發的加解密程式,雖然安全性高,但管理上較不方便,比方說
1. 遺失加解密工具或遺失使用方法
2. 開發人員離職後無人維護(加解密演算法過時未更新)
3. 教導新人需要特別學習這套獨一無二的程式增加學習成本
## 解決方法 使用 ASP .NET IIS 註冊工具 (Aspnet_regiis.exe) 把 web.config 加密
[ASP.NET IIS 註冊工具 (Aspnet_regiis.exe)](https://learn.microsoft.com/zh-tw/previous-versions/dotnet/netframework-2.0/k6h9cz8h(v=vs.80)?redirectedfrom=MSDN) 是微軟提供的小程式,他能針對 web.config 內的連線字串加密或解密,即使是加密狀態,同一台電腦的IIS網站可正常讀取不受影響,但直接把 web.config 拿到其它電腦時將無法使用,可以避免帳號密碼等敏感資訊外洩。
:::info
**提醒**
加密後的檔案拿去其他電腦無法使用,是因為加密金鑰綁在作業系統底層,因此記得移轉時要解密再移轉,或是整台作業系統一起備份喔
:::
## 如果電腦有安裝 IIS 網站伺服器請看這邊
aspnet_regiis 這個程式可以在 Windows資料夾內Microsoft.NET目錄的Framework64目錄中找到,例如以下路徑
```C:\WINDOWS\Microsoft.NET\Framework64\v2.0.50727版號可能不同請依自己電腦資料夾更改\aspnet_regiis.exe```
## (參考選項)如果電腦有 Visual Studio ,希望常常使用 aspnet_regiis 請看這邊(不建議使用)
而微軟的 Visual Studio本身也有內建 aspnet_regiis,以下採用 Visual Studio 2019預設安裝路徑位為範例,先用系統管理員的權限開cmd,然後執行下面這個bat,就能在任意位置使用 aspnet_regiis 了
```C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\Common7\Tools\VsDevCmd.bat```
## 加密方式
在管理員權限的 cmd 介面輸入以下指令
```=cmd
aspnet_regiis -pef connectionStrings D:\web -prov "RsaProtectedConfigurationProvider"
```
執行後的結果如下
```=cmd
C:\Windows\Microsoft.NET\Framework64\v2.0.50727>
aspnet_regiis -pef appSettings D:\web -prov "RsaProtectedConfigurationProvider"
正在加密組態區段...
成功!
```
加密後 web.config 會像這樣

### 指令說明
指令中的第一個參數 -pef connectionStrings ,代表將 connectionStrings 這個區塊加密,總共有4個區塊可以加密,請依照自己的敏感資訊躲在哪一塊自己更改
* appSettings
* connectionStrings
* identity
* sessionState
這個指令預設會加密 D:\web\ 這個路徑的 web.config 這個檔案,如果想要特別指定其他的檔名,也可以將 ```D:\web\``` 這一段改寫 ```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"
```
## 參考文件
* 保護連接字串與其他設定資訊 (C#)
https://docs.microsoft.com/zh-tw/aspnet/web-forms/overview/data-access/advanced-data-access-scenarios/protecting-connection-strings-and-other-configuration-information-cs
* [Day15] 資料使用安全(保護連接字串)下
https://ithelp.ithome.com.tw/articles/10188072
* ASP.NET 2.0 筆記:加密組態檔
https://dotblogs.com.tw/huanlin/2008/04/23/3226
* web.config 加密
https://blog.xuite.net/sugopili/computerblog/83661629-web.config+%E5%8A%A0%E5%AF%86
* Web.config connectionStrings 加密 發生錯誤
http://www.blueshop.com.tw/board/FUM20041006161839LRJ/BRD2007101311071909M.html
* RSA 金鑰對Web.config資料庫連線字串加密
https://medium.com/selectprogram/使用rsa-金鑰對web-config資料庫連線字串加密-19f2b66d7a