Avanade Beef で SQL Database にマネージド ID で接続するときの注意点
はじめに
Avanade Beef (以下、Beef) は ASP.NET Core をベースとする Web API の自動生成ツールです。
概要については以下のスライドもご覧ください。
問題点
SQL Database への接続文字列をうっかりとソース管理で公開してしまい、情報漏洩になる事例がたびたび発生していますが、それを防ぐための手段としてマネージド ID を使用する方法があります。ユーザー名とパスワードではなく Azure リソースに紐づけられた ID (サービス プリンシパル) を使用することで、パスワードレスで SQL Database にアクセスできます。
手順は以下にチュートリアルが公開されています。
接続文字列を変更します。
Server=tcp:<server-name>.database.windows.net;Authentication=Active Directory Default; Database=<database-name>;
App Service でマネージド ID を公開し、マネージド ID にアクセス許可を付与します。
CREATE USER [<identity-name>] FROM EXTERNAL PROVIDER;
ALTER ROLE db_datareader ADD MEMBER [<identity-name>];
ALTER ROLE db_datawriter ADD MEMBER [<identity-name>];
ALTER ROLE db_ddladmin ADD MEMBER [<identity-name>];
GO
しかし、この手順にしたがっても Beef の場合は 500 エラーが発生します。
解決策
これは、Beef は (たとえ構成を Entity Framework で使っていたとしても) いくつかのストアド プロシージャを使用しているためです。通常は Database プロジェクトで dotnet run database したときに自動的に生成されるため、意識することはありませんが、以下のストアド プロシージャが存在します。
上記のチュートリアルではマネージド ID に対して db_datareader、db_datawriter、db_ddladmin のロールを割り当ています。しかし、これらのロールではストアド プロシージャを実行できず、エラーが発生します。これを防ぐには、db_owner のロールを割り当てる、またはカスタム ロールを定義する必要があります。
CREATE ROLE db_executor
GRANT EXECUTE TO db_executor
ALTER ROLE db_executor ADD MEMBER [<identity-name>];
おわりに
実のところ、この事象はマネージド ID でなくとも発生しますが、特にマネージド ID の有効化のチュートリアルにしたがって実施すると発生するため、注意してください。
Discussion