動的データ マスク
適用対象: Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics (専用 SQL プールのみ)
Azure SQL Database、Azure SQL Managed Instance、および Azure Synapse Analytics は、動的データ マスキングをサポートしています。 動的データ マスクは、特権のないユーザーに対してデリケートなデータをマスクし、データの公開を制限します。
動的データ マスクでは、公開するデリケートなデータの量を指定することで、デリケートなデータに対する未承認のアクセスを防ぎ、アプリケーション レイヤーへの影響は最小限に抑えられます。 これはポリシー ベースのセキュリティ機能です。これにより、データベース内のデータはそのままで、指定されたデータベース フィールドに対するクエリの結果セットで機微なデータを非表示にすることができます。
たとえば、コール センターのサービス担当者は、メール アドレスのいくつかの文字を確認することによって発信者を識別できます。ただし、完全なメール アドレスをサービス担当者に開示すべきではありません。 クエリの結果セット内のすべての電子メール アドレスをマスクするマスク ルールを定義できます。 別の例として、開発者は、適切なデータ マスクを定義し、個人データを保護し、法令遵守規定に違反することなくトラブルシューティングの目的で運用環境に対して照会を行うことができます。
動的データ マスキングの基礎
Azure portal で動的データ マスキング ポリシーを設定するには、SQL Database 構成ペインの [セキュリティ] の下にある [動的データ マスキング] ブレードを選択します。 SQL Managed Instance の場合、この機能はポータルを使用して設定できません。 詳細については、「 Dynamic Data Masking」を参照してください。
動的データ マスク ポリシー
- マスクから除外する SQL ユーザー - SQL クエリの結果でデータがマスクされない SQL ユーザーまたは Azure AD の ID のセット。 Server 管理者、Azure AD 管理者、db_owner ロールなどの管理者権限を持つユーザーが、マスクなしで元のデータを表示できます。 (注: SQL Server の sysadmin ロールにも適用されます)
- マスク ルール - マスクされる指定のフィールドと使用されるマスク関数を定義するルールのセット。 データベースのスキーマ名、テーブル名、列名を使用し、指定のフィールドを定義できます。
- マスク関数 - さまざまなシナリオに対応してデータの公開を制御する方法のセット。
マスク関数 | マスク ロジック |
---|---|
[Default] | 指定のフィールドのデータ型に応じたフル マスク • 文字列データ型 (nchar、ntext、nvarchar) のフィールドのサイズが 4 文字未満の場合は、XXXX またはそれ未満の数の X を使用します。 • 数値データ型 (bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real) の場合は、値 0 を使用します。 • 日付/時刻データ型 (date、datetime2、datetime、datetimeoffset、smalldatetime、time) の場合は、01-01-1900 を使用します。 • SQL バリアントの場合は、現在の型の既定値が使用されます。 • XML の場合は、ドキュメント <masked/> が使用されます。 • 特殊なデータ型 (タイムスタンプ テーブル、hierarchyid、GUID、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 Write:
- Microsoft.Sql/servers/databases/dataMaskingPolicies/write
T-SQL コマンドで動的データ マスキングを使用する場合のアクセス許可の詳細については、「アクセス許可」を参照してください
詳細なアクセス許可の例
機密データへの不正アクセスを防止し、データベースのさまざまなレベルで未承認ユーザーに対してマスクすることで制御を得る。 UNMASK 権限の付与または取り消しは、データベースレベル、スキーマレベル、テーブルレベル、または列レベルで、データベース ユーザー、Azure AD ID、Azure AD グループ、またはデータベース ロールに対して実行できます。 UNMASK アクセス許可を使用すると、データベースに格納されているデータへの未承認のアクセスを制御および制御してデータ セキュリティ管理を向上させるための、より詳細な方法が提供されます。
ユーザー テーブルを含むスキーマを作成する
CREATE SCHEMA Data; GO
マスクされた列を含むテーブルを作成する
CREATE TABLE Data.Membership ( MemberID int IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED, 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 PRIMARY KEY CLUSTERED, 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 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;
関連項目
- SQL Server の動的データ マスク。
- Channel 9 の Data Exposed エピソード (Azure SQL 動的データ マスクの粒度の細かいアクセス許可)。