kisenon

データマスキング

ブランチ作成時に PII を匿名化する — マスキングポリシー、組み込み関数ライブラリ、そしてマスクがコミットされるまでマスク済みブランチが封印され続ける仕組み。

データマスキング は、ブランチ が作成された瞬間に機密カラムを 匿名化します。ブランチ作成の呼び出しに マスキングポリシー を添付すると、新しい ブランチの一致するカラムは、ブランチが到達可能になる前に不可逆的に書き換えられます — ハッシュ化、NULL 化、切り詰め、または置換です。親ブランチは決して変更されません。

本番相当のデータを、その中の PII を渡すことなく開発・CI・業務委託先に渡したいときに 利用します。実際のテーブル形状、実際の行数、偽のメールアドレスが得られます。

How it works

マスキングポリシーは、プロジェクトスコープの名前付きルールセットです。各ルールは パターンでカラムに一致し、組み込みのマスキング関数を指定します。

フィールド意味
schema_patternスキーマ名のパターン(% または * = 任意、_ = 1 文字)。デフォルトは *
table_patternテーブル名のパターン。
column_patternカラム名のパターン。
masking_fn下記の組み込み関数のいずれか。
fn_args関数の引数(mask_constant のみが 1 つ取ります: value)。

ブランチ作成時に masking_policy_id が指定されると:

  1. ブランチは通常どおり親からフォークします(コピーオンライト — 即時)。
  2. ブランチは masking 状態に入ります。エンドポイントはプロビジョニングされず、 プロキシはそのブランチへの接続を拒否します。マスク前のデータを読み取れる ウィンドウは存在しません
  3. マスキングワーカーが最小権限ロールとしてブランチのコンピュートに接続し、スキーマを 検出し、あなたのルールをそれに照合し、すべての書き換えを単一トランザクションで 実行します。
  4. ブランチは ready に着地し、エンドポイントが立ち上がります — これでマスク済み データのみを提供します。いずれかの失敗が起きるとブランチは failed に着地して 封印されたままになります。削除してリトライしてください。

ルールの入力はデータとして扱われ、決して SQL としては扱われません。識別子はクォートされ、 引数値は実行時にパラメータとしてバインドされるため、悪意あるカラム名や定数が書き換えから 抜け出すことはできません。

Built-in functions

関数効果
mask_emailmd5(value)@masked.invalid
mask_nameName_ + 8 文字のハッシュプレフィックス
mask_nullNULL(カラムは NULL 許容である必要があります)
mask_constant指定した固定値(fn_args.value
mask_ssn_partial***-**-1234 — 末尾 4 桁を保持
mask_credit_card****-****-****-1234 — 末尾 4 桁を保持
mask_ip0.0.0.0
mask_date_year年を保持し、1 月 1 日に切り詰め
mask_hashmd5(value)
mask_shuffleハッシュベースのスクランブル(完全な文字シャッフルは計画中)
mask_phone合成された +1-555-XXXX 番号
mask_uuid新しいランダムな UUID

このカタログは API からも提供されます。

curl -s https://api.test.kisenon.com/v1/masking-functions \
  -H "Authorization: Bearer $KISENON_API_KEY"

Managing policies

データマスキングは 展開中 です。ここで説明するポリシーエディタとブランチ作成の ドロップダウンは順次有効化されています。あなたのアカウントでマスキングが有効になるまで、 API は 501 not_implemented を返し、コンソールには「まだ利用できません」という通知が 表示されます。その間、あなたのプロジェクトは影響を受けません。

コンソールで プロジェクト設定 → Data masking を開いてポリシーを作成します。名前を付け、 ルール(パターンカラム + 関数ドロップダウン)を追加して保存します。同じ操作面が API にも 存在します。

curl -s -X POST \
  https://api.test.kisenon.com/v1/projects/$PROJECT_ID/masking-policies \
  -H "Authorization: Bearer $KISENON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "dev-safe",
    "rules": [
      {"table_pattern": "users", "column_pattern": "email", "masking_fn": "mask_email"},
      {"table_pattern": "users", "column_pattern": "phone", "masking_fn": "mask_null"},
      {"table_pattern": "%", "column_pattern": "%ssn%", "masking_fn": "mask_ssn_partial"}
    ]
  }'

次に、通常のブランチ作成呼び出しにポリシーを追加して、マスク済みブランチを作成します。

curl -s -X POST \
  https://api.test.kisenon.com/v1/projects/$PROJECT_ID/branches \
  -H "Authorization: Bearer $KISENON_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name": "masked-dev", "masking_policy_id": "'$POLICY_ID'"}'

書き換えが実行されている間、ブランチは state: "masking" を報告します。コンソールで (ライブで、プロジェクトの イベントストリーム 経由で)、または GET /v1/branches/{id} をポーリングして、それが ready に切り替わるのを確認してください。

Good to know

  • マスキングは作成時に一度きりです。 ポリシーを編集しても、そのポリシーですでに 作成されたブランチには決して影響しません — それらは生まれたときのデータ形状を保ち続けます。 新しいルールを適用するにはブランチを作り直してください。
  • 使用中のポリシーは削除できません。 ライブなブランチが作成されたポリシーを削除すると 409 policy_in_use を返します。先にそれらのブランチを削除してください。
  • 一致しないルールはスキップされ、致命的ではありません。 スキーマがドリフトしてパターンが 何にも一致しない場合でも、ブランチは完了します。マスクされるはずだったカラムにまだ実データの 形状が残っている場合は、ルールのパターンを確認してください。
  • 型の不一致はブランチを失敗させます。 関数が書き換えられないカラムに一致するルール (たとえば integer に対する mask_email)はマスク全体を中止します — ブランチは failed に 着地し、半分マスクされた状態で公開されることは決してありません。