動的マスクを計画して実装する

完了

Azure SQL Database、Azure SQL Managed Instance、および Azure Synapse Analytics は、動的データ マスキングをサポートしています。 動的データ マスキングでは、特権のないユーザーに対して機密データをマスキングすることでデータの公開を制限します。

動的データ マスキングでは、お客様が機密データをどの程度公開するかを、アプリケーション レイヤーへの影響を最小限に抑えながら指定できるようにすることで、機密データに対する未承認のアクセスを防止するのに役立ちます。 これはポリシー ベースのセキュリティ機能です。これにより、データベース内のデータはそのままで、指定したデータベース フィールドに対するクエリの結果セットで機密データを非表示にすることができます。

たとえば、コール センターのサービス担当者は、メール アドレスのいくつかの文字を確認することによって発信者を識別できます。ただし、完全なメール アドレスをサービス担当者に開示すべきではありません。 クエリの結果セット内のすべての電子メール アドレスをマスクするマスク ルールを定義できます。 別の例として、開発者は、適切なデータ マスクを定義し、個人データを保護し、法令遵守規定に違反することなくトラブルシューティングの目的で運用環境に対して照会を行うことができます。

動的データ マスキングの基礎

Azure portal で動的データ マスキング ポリシーを設定するには、SQL Database 構成ペインの [セキュリティ] の下にある [動的データ マスキング] ブレードを選択します。

動的データ マスク ポリシー

  • マスクから除外される SQL ユーザー - SQL クエリの結果でマスクされていないデータを受け取る SQL ユーザーまたは Microsoft Entra ID の ID のセット。 管理者特権を持つユーザーは常にマスクから除外され、マスクのない元のデータを表示することができます。
  • マスク ルール - マスクされる指定のフィールドと使用されるマスク関数を定義するルールのセット。 データベースのスキーマ名、テーブル名、列名を使用し、指定のフィールドを定義できます。
  • マスク関数 - さまざまなシナリオに対応してデータの公開を制御する方法のセット。
関数 説明 使用例
既定値 指定のフィールドのデータ型に応じたフル マスク。

文字列データ型 (char、nchar、varchar、nvarchar、text、ntext) のフィールドのサイズが 4 文字未満の場合は、XXXX またはそれ未満の数の X を使用します。

数値データ型 (bigint、 bit、 decimal、 int、 money、 numeric、 smallint、 smallmoney、 tinyint、 float、 real) の場合は値 0 を使用します。

日付/時刻のデータ型 (date、datetime2、datetime、datetimeoffset、smalldatetime、time) の場合は、1900-01-01 00:00:00.0000000 を使用します。

バイナリ データ型 (binary、 varbinary、 image) の場合は、ASCII 値 0 のシングル バイトを使用します。
列定義の構文例:Phone# varchar(12) MASKED WITH (FUNCTION = 'default()') NULL

ALTER 構文例:ALTER COLUMN Gender ADD MASKED WITH (FUNCTION = 'default()')
メール メール アドレスの最初の 1 文字と定数サフィックスの ".com" をメール アドレスのフォームで公開するマスク方法。 aXXX@XXXX.com。 定義の構文例:Email varchar(100) MASKED WITH (FUNCTION = 'email()') NULL

ALTER 構文例:ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()')
Random ランダム マスク関数は任意の数字型に使用でき、指定した範囲内で生成したランダムな値でオリジナルの値をマスクします。 定義の構文例:Account_Number bigint MASKED WITH (FUNCTION = 'random([start range], [end range])')

ALTER 構文例:ALTER COLUMN [Month] ADD MASKED WITH (FUNCTION = 'random(1, 12)')
カスタム文字列 間にカスタム埋め込み文字列を追加し、最初と最後の文字を公開するマスク方法。 prefix,[padding],suffix

元の文字列が全体をマスクするには短すぎる場合、プレフィックスまたはサフィックスの一部は公開されません。
定義の構文例:FirstName varchar(100) MASKED WITH (FUNCTION = 'partial(prefix,[padding],suffix)') NULL

ALTER 構文例:ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

これにより、555.123.1234 などの電話番号が 5XXXXXXX に変わります。

その他の例:

ALTER COLUMN [Phone Number] ADD MASKED WITH (FUNCTION = 'partial(5,"XXXXXXX",0)')

これにより、555.123.1234 などの電話番号が 555.1XXXXXXX に変わります。
日時 適用対象: SQL Server 2022 (16.x)

データ型 datetime、datetime2、date、time、datetimeoffset、smalldatetime で定義された列のマスク方法。 これは、year=> datetime("Y")、month=> datetime("M") 、day=>datetime("D")、hour=>datetime("h")、minute=>datetime("m")、または seconds=>datetime("s") 部分をマスキングするのに役立ちます。
datetime の値の年をマスクする方法の例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")')

datetime の値の月をマスクする方法の例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')

datetime の値の分をマスクする方法の例:

ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")')
マスキング関数 マスキング ロジック
既定値 指定のフィールドのデータ型に応じたフル マスク

*•文字列データ型 (nchar、ntext、nvarchar) のフィールドのサイズが 4 文字未満の場合は、XXXX またはそれ未満の数の X を使用します。
* 数値データ型 (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 コマンドレットを使用して、ご使用のデータベースの動的データ マスクを設定する

データ マスキングのポリシー

データ マスキングのルール

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 アクセス許可を使用すると、データベースに格納されているデータへの未承認のアクセスを制御および制御してデータ セキュリティ管理を向上させるための、詳細な方法が提供されます。

  1. ユーザー テーブルを含むスキーマを作成します。

    CREATE SCHEMA Data;
    GO
    
  2. マスキングされた列を含むテーブルを作成します。

    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
    );
    
  3. サンプル データを挿入します。

    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');
    
  4. サービス テーブルを含むスキーマを作成します。

    CREATE SCHEMA Service;
    GO
    
  5. マスキングされた列を含むサービス テーブルを作成します。

    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
    );
    
  6. サンプル データを挿入します。

    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');
    
  7. データベースに別のユーザーを作成します。

    CREATE USER ServiceAttendant WITHOUT LOGIN;
    GO
    CREATE USER ServiceLead WITHOUT LOGIN;
    GO
    CREATE USER ServiceManager WITHOUT LOGIN;
    GO
    CREATE USER ServiceHead WITHOUT LOGIN;
    GO
    
  8. データベース内のユーザーに読み取りアクセス許可を付与します。

    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;
    
  9. ユーザーに異なる 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;
    
  10. ユーザー ServiceAttendant のコンテキストでデータのクエリを実行します。

    EXECUTE AS USER = 'ServiceAttendant';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
  11. ユーザー ServiceLead のコンテキストでデータのクエリを実行します。

    EXECUTE AS USER = 'ServiceLead';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT; 
    
  12. ユーザー ServiceManager のコンテキストでデータのクエリを実行します。

    EXECUTE AS USER = 'ServiceManager';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
  13. ユーザー ServiceHead のコンテキストでデータのクエリを実行します。

    EXECUTE AS USER = 'ServiceHead';
    SELECT MemberID, FirstName, LastName, Phone, Email, BirthDay
    FROM Data.Membership;
    SELECT MemberID, Feedback, Rating
    FROM Service.Feedback;
    REVERT;
    
    
  14. 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;