Row-Level Security でブロック述語の一般提供開始

このポストは、11 月 30 日に投稿された Row-Level Security Block Predicates are Generally Available の翻訳です。

Azure SQL Database の Row-Level Security (RLS) 機能でブロック述語が正式にサポートされました。ユーザーに表示する行を制限するフィルター述語とは対照的に、ブロック述語では設定されたアクセス条件に違反する行の挿入、更新、削除を禁止します。テーブルの特定行の読み取りと書き込み両方のアクセスを制御するには、フィルター述語とブロック述語を併用することをお勧めします。

たとえば、RLS は一般的にマルチテナント データベースのデータに対して他のテナントによるアクセスを禁止するために使用されます。フィルター述語を使用して各テナントに表示する行を制限します。今後は、この関数をブロック述語として再利用することで、クロステナントの挿入操作や更新操作を禁止できます。

 CREATE SECURITY POLICY Security.tenantAccessPolicy
 ADD FILTER PREDICATE Security.fn_tenantAccessPredicate(TenantId) ON dbo.MyTable,
 ADD BLOCK PREDICATE Security.fn_tenantAccessPredicate(TenantId) ON dbo.MyTable

 

概要デモ

[View:https://sec.ch9.ms/ch9/fd66/02b6abd0-777d-4f31-83fd-248578acfd66/RowLevelSecurityUpdatesInAzureSQLDB_mid.mp4:0:0]

RLS の用途は?

  • マルチテナント データベースを含む SaaS アプリケーションにおいて、テナントどうしを強制的に分離する
  • 部門、地域、セキュリティ レベルなどの条件に基づき、レポート用アプリケーション (Excel や Power BI など) からアナリストごとにデータの異なるサブセットにアクセスできるようにする
  • 行レベル アクセスをデータベースの中心的なロジックにすることで、アプリケーションのコードを簡略化し、人的ミスによるデータ漏えいを防止する

コード サンプル、参考資料

今回、ブロック述語に加えて SESSION_CONTEXT (英語) の提供も開始されました。SESSION_CONTEXT は、セッションを対象とする新しいキー/値ストアで、共有のサービス アカウントを使用してすべてのデータベース接続が行われる中間層アプリケーション (Web Apps など) に RLS を実装する場合に非常に便利です。RLS-Projects-MidTier-Demo.sql (英語) サンプルを参考に、実際にお試しいただけます。

もちろん、RLS では Azure SQL Database のログイン、ユーザー、ロールの組み込みセキュリティ システムや Azure Active Directory グループを使用することもできます。RLS-Hospital-BuiltIn-Demo.sql (英語) サンプルを参考に、実際にお試しいただけます。

Entity Framework を使用したエンドツーエンドのマルチテナント サンプルについては、「チュートリアル: Entity Framework と行レベル セキュリティによるマルチテナント データベースを持つ Web アプリの構築 (英語) 」を参照してください。

技術的な詳細については、MSDN の Row-Level Security に関するドキュメントを参照してください。

ご協力のお願い

いつものお願いではありますが、皆様からのフィードバックをお待ちしています。ご不明な点やご意見、ご提案がありましたら、下記のコメント欄までお寄せください。