動的データ マスク
適用対象: Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics (専用 SQL プールのみ) Microsoft Fabric SQL Database
Azure SQL Database、Microsoft Fabric SQL Database、Azure SQL Managed Instance、Azure Synapse Analytics では、動的データ マスク (DDM) がサポートされます。 動的データ マスキングでは、特権のないユーザーに対して機密データをマスキングすることでデータの公開を制限します。
動的データ マスキングでは、お客様が機密データをどの程度公開するかを、アプリケーション レイヤーへの影響を最小限に抑えながら指定できるようにすることで、機密データに対する未承認のアクセスを防止するのに役立ちます。 これはポリシー ベースのセキュリティ機能です。これにより、データベース内のデータはそのままで、指定したデータベース フィールドに対するクエリの結果セットで機密データを非表示にすることができます。
たとえば、コール センターのサービス担当者は、メール アドレスのいくつかの文字を確認することによって発信者を識別できます。ただし、完全なメール アドレスをサービス担当者に開示すべきではありません。 クエリの結果セット内のすべての電子メール アドレスをマスクするマスク ルールを定義できます。 別の例として、開発者は、適切なデータ マスクを定義し、個人データを保護し、法令遵守規定に違反することなくトラブルシューティングの目的で運用環境に対して照会を行うことができます。
動的データ マスキングの基礎
Azure SQL Database の場合、Azure portal で動的データ マスク ポリシーを設定するには、SQL Database 構成ペインの [セキュリティ] の下にある [動的データ マスク] ペインを選択します。
この機能は、SQL Managed Instance または Fabric SQL Database の Azure portal を使用して設定することはできません。 代わりに、この記事の「動的データ マスクの例」 のように、T-SQL を使用します。 詳細については、「 Dynamic Data Masking」を参照してください。
動的データ マスク ポリシー
- マスキングから除外する SQL ユーザー: Microsoft Entra ID (旧称 Azure Active Directory) の ID を含めることができる一連の SQL ユーザー。SQL クエリ結果ではマスクされていないデータを受け取ります。 サーバー管理者、Entra 管理者、db_owner ロールなどの管理者権限を持つユーザーは、マスクなしで元のデータを表示できます。 (注: SQL Server の sysadmin ロールにも適用されます)
- マスキング ルール: マスキングされる指定のフィールドと使用されるマスキング関数を定義するルールのセット。 データベースのスキーマ名、テーブル名、列名を使用し、指定のフィールドを定義できます。
- マスキング関数: さまざまなシナリオに対応してデータの公開を制御する方法のセット。
マスク関数 | マスキング ロジック |
---|---|
[Default] | 指定のフィールドのデータ型に応じたフル マスク * 文字列データ型 (nchar、ntext、nvarchar) についてフィールドのサイズが 4 文字未満の場合は、 XXXX (またはそれ未満) を使います。* 数値データ型 (bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real) の場合は、値 0 を使います。 * 日付/時刻データ型 (date、datetime2、datetime、datetimeoffset、smalldatetime、time) の場合は、 1900-01-01 を使います。* sql_variant の場合は、現在の型の既定値が使われます。 * XML の場合は、ドキュメント <masked /> が使われます。* 特殊なデータ型 (timestamp、table、HierarchyID、uniqueidentifier、binary、image、varbinary、空間型) の場合は、空の値を使います。 |
クレジット カード | クレジット カードの形式でプレフィックスとして定数文字列を追加し、指定のフィールドの末尾 4 桁を公開するマスク方法。XXXX-XXXX-XXXX-1234 |
電子メール アドレスの形式でプレフィックスとして定数文字列を使用して、最初の文字を公開し、ドメインを XXX.com に置き換えるマスク方法。aXX@XXXX.com |
|
ランダムな数値 | 選択した境界と実際のデータ型に応じて乱数を生成するマスク方法。 指定された境界が等しい場合、マスク関数は定数になります。 |
カスタム テキスト | 間にカスタム埋め込み文字列を追加し、最初と最後の文字を公開するマスク方法。 元の文字列が公開されたプレフィックスやサフィックスより短い場合、埋め込み文字列のみが使用されます。prefix[padding]suffix |
マスクが推奨されるフィールド
DDM の推奨エンジンでは、データベースの特定のフィールドに「機密データの可能性あり」の注意が付けられます。この注意を参考にマスク候補を選択できます。 ポータルの [動的データ マスキング] ペインには、データベースの推奨列が表示されます。 1 つまたは複数の列に対して [マスクの追加] を選択し、適切なマスキング関数を選択して、[保存] を選択すると、それらのフィールドにマスクが適用されます。
T-SQL を使用して動的データ マスキングを管理する
- 動的データ マスクを作成するには、「動的データ マスクを作成する」を参照してください。
- 既存の列にマスクを追加するか、マスクを編集するには、「既存の列のマスクを追加または編集する」を参照してください。
- マスクされていないデータを表示するアクセス許可を付与するには、「アクセス許可を付与して、マスクが解除されたデータを表示する」を参照してください。
- 動的データ マスクをドロップするには、「動的データ マスクをドロップする」を参照してください。
PowerShell コマンドレットを使用して、ご使用のデータベースの動的データ マスクを設定する
データ マスキングのポリシー
データ マスキングのルール
- Get-AzSqlDatabaseDataMaskingRule
- New-AzSqlDatabaseDataMaskingRule
- Remove-AzSqlDatabaseDataMaskingRule
- Set-AzSqlDatabaseDataMaskingRule
REST API を使用してデータベース用の動的データ マスクを設定する
REST API を使用して、データ マスク ポリシーおよびルールをプログラムで管理できます。 公開された REST API では、次の操作がサポートされます。
データ マスキングのポリシー
データ マスキングのルール
- 作成または更新:データベース データ マスク ルールを作成または更新します。
- データベース別の一覧表示:データベース データ マスク ルールの一覧を取得します。
アクセス許可
動的データ マスキングを構成する組み込みロールは以下のとおりです。
動的データ マスキングを使用するために必要なアクションは以下のとおりです。
読み取り/書き込み:
Microsoft.Sql/servers/databases/dataMaskingPolicies/*
Read:
Microsoft.Sql/servers/databases/dataMaskingPolicies/read
書き込み:
Microsoft.Sql/servers/databases/dataMaskingPolicies/write
T-SQL コマンドで動的データ マスキングを使用する場合のアクセス許可の詳細については、「アクセス許可」を参照してください
詳細なアクセス許可の例
機密データへの不正アクセスを防止し、データベースのさまざまなレベルで未承認ユーザーに対してマスクすることで制御を得る。 UNMASK 権限の付与または取り消しは、データベースレベル、スキーマレベル、テーブルレベル、または列レベルで、任意のデータベース ユーザーまたはデータベース ロールに対して実行できます。 Microsoft Entra 認証と組み合わせることで、ユーザー、グループ、アプリケーションメイン Azure 環境内に含まれる UNMASK アクセス許可を管理できます。 UNMASK アクセス許可を使用すると、データベースに格納されているデータへの未承認のアクセスを制御および制御してデータ セキュリティ管理を向上させるための、詳細な方法が提供されます。
ユーザー テーブルを含むスキーマを作成します。
CREATE SCHEMA Data; GO
マスキングされた列を含むテーブルを作成します。
CREATE TABLE Data.Membership ( MemberID INT IDENTITY(1, 1) NOT NULL, FirstName VARCHAR(100) MASKED WITH (FUNCTION = 'partial(1, "xxxxx", 1)') NULL, LastName VARCHAR(100) NOT NULL, Phone VARCHAR(12) MASKED WITH (FUNCTION = 'default()') NULL, Email VARCHAR(100) MASKED WITH (FUNCTION = 'email()') NOT NULL, DiscountCode SMALLINT MASKED WITH (FUNCTION = 'random(1, 100)') NULL, BirthDay DATETIME MASKED WITH (FUNCTION = 'default()') NULL );
サンプル データを挿入します。
INSERT INTO Data.Membership (FirstName, LastName, Phone, Email, DiscountCode, BirthDay) VALUES ('Roberto', 'Tamburello', '555.123.4567', 'RTamburello@contoso.com', 10, '1985-01-25 03:25:05'), ('Janice', 'Galvin', '555.123.4568', 'JGalvin@contoso.com.co', 5, '1990-05-14 11:30:00'), ('Shakti', 'Menon', '555.123.4570', 'SMenon@contoso.net', 50, '2004-02-29 14:20:10'), ('Zheng', 'Mu', '555.123.4569', 'ZMu@contoso.net', 40, '1990-03-01 06:00:00');
サービス テーブルを含むスキーマを作成します。
CREATE SCHEMA Service; GO
マスキングされた列を含むサービス テーブルを作成します。
CREATE TABLE Service.Feedback ( MemberID INT IDENTITY(1, 1) NOT NULL, Feedback VARCHAR(100) MASKED WITH (FUNCTION = 'default()') NULL, Rating INT MASKED WITH (FUNCTION = 'default()'), Received_On DATETIME );
サンプル データを挿入します。
INSERT INTO Service.Feedback (Feedback, Rating, Received_On) VALUES ('Good', 4, '2022-01-25 11:25:05'), ('Excellent', 5, '2021-12-22 08:10:07'), ('Average', 3, '2021-09-15 09:00:00');
データベースに別のユーザーを作成します。
CREATE USER ServiceAttendant WITHOUT LOGIN; GO CREATE USER ServiceLead WITHOUT LOGIN; GO CREATE USER ServiceManager WITHOUT LOGIN; GO CREATE USER ServiceHead WITHOUT LOGIN; GO
データベース内のユーザーに読み取りアクセス許可を付与します。
ALTER ROLE db_datareader ADD MEMBER ServiceAttendant; ALTER ROLE db_datareader ADD MEMBER ServiceLead; ALTER ROLE db_datareader ADD MEMBER ServiceManager; ALTER ROLE db_datareader ADD MEMBER ServiceHead;
ユーザーに異なる UNMASK アクセス許可を付与します。
--Grant column level UNMASK permission to ServiceAttendant GRANT UNMASK ON Data.Membership(FirstName) TO ServiceAttendant; -- Grant table level UNMASK permission to ServiceLead GRANT UNMASK ON Data.Membership TO ServiceLead; -- Grant schema level UNMASK permission to ServiceManager GRANT UNMASK ON SCHEMA::Data TO ServiceManager; GRANT UNMASK ON SCHEMA::Service TO ServiceManager; --Grant database level UNMASK permission to ServiceHead; GRANT UNMASK TO ServiceHead;
ユーザー
ServiceAttendant
のコンテキストでデータのクエリを実行します。EXECUTE AS USER = 'ServiceAttendant'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
ユーザー
ServiceLead
のコンテキストでデータのクエリを実行します。EXECUTE AS USER = 'ServiceLead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
ユーザー
ServiceManager
のコンテキストでデータのクエリを実行します。EXECUTE AS USER = 'ServiceManager'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
ユーザー
ServiceHead
のコンテキストでデータのクエリを実行するEXECUTE AS USER = 'ServiceHead'; SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay FROM Data.Membership; SELECT MemberID, Feedback, Rating FROM Service.Feedback; REVERT;
UNMASK アクセス許可を取り消すには、次の T-SQL ステートメントを使用します。
REVOKE UNMASK ON Data.Membership(FirstName) FROM ServiceAttendant; REVOKE UNMASK ON Data.Membership FROM ServiceLead; REVOKE UNMASK ON SCHEMA::Data FROM ServiceManager; REVOKE UNMASK ON SCHEMA::Service FROM ServiceManager; REVOKE UNMASK FROM ServiceHead;