Cloud DLPの検出器と変換パターン
Cloud DLPの検出器
Cloud DLPでは、組み込みでPII(個人識別子)の検出器が用意されている。
Cloud DLPでは、この検出器によってPIIを判定する。
正規表現のパターンマッチングに近いイメージ
検出器の検出パターン
検出器にはいくつかテンプレート化された検出パターンが用意されている。
かなり多くの検出パターンが用意されている。
グローバル
43個の情報タイプが用意されている。
PII(Personally Identifiable Information)に分類されるものを列挙する
概要 | 説明 |
---|---|
広告識別子 | Google Play 広告 ID、Amazon 広告 ID、Apple の identifierForAdvertising(IDFA)や identifierForVendor(IDFV)など |
年齢 | 月数または年数で表されます。 |
出生地 | 出生地、居住地、市民権に言及するために使用される場合、国 |
生年月日 | コンテキストによって生年月日として識別される日付 |
メールアドレス | ドメイン名の最大長は 255 文字、ローカル部分の最大長は 64 文字 |
電話番号 | |
女性の名前 | 一般的な女性の名前 |
男性の名前 | 一般的な男性の名前 |
名前 | 氏名(名、ミドルネーム、イニシャル、姓などが含まれます) |
姓 | |
名 | |
HTTP 基本認証ヘッダー | 基本認証ヘッダーは、サーバーに対してユーザーを特定するために使用する HTTP ヘッダーです。RFC 1945 の HTTP 仕様の一部 |
HTTP Cookie と set-cookie ヘッダー | サーバーに送信された Cookie またはサーバーから送信された Cookie を含むヘッダー |
ICCID value for SIM cards | SIMカードを一意に識別するもの |
スマートフォンの IMEI 番号 | 携帯電話を識別するために使用される IMEI |
User IMSI number | 帯電話ネットワークのユーザーを識別するために使用される、IMSI識別子 |
IP アドレス | インターネット プロトコル(IP)アドレス(IPv4 または IPv6) |
MAC アドレス | ネットワーク アダプタの識別子 |
ローカル MAC アドレス | |
番地 | 住所の番地 |
車両識別番号 | 車両識別番号(VIN)は、公道を走る自動車に割り当てられた固有の 17 桁のコード |
PIIではないが、機密性が高い情報
これからのデータは大抵、SPII(Sensitive PII)に区分されている。
概要 | 説明 |
---|---|
認証トークン | この検出器は OAuth 認証または Bearer 認証に準拠するトークンを識別 |
AWSの認証情報 | AWSののアカウントアクセスキー |
Azure JSON ウェブトークン | Azure 証明書の認証情報 |
クレジット カード番号 | 12〜19 桁のクレジット カード番号 |
クレジット カード トラック番号 | クレジット カード トラック番号は可変長の英数字の文字列です。カード所有者に関する重要な情報の格納に使用されます |
暗号鍵 | |
Google Cloud Platform API キー | GCPのAPIキー |
Google Cloud Platform サービス アカウント認証情報 | GCPのサービスアカウント認証情報 |
OAuthのクライアントシークレット | 構成、コード、その他のテキスト内のクリアテキストのパスワード |
SSL 証明書 | セキュア ソケット レイヤ プロトコルを使用して、本人確認と安全な接続を確立するために使用される暗号証明書 |
最もよく使われている脆弱なハッシュ化パスワードの上位 100,000 件 | ハッシュを簡単に推測できる、よく使用されるパスワード |
グローバルで、PIIでかつ機密性が高い情報
- 健康保険番号(ケベック州)
- 出生地
- ICCID value for SIM cards
- スマートフォンの IMEI 番号
- User IMSI number
- 車両識別番号
Japan
日本で利用されるデータの情報タイプもある。
日本のデータはどれもSPIIに区分されており、機密性はいずれも「高」
概要 | 説明 |
---|---|
銀行口座番号 | |
運転免許証番号 | |
個人番号または「マイナンバー」 | |
パスポート番号 | パスポート番号はアルファベット 2 文字と 7 桁の数字で構成される |
アメリカ
カスタム検出器の作成
Cloud DLPは、検出器を自在にカスタマイズすることが可能。
カスタム辞書検出器
辞書型のカスタム検出器を作成するには、JSON オブジェクトで任意のプロパティを指定する。
メソッドの説明
- InfoType: 検出器に付ける名前
-
Likelihood: フィールドを指定しない場合、辞書項目と一致したものについて、デフォルトの値 VERY_LIKELYを返却
- 検出器の誤検出の閾値を設定
-
DetectionRule: 楽観的なマッチングパターンを設定する
- 例えば、電話番号を検出するInfoTypeに対して、先頭に
TEL
が付いている場合を許容するなど
- 例えば、電話番号を検出するInfoTypeに対して、先頭に
- SensitivityScore: InfoTypeの機密レベルを設定
- データのプロファイルで使用される
- WordList: 一致させる文字列
{
"customInfoTypes":[
{
"infoType":{
"name":"CUSTOM_INFOTYPE_NAME"
},
"likelihood":"LIKELIHOOD_LEVEL",
"detectionRules":[
{
"hotwordRule":{
HOTWORD_RULE
}
},
...
],
"sensitivityScore":{
"score": "SENSITIVITY_SCORE"
},
"dictionary":
{
"cloudStoragePath":
{
"path": "gs://PATH_TO_TXT_FILE"
}
}
}
],
...
}
例えば、通院患者の治療に使用された病室の情報を含むデータがあった場合、その特定のワードが入っているデータを検出します。
{
"item":{
"value":"Patient was seen in RM-YELLOW then transferred to rm green."
},
"deidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"primitiveTransformation":{
"replaceWithInfoTypeConfig":{
}
}
}
]
}
},
"inspectConfig":{
"customInfoTypes":[
{
"infoType":{
"name":"CUSTOM_ROOM_ID"
},
"dictionary":{
"wordList":{
"words":[
"RM-GREEN",
"RM-YELLOW",
"RM-ORANGE"
]
}
}
}
]
}
}
組み込みの infoType 検出器の拡張することも可能
...
"inspectConfig":{
"customInfoTypes":[
{
"infoType":{
"name":"PERSON_NAME"
},
"dictionary":{
"wordList":{
"words":[
"quasimodo"
]
}
}
}
]
}
...
カスタム正規表現検出器の作成
正規表現を定義して、パターンマッチングによる検出を行う。
メソッドの説明
~カスタム辞書検出器と重複する箇所は省略~
- Regex : 正規表現を定義する単一のパターンで構成される
{
"customInfoTypes":[
{
"infoType":{
"name":"CUSTOM_INFOTYPE_NAME"
},
"likelihood":"LIKELIHOOD_LEVEL",
"detectionRules":[
{
"hotwordRule":{
HOTWORD_RULE
}
},
"sensitivityScore":{
"score": "SENSITIVITY_SCORE"
},
],
"regex":{
"pattern":"REGULAR_EXPRESSION_PATTERN"
}
}
],
...
}
検出したデータの変換パターン
検出器で検出したデータは、分類、秘匿化、匿名化ができる
匿名下手法の種類
- 削除: 検出された機密値のすべてまたは一部を削除します。
- 置換: 検出された機密値を指定されたサロゲート値に置換します。
- マスキング: 機密値の文字数をハッシュ(#)やアスタリスク(*)などの指定された代替文字に置き換えます。
- 暗号ベースのトークン化: 暗号鍵を使用して元の機密値を暗号化します。Cloud DLP は、逆行または「再識別」できる変換を含む数種類のトークン化をサポートしています。
- バケット化: 機密値をある範囲の値に置き換えることによって「一般化」します(たとえば、特定の年齢を年齢の範囲に、気温を「暑い」「ふつう」「寒い」に対応する範囲に置き換えます)。
- 日付シフト: 機密の日付値をランダムな日数だけシフトします。
- 時間抽出: 日付と時刻の値の指定部分を抽出または保存します。
削除
検出したパターンを削除します。
DLP API: RedactConfig
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
},
"deidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
],
"primitiveTransformation":{
"redactConfig":{
}
}
}
]
}
},
"inspectConfig":{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
]
}
}
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is ."
},
}
置換
検出したパターンを任意の文字列で置換します。
DLP API: ReplaceValueConfig
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
},
"deidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
],
"primitiveTransformation":{
"replaceConfig":{
"newValue":{
"stringValue":"[email-address]"
}
}
}
}
]
}
},
"inspectConfig":{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
]
}
}
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is [email-address]."
},
}
辞書置換も可能。
その場合、wordList
で指定されたものがランダムで出力される
{
"item": {
"value": "My name is Alicia Abernathy, and my email address is aabernathy@example.com."
},
"deidentifyConfig": {
"infoTypeTransformations": {
"transformations": [
{
"infoTypes": [
{
"name": "EMAIL_ADDRESS"
}
],
"primitiveTransformation": {
"replaceDictionaryConfig": {
"wordList": {
"words": [
"izumi@example.com",
"alex@example.com",
"tal@example.com"
]
}
}
}
}
]
}
},
"inspectConfig": {
"infoTypes": [
{
"name": "EMAIL_ADDRESS"
}
]
}
}
マスキング
検出した文字を、*
や#
で置換する。
置換と異なるのは、一部だけ適応するなどの処理が可能。
DLP API: CharacterMaskConfig
メソッド
- maskingCharacter: 置換文字
- numberToMask: 先頭(または後尾)からのマスキング文字数
- reverseOrder: 逆順にすると、一致した値の文字は値の終わりから始まりに向かってマスキングされる
- charactersToIgnore: マスキングを無視する文字列。
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is aabernathy@example.com."
},
"deidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
],
"primitiveTransformation":{
"characterMaskConfig":{
"maskingCharacter":"#",
"reverseOrder":false,
"charactersToIgnore":[
{
"charactersToSkip":".@"
}
]
}
}
}
]
}
},
"inspectConfig":{
"infoTypes":[
{
"name":"EMAIL_ADDRESS"
}
]
}
}
{
"item":{
"value":"My name is Alicia Abernathy, and my email address is ##########@#######.###."
},
...
}
暗号ベースのトークン化変換
暗号ベースのトークン化(「仮名化」とも呼ばれます)変換を行う。
- 暗号ハッシュ
- フォーマット保持暗号化
- 確定的暗号化
暗号ハッシュ
DLP API: CryptoHashConfig
暗号ハッシュ変換を行うと、検出された情報をBase64 エンコードで変換して出力します。
以下の注意点があります。
- 入力値は暗号化されずにハッシュされます。
- この操作は元に戻せません。
- ハッシュできるのは文字列と整数値のみです。
フォーマット保持暗号化
DLP API: CryptoReplaceFfxFpeConfig
入力値(Cloud DLP が検出した機密データの一部)を受け取り、それを FFX モードのフォーマット保持暗号化と CryptoKey を使用して元の値を暗号化された値(トークン)に置き換えます。
生成されるトークンは次のとおりです。
- 暗号化された入力値です。
- 暗号化後の文字セット(「アルファベット」)と入力値の長さを保持します。
確定的暗号化
検出した情報を、[AES-SIV[(https://datatracker.ietf.org/doc/html/rfc5297)とCryptoKeyで暗号化してから、元の値を Base64 エンコードの暗号化された値に置換します。
生成されるトークンは次のとおりです。
- 暗号化された値の Base64 エンコード表現です。
- 暗号化後の文字セット(「アルファベット」)と入力値の長さを保持しません。
- CryptoKey に基づき SIV モードでの AES 暗号化(AES-SIV)を使用して計算されます。
{
"deidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"infoTypes":[
{
"name":"PHONE_NUMBER"
}
],
"primitiveTransformation":{
"cryptoDeterministicConfig":{
"cryptoKey":{
"unwrapped":{
"key":"[CRYPTO_KEY]"
}
},
"surrogateInfoType":{
"name":"PHONE_SURROGATE"
}
}
}
}
]
}
},
"inspectConfig":{
"infoTypes":[
{
"name":"PHONE_NUMBER"
}
]
},
"item":{
"value":"My phone number is 206-555-0574, call me"
}
}
My phone number is PHONE_SURROGATE(36):ATZBu5OCCSwo+e94xSYnKYljk1OQpkW7qhzx, call me
ちなみに、暗号鍵があれば戻る。
{
"reidentifyConfig":{
"infoTypeTransformations":{
"transformations":[
{
"infoTypes":[
{
"name":"PHONE_SURROGATE"
}
],
"primitiveTransformation":{
"cryptoDeterministicConfig":{
"cryptoKey":{
"unwrapped":{
"key":"[CRYPTO_KEY]"
}
},
"surrogateInfoType":{
"name":"PHONE_SURROGATE"
}
}
}
}
]
}
},
"inspectConfig":{
"customInfoTypes":[
{
"infoType":{
"name":"PHONE_SURROGATE"
},
"surrogateType":{
}
}
]
},
"item":{
"value":"My phone number is [PHONE_SURROGATE](36):ATZBu5OCCSwo+e94xSYnKYljk1OQpkW7qhzx, call me"
}
}
My phone number is 206-555-0574, call me
バケット
バケット変換は、数値データを範囲ごとに「バケット化」することによる数値データの匿名化手法。
Cloud DLP: FixedSizeBucketingConfig, BucketingConfig
"bucketingConfig":{
"buckets":[
{
"min":{
"integerValue":"1"
},
"max":{
"integerValue":"30"
},
"replacementValue":{
"stringValue":"LOW"
}
},
{
"min":{
"integerValue":"31"
},
"max":{
"integerValue":"65"
},
"replacementValue":{
"stringValue":"MEDIUM"
}
},
{
"min":{
"integerValue":"66"
},
"max":{
"integerValue":"100"
},
"replacementValue":{
"stringValue":"HIGH"
}
}
]
}
1〜30: LOW で置換
31〜65: MEDIUM で置換
66~100: HIGHで置換
日付シフト
日付がランダムな日数だけシフトされる
DLP API: DateShiftConfig
deidentify_config {
record_transformations {
field_transformations {
fields {
name: "date"
}
primitive_transformation {
date_shift_config {
upper_bound_days: 100
lower_bound_days: -100
entity_field_id {
name: "user_id"
}
crypto_key {
unwrapped {
key: "123456789012345678901234567890ab"
}
}
}
}
}
}
}
日付シフト手法では、日付のセットがランダムにシフトされますが、期間の順序と持続時間は保持されます。通常、日付シフトは、個人またはエンティティのコンテキストで使用されます。つまり、各個人の日付は、その個人に固有の時間だけシフトされます。
user_id | date | action |
---|---|---|
1 | 2009-06-09 | run |
1 | 2009-06-03 | walk |
1 | 2009-05-23 | crawl |
2 | 2010-11-03 | crawl |
2 | 2010-11-22 | walk |
… | … | … |
日付シフトを適用します。
user_id | date | action |
---|---|---|
1 | 2009-07-17 | run |
1 | 2009-07-11 | walk |
1 | 2009-06-30 | crawl |
2 | 2011-01-26 | crawl |
2 | 2011-02-14 | walk |
… | … | … |
日付は変わりましたが、順序と持続時間は保持されていることに注目してください。日付がシフトされた量は user_id 1 と 2 で異なります。
時間抽出
日付、時刻、タイムスタンプに一致した値の箇所が保持されます。
DLP API: TimePartConfig
元の値 | 変換後の値 |
---|---|
9/21/1976 | 1976 |
6/7/1945 | 1945 |
1/20/2009 | 2009 |
7/4/1776 | 1776 |
8/1/1984 | 1984 |
4/21/1982 | 1982 |
TimePartで抽出する条件を指定できます。
Enums | |
---|---|
TIME_PART_UNSPECIFIED | Unused |
YEAR | [0-9999] |
MONTH | [1-12] |
DAY_OF_MONTH | [1-31] |
DAY_OF_WEEK | [1-7] |
WEEK_OF_YEAR | [1-53] |
HOUR_OF_DAY | [0-23] |