- マスキングポリシー (ClickHouse Cloud, 25.12+): 特定のユーザー/ロールに対して、クエリ時に適用されるネイティブの動的マスキング
- 文字列置換関数: 組み込み関数を使用した基本的なマスキング
- マスクされたビュー: 変換ロジックを含むビューの作成
- マテリアライズドカラム: 元のデータと並行してマスク済みバージョンを保存
- クエリマスキングルール: ログ内の機密データをマスク (ClickHouse OSS)
マスキングポリシーを使用する (ClickHouse Cloud)
マスキングポリシーは、ClickHouse Cloud バージョン 25.12 以降で利用できます。
CREATE MASKING POLICY ステートメントを使用すると、クエリ実行時に特定のユーザーまたはロールに対してカラムの値を動的にマスクできます。他の方法とは異なり、マスキングポリシーでは個別のビューを作成したり、マスク済みのデータを保存したりする必要はありません。変換は、ユーザーがテーブルにクエリを実行する際に透過的に行われます。
基本的なマスキングポリシー
orders テーブルを作成してみましょう。
masked_data_viewer ロールに適用するマスキングポリシーを作成します:
masked_data_viewer ロールを持つユーザーが orders テーブルをクエリすると、マスクされたデータが自動的に表示されます。
Query
Response (for masked_data_viewer role)
masked_data_viewer ロールを持たないユーザーには、元の未マスクのデータが表示されます。
条件付きマスキング
WHERE句を使用すると、特定の行にのみマスキングを適用できます。たとえば、高額な注文だけをマスキングするには、次のようにします。
優先度付きの複数のポリシー
PRIORITY 句を使用します。優先度の値が高いものほど、最後に適用されます。
total_amount > 100 の注文では、name カラムに対して refined_masking ポリシー (優先度 10) が basic_masking ポリシー (優先度 0) より優先される一方、email には引き続き基本マスキングが適用されます。
ハッシュベースのマスキング
マスキングポリシーの管理
文字列置換関数を使用する
replace 関数ファミリーを使うことで、手軽にデータをマスクできます。
| Function | Description |
|---|---|
replaceOne | 検索対象文字列内で、パターンの最初の出現箇所を指定した置換文字列に置き換えます。 |
replaceAll | 検索対象文字列内で、パターンのすべての出現箇所を指定した置換文字列に置き換えます。 |
replaceRegexpOne | 検索対象内で、正規表現パターン (re2 構文) に一致する部分文字列の最初の出現箇所を、指定した置換文字列に置き換えます。 |
replaceRegexpAll | 検索対象内で、正規表現パターン (re2 構文) に一致する部分文字列のすべての出現箇所を、指定した置換文字列に置き換えます。 |
replaceOne 関数を使って、名前 “John Smith” をプレースホルダー [CUSTOMER_NAME] に置き換えることができます。
Query
Response
replaceRegexpOne を使用して任意の顧客名を置き換えることができます:
Query
Response
replaceRegexpAll 関数を使って社会保障番号をマスキングし、最後の4桁だけを残すこともできます。
Query
\3 を使用して3番目のキャプチャグループを結果の文字列に埋め込んでおり、その結果は次のようになります。
Response
マスクされた VIEW を作成する
VIEW は、前述の文字列関数と組み合わせることで、機密データを含むカラムがユーザーに表示される前に変換を適用できます。
これにより、元のデータは変更されず、VIEW に対してクエリを実行するユーザーにはマスクされたデータだけが表示されます。
例として、顧客の注文レコードを保存するテーブルがあるとします。
特定の従業員グループがこの情報を閲覧できるようにしたい一方で、顧客の完全な情報は見せたくありません。
以下のクエリを実行して、サンプルテーブル orders を作成し、そこに架空の顧客注文レコードをいくつか挿入します。
masked_orders という名前のビューを作成します:
SELECT 句では、部分的にマスクしたい機微情報を含む name、email、phone、shipping_address の各フィールドに対して、replaceRegexpOne を使った変換を定義しています。
ビューからデータを取得します:
Query
Response
select の権限のみを付与するよう、ロールベースのアクセス制御を使用する必要があります。
まず、ロールを作成します。
SELECT権限を付与します。
SELECT 権限が付与されていないことを確認する必要があります。
そのため、安全策として基となるテーブルへのアクセス権を明示的に取り消す必要があります。
masked_orders_viewer ロールを持つユーザーは、ビュー内のマスク済みデータのみを参照でき、
テーブル内の元の未マスクデータは参照できなくなります。
MATERIALIZED カラムとカラムレベルのアクセス制限を使用する
VIEW を作成しましたが、ここでは代わりに MATERIALIZED を使用してマスク済みカラムを作成します:
SELECT * クエリにマテリアライズドカラムが自動的には含まれないため、マスクされたカラムは明示的に選択する必要があります。
Query
Response
orders のマスクされたカラムに対する select 権限のみを付与します。
先ほど作成したロールを再作成します:
ordersテーブルに対するSELECT権限を付与します:
orders テーブルにマスク済みデータのみを保存したい場合は、
機密性の高い未マスクのカラムを EPHEMERAL として指定できます。
これにより、この型のカラムはテーブルに保存されなくなります。
Query
Response
ログデータにクエリマスキングルールを使用する
system.query_log、system.text_log、system.processes など) に保存される前に適用されます。
これにより、機密データがログにのみ漏洩するのを防ぐのに役立ちます。
ただし、クエリ結果内のデータはマスクされません。
たとえば、社会保障番号をマスクするには、次のルールを server configuration に追加できます。