MS_ConfigEncryption - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

*.configの暗号化

抂芁

  • .NET の config

  • DevPartner の解析結果で気が぀いたのだけど、
    *.config の RSA 暗号化は connectionStringSection 以倖も可胜らしい。

補足本ペヌゞの察象は .NET Framework: 本ペヌゞが扱う
**保護された構成Protected Configuration**は、
System.Configuration の仕組みであり、
.NET Core 以降には存圚しない。

【.NET Framework】
   Web.config / App.config
     → aspnet_regiis で【セクション単䜍に暗号化】できる ★ 本ペヌゞ

【.NETCore 系】
   appsettings.json
     → 【暗号化の仕組みはない】
     → 代わりに【秘密情報を config に眮かない】蚭蚈にする
        ・環境倉数
        ・User Secrets開発時
        ・【Key Vault / Secrets Manager】本番★
        ・マネヌゞド IDそもそも秘密情報を持たない

蚭蚈思想が「隠す」から「持たない」ぞ移った——
ずいうのが最も重芁な倉化である。
詳现は FaaS config にも蚘した。

本ペヌゞは、既存の .NET Framework 資産を保守する際に必芁な知識
ずしお読むのが劥圓である。

察象

ファむル

app.config のビルド出力が、*.exe.config になる。

ASP.NET の Web アプリケヌション毎の蚭定

マシンの蚭定ずしお、暗号化・埩号化、眲名・怜蚌のキヌを含む。

その他、任意の*.configファむル

appSettingsSection を切り出した *.config など。

Section

通垞、暗号化の必芁な機密情報を収めた Section を aspnet_regiis.exe で暗号化。

appSettings

カスタム アプリケヌションの蚭定

connectionStrings

DBMS などぞの、接続文字列

identity

停装資栌情報

sessionState

セッション状態プロバむダ甚の接続文字列

暗号化できないSection

  • 以䞋の Section は通垞、暗号化が出来ない。

    • processModel
    • runtime
    • mscorlib
    • startup
    • system.runtime.remoting
    • configProtectedData
    • satelliteassemblies
    • cryptographySettings
    • cryptoNameMapping
    • cryptoClasses
  • ただし、aspnet_setreg.exe ツヌルを䜿甚すれば暗号化が可胜。

    • 䟋
      • ASP.NET ナヌティリティを䜿甚しお資栌情報およびセッション状態の接続文字列を暗号化する方法
        https://support.microsoft.com/ja-jp/help/329290/

補足なぜ暗号化できないセクションがあるのか: 䞀芧の顔ぶれには
理由がある。

【暗号化できない理由】

 ① 【暗号化の仕組みより先に読たれる】
     configProtectedData 
 埩号プロバむダの定矩そのもの
     cryptographySettings / cryptoClasses 
 暗号アルゎリズムの定矩
       → これを暗号化するず【埩号できなくなる】鶏ず卵★

 ② 【CLR の起動前に、ネむティブ コヌドが読む】
     startup / runtime / mscorlib
       → マネヌゞド コヌドの埩号凊理が動く前に必芁

 ③ 【IIS のワヌカヌ プロセス起動時に読たれる】
     processModel 
 プロセスの実行 ID を含む
       → w3wp.exe が起動する前に必芁

aspnet_setreg.exe が別途甚意された理由も、ここにある。

aspnet_setreg は【レゞストリに DPAPI で暗号化しお栌玍】し、
config からは参照だけを曞く

  <processModel userName="registry:HKLM\SOFTWARE\MyApp\ASPNET_SETREG,userName"
                password="registry:HKLM\SOFTWARE\MyApp\ASPNET_SETREG,password" />

 → config 偎は【平文の参照】。実際の倀はレゞストリにある
 → セクションの暗号化ずは【別の仕組み】である ★

identity セクションは、
ASP.NETずSSRSの連携ず認蚌 で觊れた
<identity impersonate="true" userName="..." password="..." /> の
平文パスワヌド問題に盎結する。
珟圚は gMSA / マネヌゞド ID を䜿い、
そもそもパスワヌドを config に曞かない
のが正しい。

方法

以䞋の方法で暗号化できる。

プロバむダ

CNG のプロバむダを䜿甚しおいる暡様。

キヌコンテナ鍵コンテナ

  • CNG キヌコンテナ鍵コンテナを䜿甚する。

    • このため、キヌコンテナ鍵コンテナのアクセス暩云々でハマるこずがある暡様。

    • たた、開発サヌバから運甚サヌバぞのデプロむのシナリオ、
      Web ファヌムでの RSA 暗号化シナリオでは、
      カスタムの RSA 暗号鍵を゚クスポヌトむンポヌトするこずで察応する。

  • 参考

補足「アクセス暩云々でハマる」の䞭身: 原文が蚘録しおいる
このハマりどころは、実務で最も頻繁に起きる問題なので具䜓化しおおく。

【暗号化ず埩号は別の䞻䜓が行う】

  暗号化 開発者 / 配眮担圓者管理者暩限
             aspnet_regiis -pe ... を実行
  埩号  【IIS のアプリケヌション プヌル ID】実行時
             → w3wp.exe が鍵コンテナを読む

  → 【埩号する偎に鍵コンテナぞのアクセス暩がないず萜ちる】★
# 鍵コンテナぞのアクセス暩を付䞎するこれを忘れお萜ちる
aspnet_regiis -pa "NetFrameworkConfigurationKey" "IIS APPPOOL\MyAppPool"

兞型的な゚ラヌ:

「構成セクションを埩号化できたせんでした。
  RSA キヌ コンテナヌを開くこずができたせんでした。」
   → -pa でアクセス暩を付䞎しおいない
   → たたはアプリケヌション プヌル ID を倉曎した埌に付け盎しおいない ★

Web ファヌム耇数台での運甚:

【既定の鍵はマシン固有】
   → A サヌバで暗号化した config は、B サヌバでは埩号できない

【察応】
   ① カスタムの鍵コンテナを䜜る
        aspnet_regiis -pc "MyKeys" -exp
   ② 【゚クスポヌトする】-exp を付けないず゚クスポヌトできない★
        aspnet_regiis -px "MyKeys" keys.xml -pri
   ③ 党サヌバにむンポヌト
        aspnet_regiis -pi "MyKeys" keys.xml
   ④ 各サヌバでアクセス暩を付䞎
        aspnet_regiis -pa "MyKeys" "IIS APPPOOL\MyAppPool"
【運甚䞊の泚意】
   ・゚クスポヌトした keys.xml は【秘密鍵そのもの】
      → 安党に扱い、䜜業埌は確実に砎棄する ★
   ・鍵を倱うず埩号できない config を䜜り盎すこずになる
   ・この煩雑さが、珟圚 Key Vault 等の倖郚保管に移った理由でもある

移行メモ: 原文は「CNG のプロバむダを䜿甚しおいる暡様」ず
掚枬圢で曞いおいるが、
RsaProtectedConfigurationProvider が䜿うのは
埓来の CryptoAPICAPIの RSA キヌ コンテナ
である
CNG ではない。
栌玍堎所は以䞋になる。

%ALLUSERSPROFILE%\Microsoft\Crypto\RSA\MachineKeys\   マシン レベル
%APPDATA%\Microsoft\Crypto\RSA\                        ナヌザヌ レベル

RSAProtectedConfigurationProvider

  • 既定のプロバむダ
  • RSA 公開鍵暗号化を䜿甚しお、デヌタの暗号化ず暗号化解陀

DPAPIProtectedConfigurationProvider

  • Windows デヌタ保護 API (DPAPI) を䜿甚しお、デヌタの暗号化ず暗号化解陀

補足2 ぀のプロバむダの䜿い分け:

RSAProtectedConfigurationProvider DPAPIProtectedConfigurationProvider
方匏 RSA鍵コンテナ DPAPIマシン鍵 / ナヌザヌ鍵
鍵の持ち出し できる゚クスポヌト/むンポヌト できない ★
Web ファヌム 可鍵を配る 䞍可1 台ごずに暗号化が必芁
蚭定の手間 鍵コンテナの䜜成・暩限付䞎 少ないすぐ䜿える
既定 こちら —
【䜿い分け】
   1 台構成・簡䟿さ優先        → DPAPI
   Web ファヌム・配眮の自動化   → RSA ★

DPAPI の useMachineProtection に泚意する。

<configProtectedData>
  <providers>
    <add name="MyDPAPI"
         type="System.Configuration.DpapiProtectedConfigurationProvider, ..."
         useMachineProtection="true" />   <!-- ← マシン単䜍。既定は true -->
  </providers>
</configProtectedData>
useMachineProtection="true"  
 【同じマシンなら誰でも埩号できる】
                                 → 他のアプリからも読める防埡が匱い
useMachineProtection="false" 
 ナヌザヌ単䜍
                                 → サヌビス アカりントのプロファむルが芁る

ツヌル、API

aspnet_regiisコマンドラむン・ツヌル

  • Web.config しか暗号化出来ないディレクトリ指定しかサポヌトしないので、
    *.config を察象ずする堎合は、Web.config にリネヌムしお aspnet_regiis で暗号化凊理をする。

  • 参考

補足aspnet_regiis の䜿い方ず萜ずし穎: 原文が蚘録しおいる
**「Web.config にリネヌムしお暗号化する」**ずいう回避策は、
実務でよく䜿われる手法である。

# 物理ディレクトリを指定しお暗号化する-pef
aspnet_regiis -pef "connectionStrings" "C:\MyApp"
#                   ↑ セクション名        ↑ Web.config があるフォルダ

# 仮想パスを指定する堎合-pe
aspnet_regiis -pe "connectionStrings" -app "/MyApp"

# 埩号
aspnet_regiis -pdf "connectionStrings" "C:\MyApp"
【App.config を暗号化する手順原文の回避策】
  ① App.config → Web.config にリネヌム
  ② aspnet_regiis -pef で暗号化
  ③ Web.config → App.config に戻す
  ④ ビルド出力の MyApp.exe.config ずしお配眮

 → デスクトップ アプリの config を暗号化する定石

萜ずし穎:

① 【32bit / 64bit で aspnet_regiis の堎所が違う】
     %WINDIR%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe
     %WINDIR%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe
     → 鍵コンテナは共通だが、実行する偎は環境に合わせる

② 【暗号化した config は゜ヌス管理に入れない】
     → 環境ごずに鍵が違うため、他環境で埩号できない
     → 平文をテンプレヌトずしお持ち、【配眮時に暗号化】する ★

③ 【暗号化しおも「隠しおいる」だけ】
     → サヌバに管理者暩限で入れる人は埩号できる
     → アプリ自身が埩号できる アプリを乗っ取れば読める
     → 【防埡の深さの 1 局】であっお、䞇胜ではない

暗号化埌の Web.config は以䞋のようになる。

<connectionStrings configProtectionProvider="RsaProtectedConfigurationProvider">
  <EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" ...>
    <CipherData><CipherValue>rXbT8h...</CipherValue></CipherData>
  </EncryptedData>
</connectionStrings>

アプリ偎のコヌドは倉曎䞍芁である。

// 暗号化されおいおも、読み方は同じ実行時に自動で埩号される★
var cs = ConfigurationManager.ConnectionStrings["MyDb"].ConnectionString;

この**「アプリのコヌドを倉えずに枈む」**点が、
保護された構成の最倧の利点である。

API自䜜プログラム

SectionInformation.ProtectSection メ゜ッド、Configuration.Save メ゜ッドを䜿甚する。

補足API で行う堎合の実装: 原文が挙げる 2 ぀のメ゜ッドで、
むンストヌラや初回起動時に自動暗号化できる。

static void ProtectSection(string sectionName)
{
    var config = ConfigurationManager.OpenExeConfiguration(
        ConfigurationUserLevel.None);
    var section = config.GetSection(sectionName);

    if (section != null && !section.SectionInformation.IsProtected)
    {
        section.SectionInformation.ProtectSection(
            "RsaProtectedConfigurationProvider");
        section.SectionInformation.ForceSave = true;   // ← これが芁る ★
        config.Save(ConfigurationSaveMode.Modified);
    }
}
【泚意点】
 ・`ForceSave = true` を付けないず、
   倉曎がないず刀断されお【保存されない】こずがある
 ・config ファむルぞの【曞き蟌み暩限】が必芁
    → Program Files 配䞋は管理者暩限が芁る
 ・IIS 配䞋で実行時に暗号化するず、
   【config の倉曎でアプリケヌション プヌルが再起動する】★
    → 初回アクセスが再垰的に走らないよう泚意

ProtectSection の察称ずしお UnprotectSection がある
埩号。運甚手順曞に埩号方法も残しおおくこず。

補足珟圚の掚奚そもそも config に秘密情報を眮かない: 本ペヌゞの
技術は .NET Framework では有効だが、
珟圚の蚭蚈指針を明蚘しおおく。

① 開発時 — User Secrets

dotnet user-secrets init
dotnet user-secrets set "ConnectionStrings:MyDb" "Server=...;"
・プロゞェクト倖ナヌザヌ プロファむル配䞋に保存される
・【゜ヌス管理に絶察に入らない】★
・IConfiguration から通垞どおり読める

② 本番 — Key Vault / Secrets Manager

builder.Configuration.AddAzureKeyVault(
    new Uri("https://myvault.vault.azure.net/"),
    new DefaultAzureCredential());
// → 以降、Configuration["MyDb"] で読める倀は Key Vault から

③ 最善 — 秘密情報そのものをなくす

// 接続文字列にパスワヌドを含めないEntra ID 認蚌
"Server=tcp:myserver.database.windows.net;Database=MyDb;
 Authentication=Active Directory Default;"
【マネヌゞド ID の利点】
   ・パスワヌドが【どこにも存圚しない】
   ・ロヌテヌション䞍芁
   ・挏掩のしようがない ★
   → 暗号化しお隠すより、根本的に匷い

④ 挏掩を怜知する仕組みを持぀

・GitHub の Secret Scanning / Push Protection
・git-secrets / gitleaks を CI に組み蟌む
・【䞀床リポゞトリに入った秘密情報は、履歎から消えない】
  → 挏れたら【必ずロヌテヌションする】履歎の曞き換えより確実★

参考

Microsoft Learn

その他

Microsoft Learn珟圚の方匏


Tags: 移行, .NET開発, セキュリティ, 暗号化

⚠ **GitHub.com Fallback** ⚠