Azure Synapse Analytics dedicated SQL pools における動的データマスキング

Azure Synapse Analyticsは専用SQLプールで動的データマスキング(DDM)をサポートしています。 動的データ マスキングでは、特権のないユーザーに対して機密データをマスキングすることでデータの公開を制限します。

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

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

Note

動的データマスキングはAzure Synapse専用SQLプールでサポートされていますが、Apache SparkプールやサーバーレスSQLプールではサポートされていません。

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

Azureポータルの設定ペインのセキュリティ欄から動的データマスキングを選択し、動的データマスキング ポリシーを設定します。 また、この記事の グラニュラー権限の例 のように、Transact-SQL(T-SQL)を使うこともできます。 詳細については、「 動的データ マスク」を参照してください。

動的データマスク方針

  • マスクから除外された SQL ユーザー: SQL クエリ結果でマスクされていないデータを取得する、Microsoft Entra ID からの ID を含めることができる一連の SQL ユーザー。 サーバー管理者、Entra 管理者、db_owner ロールなどの管理者権限を持つユーザーは、マスクなしで元のデータを表示できます。 (注: SQL Server の sysadmin ロールにも適用されます)

  • マスキング ルール: マスキングされる指定のフィールドと使用されるマスキング関数を定義するルールのセット。 データベースのスキーマ名、テーブル名、列名を使用し、指定のフィールドを定義できます。

  • マスキング関数: さまざまなシナリオに対応してデータの公開を制御する方法のセット。

    マスク関数 マスキング ロジック
    デフォルト 指定のフィールドのデータ型に応じたフル マスク

    文字列データ型(nchar、XXXX)でフィールドのサイズが4文字未満の場合は、(またはそれ以下)を使用してください。
    数値データ型 (bigint、bit、decimal、int、money、numeric、smallint、smallmoney、tinyint、float、real) には 0 の値を使用します。
    * を日付/時間データ型(date、datetime2、datetime、datetimeoffset、1900-01-01、time)に使用してください。
    クレジット カード クレジット カードの形式でプレフィックスとして定数文字列を追加し、指定のフィールドの末尾 4 桁を公開するマスク方法。

    XXXX-XXXX-XXXX-1234
    電子メール 電子メール アドレスの形式でプレフィックスとして定数文字列を使用して、最初の文字を公開し、ドメインを XXX.com に置き換えるマスク方法。

    aXX@XXXX.com
    ランダムな数値 選択した境界と実際のデータ型に応じて乱数を生成するマスク方法。 指定された境界が等しい場合、マスク関数は定数になります。
    カスタム テキスト 間にカスタム埋め込み文字列を追加し、最初と最後の文字を公開するマスク方法。 元の文字列が公開されたプレフィックスやサフィックスより短い場合、埋め込み文字列のみが使用されます。

    prefix[padding]suffix
    Datetime 日付/時刻列、つまり datetime、datetime2、日付、時刻、datetimeoffset、および smalldatetime の詳細なマスクを有効にします。 年 (datetime("Y"))、月 (datetime("M"))、日 (datetime("D"))、時間 (datetime("h"))、分 (datetime("m"))、秒 (datetime("s")) などの特定のコンポーネントをマスクできます。 この関数は T-SQL を使用して適用します。

    例えば次が挙げられます。

    - マスク年度: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("Y")')。
    マスク処理の月: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("M")')。
    - マスク分: ALTER COLUMN BirthDay ADD MASKED WITH (FUNCTION = 'datetime("m")')。

DDM の推奨エンジンでは、データベースの特定のフィールドに「機密データの可能性あり」の注意が付けられます。この注意を参考にマスク候補を選択できます。 ポータルの [動的データ マスキング] ペインには、データベースの推奨列が表示されます。 1 つまたは複数の列に対して [マスクの追加] を選択し、適切なマスキング関数を選択して、[保存] を選択すると、それらのフィールドにマスクが適用されます。

T-SQL を使用して動的データ マスキングを管理する

PowerShell コマンドレットを使用して、ご使用のデータベースの動的データ マスクを設定する

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

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

REST API を使用してデータベース用の動的データ マスクを設定する

REST API を使用して、データ マスク ポリシーおよびルールをプログラムで管理できます。 公開された REST API では、次の操作がサポートされます。

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

  • 作成または更新:データベース データ マスク ポリシーを作成または更新します。
  • 取得:データベース データ マスク ポリシーを取得します。

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

Permissions

T-SQLコマンドで動的データマスキングを使用する場合の権限について詳しくは、 Permissionsをご覧ください。

詳細なアクセス許可の例

機密データへの不正アクセスを防止し、データベースのさまざまなレベルで未承認ユーザーに対してマスクすることで制御を得る。 UNMASK権限は、データベース レベル、スキーマ レベル、テーブル レベル、または列レベルで、任意のデータベース ユーザーまたはロールに対して許可または取り消すことができます。 Microsoft Entra 認証と組み合わせることで、 UNMASK アクセス許可は、Azure 環境内で維持されるユーザー、グループ、アプリケーションに対して管理できます。 UNMASKアクセス許可は、データベースに格納されているデータへの未承認のアクセスを制御および制限し、データ セキュリティ管理を向上させる細かい方法を提供します。

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

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

    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
    );
    
  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,
        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 アクセス許可を付与します。

    • UNMASKに列レベルのServiceAttendantアクセス許可を付与します。

      GRANT UNMASK ON Data.Membership (FirstName) TO ServiceAttendant;
      
    • UNMASKにテーブルレベルのアクセス許可をServiceLeadに付与します。

      GRANT UNMASK ON Data.Membership TO ServiceLead;
      
    • UNMASKに対するスキーマ レベルでのServiceManager権限を付与します。

      GRANT UNMASK ON SCHEMA::Data TO ServiceManager;
      GRANT UNMASK ON SCHEMA::Service TO ServiceManager;
      
    • UNMASKに対するデータベース レベルのアクセス許可を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;