ConnnectionStringをSQL Server認証からWindows認証に変更する方法
ASP.NET Core 3.0 + EF Core 3.0 + IIS + SQL Server 2017の環境でWebアプリケーションを作っているのですが、そこでDB接続に使用しているConnnectionStringのPasswordを暗号化、秘匿化する方法として以下の3つが考えられます。
① Secret ManagerやAzure Key Vaultを使う。
② 暗号化、複合化クラスを作成して、ConnnectionStringを暗号化する。
③ SQL Server認証からWindows認証に変更する。(そもそもConnectionStringにPasswordを書かない)
今回、対応方法として1番手っ取り早い③について検証しました。
ただし、ConnnectionStringをSQL Server認証(saによる認証)から、Windows認証に変更しただけだと、以下のエラーがでる場合があります。
このエラーは、Windows認証の中でもNTLM認証の場合、つまりKerberos認証のように「ダブルホップ」を使用せず、IISのアプリケーションプールに指定したアカウントでDB接続する場合に発生します。
このエラーが出る場合、以下の対応によりエラーが解消され、Windows認証によるDB接続が可能となります。
① IISのアプリケーションプールのIDを既定のビルトインアカウント「ApplicationPoolIdentity」から、ビルトインアカウント「NetworkService」へ変更する。
② SSMS>セキュリティ>ログインから「NT AUTHORITY\NETWORK SERVICE」を追加して、サーバーロール「sysadmin」か、データベースロール「db_owner」を付ける。
もしくは「NetworkService」でなく、任意の管理用ドメインユーザーでも良いです。
① IISのアプリケーションプールのIDを既定のビルトインアカウント「ApplicationPoolIdentity」から、カスタムアカウント「管理用ドメインユーザー」へ変更する。
② SSMS>セキュリティ >ログインから「管理用ドメインユーザー」を追加して、サーバーロール「sysadmin」かデータベースロール「db_owner」を付ける。
これにより以下のようにWindows認証により、Passwordを書かずにConnnectionStringを記述できるようになります。
Data Source=172.31.42.229;Initial Catalog=DB名;User ID=sa;Password=saのパスワード;Connect Timeout=30;Encrypt=False;TrustServerCertificate=True;ApplicationIntent=ReadWrite;MultiSubnetFailover=False
↓
Windows認証
Data Source=172.31.42.229;Initial Catalog=DB名;Integrated Security=True
参考サイト
idmlab.eidentity.jp