データをマスキングする - Databricks

はじめに

「データは新しい石油である」という言葉が示すように、今日、データはますます多くのビジネスの原動力となっている。パーソナライズされた顧客体験、自動化されたマーケティングメッセージ、分析に基づくインサイトなど、すべてはデータの質と量が大きく影響している。そのため、多くの企業でデータの収集や活用を進めている一方で、立法機関は、GDPRやCCPAなど個人のプライバシーとセキュリティを守るための整備を進めている。

セキュリティやコンプライアンス、データ・プライバシーに関する規制が強化される中、データの利活用を進めるためにはデータマスキングは必要不可欠な技術である。 そこで今回はデータマスキングについてまとめ、Databricksを使ってどう実現するかについて説明する。

環境情報
・Databricks Runtime Version: 10.4 LTS (includes Apache Spark 3.2.1, Scala 2.12)
・Access mode: Shared

*動的ビューによるアクセス制御はSingle User access modeでは使用できない。

データマスキングとは

データマスキングとは、機密情報を保護するためにデータを匿名化する技術である。より具体的には、機密情報を体系的に元の構造に似た架空の値に変換するプロセスである。 ほとんどの企業では、個人情報などの機密情報は、厳格なセキュリティ管理によって保護されている。一方でデータ活用を進めるためには、機密情報を保護しつつ、データへのアクセスを可能にする必要がある。 そこでデータマスキングを行うことで、匿名化したデータを利用し、実際の機密情報をアクセスすることなくデータ活用を可能にしている。

データマスキングが必要なデータ

データマスキングが必要な代表的なデータには以下の4種類がある。

PII: Personal Identifiable Information

ある特定の個人を識別することができるデータ。具体的には、氏名や性別、住所、電話番号、電子メールアドレス、勤務先、生年月日、顔写真、日本のマイナンバー(個人番号)など行政が個人に割り当てた識別番号などが含まれる。

PHI: Protected Health Information

HIPAA(Health Insurance Portability and Accountability Act)法で、プライバシー保護・セキュリティ確保について定められた個人を特定できる保健データ。具体的には、個人の健康状況や保険情報、検査結果、病歴などが含まれる。

PCI-DSS: Payment Card Industry Data Security Standard

クレジットカード会員の情報を保護することを目的に定められた、クレジットカード業界の情報セキュリティ基準のこと。具体的にはプライマリアカウント番号(PAN)やカード会員名、有効期限、サービスコードなどが含まれる。

IP: Intellectual Property

人間の知的活動によって創作された表現や、商業上有用になりうる情報や標識など、財産性のある無体物のこと。

データマスキングの種類

代表的なデータマスキング方法には以下の3種類がある。

静的データマスキング (Static Data Masking)

静的データマスキングとは、静止状態の機密情報をマスキングし、データセットの複製を作成する方法である。マスキングされたデータは、マスキング前のデータとは別の環境に保存される。具体的には以下のプロセスでマスキングが行われる。

  1. 運用中のデータのバックアップを作成
  2. 別環境にデータをコピーする
  3. 重複データを削除する
  4. データにマスキングを施し、データを完全に架空の値へ変換する

静的データマスキング
*参照元: Static and Dynamic Data Masking

動的データマスキング (Dynamic Data Masking)

動的データマスキングとは、データへのアクセス時に動的にマスキングし、ロールベースのセキュリティ処理を行うことで、権限のないユーザーに対してマスキングされたデータを提供する方法である。ユーザからのアクセスに応じてマスキングを行うため、マスキングされたデータを別環境に保存する必要はない。(オリジナルデータは変更されない。)

具体的には、ユーザーがデータを取得するためにクエリを発行すると、設定とユーザーのロールに基づいてデータをマスクし、結果を返却する。

動的データマスキング
*参照元: Static and Dynamic Data Masking

オンザフライ データマスキング (On-the-Fly Data Masking)

オンザフライ データマスキングとは、データのマスキングをしてから本番環境から別環境にデータ転送を行う方法である。オンザフライ データマスキングは、特定のステージング環境なしでデータをマスキングする必要がある場合に利用される。バックアップ環境がない場合や、データをリアルタイムに移動させる必要があるプロセスで多く使用されている。

Databricksを使ったデータアクセス制御でできること

動的ビューを用いることで、列/行レベルでのアクセス制御と動的データマスキングが可能になる。 アクセス制御は、ビューの定義に含まれる以下の関数によって実現される。
*is_account_group_member()関数を使用する場合はUnity Catalogの利用が必須

・current_user(): 現在のユーザーの電子メールアドレスを返却する。

・is_account_group_member(): 現在のユーザーが指定されたグループのメンバーである場合、TRUEを返却する。

・is_member(): 現在のユーザーが指定されたワークスペースレベルのグループのメンバーである場合、TRUE を返却する。レガシーのため、Unity Catalogで動的ビューを利用する場合は利用しない。

列レベルでのアクセス制御

特定のユーザーまたはグループに対して、アクセスできる列を制限できる。

行レベル(フィルタリング)でのアクセス制御

特定のユーザーまたはグループに対して、行またはフィールドレベル(フィルタリング)の権限を指定できる。

動的データマスキング

特定のユーザまたはグループに対して、行または列レベルでデータマスキングを行うことができる。 ビューは標準の Spark SQL で実装されるため、より複雑なSQLや正規表現を使用することで、高度なマスキングを行うことができる。

基本的なデータアクセス制御方法

動的ビューを用いたデータアクセス制御方法について説明する。
*今回はUnity Catalogを使った場合について記載する。

データの準備

(1) 利用するカタログを指定する

USE CATALOG main;

(2) 利用するデータベースを指定する

DROP database IF EXISTS demo CASCADE;
CREATE database demo;
USE database demo;

(3) オリジナルデータを格納したテーブルを作成する

CREATE OR REPLACE TABLE main.demo.original_data
(
  device_id  INT,
  user_id    STRING,
  name       STRING,
  email      STRING,
  heartrate  DOUBLE
);

INSERT INTO main.demo.original_data VALUES
  (23,'40580129','Nicholas Spears','nicholas.spears@gmail.com',54.0122153343),
  (17,'52804177','Lynn Russell','lynn.russell@gmail.com',92.5136468131),
  (37,'65300842','Samuel Hughes','samuel.hughes@gmail.com',52.1354807863),
  (23,'40580129','Nicholas Spears','nicholas.spears@gmail.com',54.6477014191),
  (17,'52804177','Lynn Russell','lynn.russell@gmail.com',95.033344842),
  (37,'65300842','Samuel Hughes','samuel.hughes@gmail.com',57.3391541312),
  (23,'40580129','Nicholas Spears','nicholas.spears@gmail.com',56.6165053697),
  (17,'52804177','Lynn Russell','lynn.russell@gmail.com',94.8134313932),
  (37,'65300842','Samuel Hughes','samuel.hughes@gmail.com',56.2469995332),
  (23,'40580129','Nicholas Spears','nicholas.spears@gmail.com',54.8372685558);

(4) 正しくデータが格納されていることを確認する

SELECT * FROM main.demo.original_data

クエリの実行結果

original_dataテーブルに格納されているデータ

列レベルでのアクセス制御

(1) uc-userグループに所属するユーザにはnameカラムを表示しない
uc-userグループに所属するユーザがアクセスした場合は、nameカラムをREDACTEDに置き換える。その他の列については、通常どおりに返却される。

CREATE OR REPLACE VIEW main.demo.gold_dailyavg AS
SELECT
  user_id,
  CASE WHEN
    is_account_group_member('uc-user') THEN 'REDACTED'
    ELSE name
  END AS name,
  device_id,
  email,
  heartrate
FROM original_data

(2) uc-userグループに所属するユーザからアクセスし、列レベルでアクセス制御されていることを確認する

SELECT * FROM main.demo.gold_dailyavg;

クエリの実行結果

列レベルでアクセス制御されてることを確認する

行レベル(フィルタリング)でのアクセス制御

(1) uc-userグループに所属するユーザにはdevice_idが30以上の行は表示しない

CREATE OR REPLACE VIEW main.demo.gold_allhr AS
SELECT
  user_id,
  email,
  device_id,
  heartrate
FROM original_data
WHERE
  CASE WHEN
    is_account_group_member('uc-user') THEN device_id < 30
    ELSE TRUE
  END

(2) uc-userグループ以外に所属するユーザからアクセスし、device_idが30以上の行が表示されていることを確認する

SELECT * FROM main.demo.gold_allhr order by device_id DESC;

フィルタリングされていないことを確認

(3) uc-userグループに所属するユーザからアクセスし、device_idが30以上の行が表示されないことを確認する

SELECT * FROM main.demo.gold_allhr order by device_id DESC;

フィルタリングされたデータが表示されないことを確認

動的データマスキング

(1) uc-userグループに所属するユーザには以下の条件でマスキングされたデータを表示する

  • user_idカラムの下二桁のみ表示する
  • emailカラムで@以降のデータのみ表示する
CREATE OR REPLACE VIEW main.demo.gold_allhr AS
SELECT
  CASE WHEN
    is_account_group_member('uc-user') THEN CONCAT("******", RIGHT(user_id, 2))
    ELSE user_id
  END AS user_id,
  CASE WHEN
    is_account_group_member('uc-user') THEN regexp_extract(email, '^.*@(.*)$', 1)
    ELSE email
  END AS email,
  name,
  device_id,
  heartrate
FROM original_data

(2) uc-userグループ以外に所属するユーザからアクセスし、データがマスキングされていないことを確認する

SELECT * FROM main.demo.gold_allhr;

データがマスキングされていないことを確認

(3) uc-userグループに所属するユーザからアクセスし、データがマスキングされていることを確認する

SELECT * FROM main.demo.gold_allhr;

データがマスキングされていることを確認

まとめ

今回はDatabricksを使ったデータマスキング方法についてまとめた。

参考