NEWSニュース&ブログ

【SQL Server】動的データマスクで顧客情報を安全に保護する方法

投稿日:2024/06/20

はじめに

 顧客情報や電話番号などの機密性の高い情報をデータ分析基盤に連携する必要があるお客様も少なくありません。

 SQL Server、Azure SQL Database、Synapse Analyticsでは、動的データマスク機能を利用することで、データの機密性を保護することができます。

 この機能により、特定のユーザーに対してデータの一部をマスク(隠す)することが可能です。
 以下は、動的データマスクのイメージ図となりますが、実際に検証した結果も交えて説明致します。

検証

 まずはテスト用テーブルの作成と、データを投入します。

-- テスト用テーブルの作成
CREATE TABLE Customers (
    CustomerID INT IDENTITY(1,1) PRIMARY KEY,
    FirstName NVARCHAR(50),
    LastName NVARCHAR(50),
    Email NVARCHAR(100),
    PhoneNumber NVARCHAR(15),
    CreditCardNumber NVARCHAR(16)
);
GO
-- テストデータの挿入
INSERT INTO Customers (FirstName, LastName, Email, PhoneNumber, CreditCardNumber)
VALUES 
('Tomofumi', 'Nakagawa', 'tomofumi-nakagawa@example.com', '123-456-7890', '1234567812345678'),
('Taro', 'Tanaka', 'taro-tanaka@example.com', '987-654-3210', '8765432187654321');
GO

 次は実際に作成済みのテーブルに対して各データマスクを適用させます。

-- Email列にメールアドレスマスクを適用
ALTER TABLE Customers
ALTER COLUMN Email ADD MASKED WITH (FUNCTION = 'email()');
GO

 email() 関数を使用してメールアドレス形式のマスクを設定します。

 このマスクは、メールアドレスの一部を隠すために使用され、例えば tomofumi-nakagawa@example.com が tXXX.XXX@example.com のように表示されます。

-- PhoneNumber列にデフォルトマスクを適用
ALTER TABLE Customers
ALTER COLUMN PhoneNumber ADD MASKED WITH (FUNCTION = 'default()');
GO

 default() 関数を使用して、データ型に応じた適切なマスクが自動的に適用されます。

 例えば、電話番号 123-456-7890 が XXXXXXX のように表示されます。

-- CreditCardNumber列にカスタム文字列マスクを適用
ALTER TABLE Customers
ALTER COLUMN CreditCardNumber ADD MASKED WITH (FUNCTION = 'partial(0,"XXXX-XXXX-XXXX-",4)');
GO

 partial(0,”XXXX-XXXX-XXXX-“,4) 関数を使用して、クレジットカード番号の一部を隠します。

 この場合、最初の0文字と最後の4文字を表示し、それ以外の部分を XXXX-XXXX-XXXX- でマスクします。

 例えば、クレジットカード番号 1234567812345678 が XXXX-XXXX-XXXX-5678 のように表示されます。


 次に2つのユーザーを作成します。

 MaskedUserはマスクされたデータを確認するためのユーザーです。

 UnmaskedUserはUNMASK権限を付与し、マスクを回避を確認するためのユーザーです。

-- マスクされたデータを確認するためのユーザーの作成
CREATE USER MaskedUser WITHOUT LOGIN;
GO
-- マスクを回避するためのユーザーの作成
CREATE USER UnmaskedUser WITHOUT LOGIN;
GO
-- テーブルへのSELECT権限を付与
GRANT SELECT ON Customers TO MaskedUser;
GRANT SELECT ON Customers TO UnmaskedUser;
GO
-- UnmaskedUserにUNMASK権限を付与
GRANT UNMASK TO UnmaskedUser;
GO

 それでは実際にマスクデータを確認してみましょう。

-- MaskedUserとしてデータを確認
EXECUTE AS USER = 'MaskedUser';
SELECT * FROM Customers;
REVERT;
GO

 マスクされた状態のデータが確認できます。
 また、マスクの状態も意図した結果となっていますね。

 

 最後にUNMASK権限を付与されているユーザーで確認します。

-- UnmaskedUserとしてデータを確認
EXECUTE AS USER = 'UnmaskedUser';
SELECT * FROM Customers;
REVERT;
GO

 マスクが外された状態で結果を確認することができますね。

まとめ

 今回はテスト用テーブルを作成し、メールアドレス、電話番号、クレジットカード番号に対してそれぞれ異なるマスクを適用しました。

 マスクされたデータを確認するだけでなく、実運用でも必ず利用するマスクを回避するためのユーザーを作成し、その結果を確認することもできました。

 動的データマスクを活用することで、データの機密性を保護しながら、必要なユーザーに適切な権限を付与し、データ分析を行うことが可能となります。

 弊社は様々な業種のお客様へデータ分析基盤を提供しております。
 なお、Azure上での分析基盤のベースとなる構成についてはこちらの社内ブログをご参照ください。

 データ分析基盤導入をご検討されているお客様がいらっしゃれば、ぜひお気軽にご相談ください。

中川 智文(2022年入社)
株式会社システムサポート フューチャーイノベーション事業本部 ソリューションサービス事業部所属
Oracle Database, SQL Serverを中心とした案件に従事