---
# System prepended metadata

title: IIS web.config 連線字串帳號密碼加密
tags: [資安]

---

# 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 會像這樣
![](https://hackmd.io/_uploads/S1TsROGJR.png)

### 指令說明


指令中的第一個參數 -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