ニュース&ブログ
【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を中心とした案件に従事