sql >> データベース >  >> RDS >> Sqlserver

上級ユーザー向けのSQLServerでの動的データマスキング

    この記事では、SQL Serverの動的データマスキングの概要と、そのユースケース、ベストプラクティス、および高度なSQLユーザー(開発者やテスターを含む)のセキュリティへの影響について説明します。さらに、この記事の読者は、さまざまなタイプの動的データマスキングの適用に慣れることができます。この記事では、日常のデータベース開発およびテストタスクにおけるデータマスキングの高度な使用の重要性も強調しています。

    前提条件

    まず、この記事の前提条件を確認しましょう。

    T-SQLの知識

    この記事は、読者がT-SQLスクリプトに精通しており、SQLクエリを快適に記述および実行してSQLデータベースを表示および操作できることを前提としています。

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

    この記事は、読者がSQLServerの動的データマスキングの基本概念を知っていることも前提としています。まだ行っていない場合は、初心者が動的データマスキングの基本に慣れるために、SQLServerでのデータマスキングの記事を参照してください。

    AzureSQLデータベースまたはSQLServer2016の互換性

    動的データマスキング機能はSQLServer2016からSQLServer2019で使用できるため、次のいずれかを使用することを強くお勧めします。
    1。 AzureSQLデータベース
    2。 SQLServer2016がローカルまたはリモートにインストールされています。

    サンプルデータベースの設定

    この記事のウォークスルーを実行する場合は、SQL Server 2016と互換性のある次のT-SQLスクリプトを使用するか、AzureSQLデータベースとしてサンプルデータベースを作成することを忘れないでください。

    -- Create sample database ITSalesV2
    CREATE DATABASE ITSalesV2;
    GO
    
    USE [ITSalesV2]
    
    -- (2) Create MonthlySale table
    CREATE TABLE [dbo].[MonthlySale](
    	[SaleId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
    	[SellingDate] [datetime2](7) NULL,
    	[Customer] [varchar](50) NULL,
    	[Email] [varchar] (200) NULL,
    	[Product] [varchar](150) NULL,
    	[TotalPrice] [decimal](10, 2) NULL,
    )
    
    
    -- (2) Populate monthly sale table
    SET IDENTITY_INSERT [dbo].[MonthlySale] ON
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (1, N'2019-05-01 00:00:00', N'Asif', N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (2, N'2019-05-02 00:00:00', N'Mike',N'[email protected]', N'Dell Laptop', CAST(300.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (3, N'2019-05-02 00:00:00', N'Adil',N'[email protected]',N'Lenovo Laptop', CAST(350.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (4, N'2019-05-03 00:00:00', N'Sarah',N'[email protected]', N'HP Laptop', CAST(250.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (5, N'2019-05-05 00:00:00', N'Asif', N'[email protected]', N'Dell Desktop', CAST(200.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (6, N'2019-05-10 00:00:00', N'Sam',N'[email protected]', N'HP Desktop', CAST(300.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (7, N'2019-05-12 00:00:00', N'Mike',N'[email protected]', N'iPad', CAST(250.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (8, N'2019-05-13 00:00:00', N'Mike',N'[email protected]', N'iPad', CAST(250.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (9, N'2019-05-20 00:00:00', N'Peter',N'[email protected]', N'Dell Laptop', CAST(350.00 AS Decimal(10, 2)))
    INSERT INTO [dbo].[MonthlySale] ([SaleId], [SellingDate], [Customer],[Email], [Product], [TotalPrice]) VALUES (10, N'2019-05-25 00:00:00', N'Peter',N'[email protected]', N'Asus Laptop', CAST(400.00 AS Decimal(10, 2)))
    SET IDENTITY_INSERT [dbo].[MonthlySale] OFF

    データの確認

    次のスクリプトを実行して、新しく作成および入力されたサンプルデータベースITSalesV2を確認します。

    -- View monthly sales data
    SELECT
      s.SaleId
     ,s.SellingDate
     ,s.Customer
     ,s.Email
     ,s.Product
     ,s.TotalPrice
    FROM dbo.MonthlySale s

    出力は次のとおりです。

    非特権ユーザーの作成

    この記事の前提条件としてマスクされたデータを表示するMonthlySaleテーブルに対するSELECT権限のみを持つ、ログインせずに非特権ユーザーを作成してください。これを行うには、次のスクリプトを使用します。

    -- Create DataUser to have Select access to MonthlySale table
    CREATE USER DataUser WITHOUT LOGIN;  
    GRANT SELECT ON MonthlySale TO DataUser;

    マスキングステータスを確認する手順の作成

    この記事では、サンプルデータベースにストアドプロシージャがあり、データベーステーブルの列の動的データマスキングステータスを示していることも前提としています。

    -- Stored procedure to check dynamic data masking status
    CREATE PROC ShowMaskingStatus
    AS
    BEGIN
    SET NOCOUNT ON 
    SELECT c.name, tbl.name as table_name, c.is_masked, c.masking_function  
    FROM sys.masked_columns AS c  
    JOIN sys.tables AS tbl   
        ON c.[object_id] = tbl.[object_id]  
    WHERE is_masked = 1;
    END

    動的データマスキングタイプ

    SQLServerの動的データマスキングには次の4つの一般的なタイプがあります。
    1。デフォルトのデータマスク
    2。部分データマスク
    3。ランダムデータマスク
    4。カスタム文字列データマスク
    次に、4つの一般的なタイプの動的データマスキングすべてを実装します。

    デフォルトのデータマスキングの実装

    デフォルトのデータマスキングは、すべての列の値を特殊文字で覆うことにより、許可されていないユーザーから列を完全に隠し、列の内容を推測することを非常に困難にします。

    ビジネス要件

    ここで、この情報の機密性のために顧客の電子メールアドレスを完全に非表示(マスク)にする必要があるというビジネス要件を受け取ったとします。
    このビジネス要件を満たす最善の方法は、[電子メール]列をマスクすることです。動的データマスキング(DDM)を使用します。

    電子メールアドレスのデフォルトのデータマスキング

    次のように、電子メールアドレスをマスクするようにテーブルを変更します。

    --Default dynamic data masking of Email column 
    ALTER TABLE MonthlySale
    ALTER COLUMN Email varchar(200) MASKED WITH (FUNCTION = 'default()');

    マスキングステータスの確認

    Microsoftのドキュメントで参照されているT-SQLスクリプトに基づく次のストアドプロシージャを使用して、動的データのマスキングステータスを確認します。

    -- Checking dynamic data masking status
    EXEC ShowMaskingStatus

    出力には、どの列が正常にマスクされたかが表示されます:

    電子メール列をDataUserとして表示する

    次に、Selectステートメントを実行して、月間売上高(テーブル)を、次のようにテーブルに対する選択権限のみを持つDataUserという低特権ユーザーとして表示します。

    -- Execute SELECT as DataUser
    EXECUTE AS USER = 'DataUser';  
    
    -- View monthly sales 
    SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s
    
    -- Revert the User back to what user it was before
    REVERT;
    >

    出力は次のとおりです。

    部分的なデータマスキングの実装

    名前が示すように、部分的なデータマスキングは、許可されていないユーザーが列の値の一部を特殊文字で覆って列を表示できないようにするため、列の内容をある程度読みやすくしますが、推測するのは困難です。

    ビジネス要件

    ここで、名前の最初の文字だけが表示されるように、顧客の名前を部分的に非表示にするように求められたビジネス要件について考えてみます。このビジネス要件を満たす最善の方法は、部分動的データマスキングを使用して顧客列をマスクすることです。

    顧客名の部分的なデータマスキング

    次のように、顧客列を部分的にマスクするようにテーブルを変更します。

    -- Partial data masking of Customer names
    ALTER TABLE MonthlySale
    ALTER COLUMN [Customer] ADD MASKED WITH (FUNCTION = 'partial(1,"XXXXXXX",0)')

    マスキングステータスの確認

    動的データマスキングステータスを確認します:

    -- Checking dynamic data masking status
    EXEC ShowMaskingStatus

    出力には、どの列が正常にマスクされたかが表示されます:

    顧客列をDataUserとして表示する

    マスクされたデータを表示する必要があるテストユーザーDataUserとしてテーブルを表示します:

    -- Execute SELECT as DataUser
    EXECUTE AS USER = 'DataUser';  
    
    -- View monthly sales as DataUser
    SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.Product from dbo.MonthlySale s
    
    -- Revert the User back to what user it was before
    REVERT;

    出力は次のとおりです。

    ランダムデータマスキングの実装

    ランダムデータマスキングは、値の範囲に基づいて列をカバーすることにより、許可されていないユーザーから列をランダムに隠し、列の内容を推測することを非常に困難にします。ランダムデータマスキングタイプは、数値のみを格納する列にのみ適用可能であり、ランダム化の範囲を指定することで指定できることに注意してください。

    ビジネス要件

    プライバシー上の理由から、特権の低いユーザーが製品の正確な価格を知らないように、製品の価格をランダムな範囲の数字でマスクする必要があるというビジネス要件を受け取ります。このビジネス仕様を満たすための最良の方法は、ランダムな動的データマスキングを使用してTotalPrice列をマスクすることです。

    TotalPrice列のランダムデータマスキング

    次のように、テーブルMonthlySaleを変更して、TotalPriceをランダムにマスクします。

    --Random dynamic data masking of TotalPrice column 
    ALTER TABLE MonthlySale
    ALTER COLUMN [TotalPrice] decimal(10,2) MASKED WITH (FUNCTION = 'random(1, 12)')

    マスキングステータスの確認

    次のストアドプロシージャを実行して、動的データのマスキングステータスを確認してください。

    -- Checking dynamic data masking status
    EXEC ShowMaskingStatus

    出力には、どの列が正常にマスクされたかが表示されます。

    TotalPrice列をDataUserとして表示する

    今すぐテーブルをDataUserとして表示します:

    -- Execute SELECT as DataUser
    EXECUTE AS USER = 'DataUser';  
    
    -- View monthly sales 
    SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s
    
    -- Revert the User back to what user it was before
    REVERT;
    >

    出力は次のとおりです。

    乱数が生成されるため、RandomDataMasked列の出力が異なる場合があることに注意してください。

    カスタム文字列データマスキングの実装

    その名前が示すように、カスタム文字列データマスキングは、その内容を推測することを非常に困難にすることによって列を非表示にするカスタム文字を追加します。カスタム文字列データマスキングは、実際の列値をマスクするように文字をカスタマイズすることにより、部分データマスキングと組み合わせて使用​​されることに注意してください。つまり、カスタム文字列データマスキングは、部分データマスキングの拡張形式です。

    ビジネス要件

    製品列の最初と最後の文字のみを表示し、残りの文字はハイフン(-)で非表示またはマスクする必要があるというビジネス要件を検討してください。このビジネス仕様を満たすための最良の方法は、必要なカスタム文字列を使用した部分動的データマスキングを使用してProduct列をマスキングすることです。

    販売データの顧客文字列データマスキング

    次のように、テーブルMonthlySaleを変更して、Product列をマスクします。

    --Custom string dynamic data masking of Product column 
    ALTER TABLE MonthlySale
    ALTER COLUMN [Product] ADD MASKED WITH (FUNCTION = 'partial(1,"---",1)')

    マスキングステータスの確認

    次のスクリプトを使用して、この時点で動的データマスキングステータスを確認する価値があります。

    -- Checking dynamic data masking status
    EXEC ShowMaskingStatus

    出力には、以下に示すように、動的データマスキングが正常に適用されたすべての列が表示されます。

    製品列をDataUserとして表示する

    今すぐテーブルをDataUserとして表示します:

    -- Execute SELECT as DataUser
    EXECUTE AS USER = 'DataUser';  
    
    -- View monthly sales 
    SELECT s.SaleId,s.SellingDate,s.Customer,s.Email,s.Product,s.TotalPrice from dbo.MonthlySale s
    
    -- Revert the User back to what user it was before
    REVERT;
    >

    出力は次のとおりです。

    おめでとう!これで、4つのマスキング手法がすべて正常に実装されました。
    初心者が適用されたデータマスキングタイプを削除するには、SQLServerでのデータマスキングの記事を参照してください。

    ベストプラクティス

    次の点に注意してください。
    1。動的データマスキングは列データを保護または暗号化しないため、その目的で使用しないでください。
    2。マスクされたデータを表示することになっている潜在的なユーザーは、データを表示するためのアクセスが非常に制限されている必要があり、データを悪用するための更新権限をまったく与えられてはなりません。
    3。 SELECTのみの権限を持つ潜在的なユーザーは、徹底的なクエリを実行して正しい値を推測できるため、注意してください。
    4。デフォルトの動的マスキングを使用する代わりに、ALTER COLUMN Email ADD MASKED WITH(FUNCTION =’email()’)を使用して電子メール列をマスクすることもできます。
    5。カスタム文字列データマスキングを使用すると、買い物の領収書に見られるように、最後の2桁または4桁のみを表示することで、トランザクションレポートのデビットカード番号を非表示にできます。

    やるべきこと

    4種類のマスキングをすべて実装できるようになったので、スキルをさらに向上させるために次のことを試してください。
    1。記事「SSRSレポートの簡単な用語での開発」のウォークスルーに従ってサンプルデータベースを作成してから、部分的なデータマスキングを使用して残りの文字を非表示にして作成者名の最初の文字のみを表示するSSRSレポートを作成してください。
    2。記事「スキーマスナップショットによる複数バージョンのデータベースの作成と展開」で参照されているサンプルデータベースを作成してから、Studentというテストユーザーを作成し、適切な動的データマスキングを適用して、このテストユーザーのすべての学生のマークを非表示にしてください。
    3。 SQLテーブルで動的データマスキングを正常に追加および削除できるように、動的データマスキングを作成および削除してみてください。


    1. 科学的記数法なしでSQLServerでfloatをvarcharに変換する

    2. 数値のある列のタイプをvarcharからintに変更します

    3. DigitalOceanにPostgreSQLをデプロイする方法

    4. Oracle APEXのレポートの各行に編集ボタンを追加するにはどうすればよいですか?