Y-Ken Studio

新しもの好きのデータエンジニアが四方山話をお届けします。

個人情報を難読化するfluent-plugin-anonymizerの安定版をリリースしました #fluentd

photo by minnepixel

突然ですが皆さん、アプリログをFluentdで収集する際に個人情報となるデータの扱い、どうしていますか?

こういったログデータは個人情報保護や内部統制の観点から、データマスキングをしてから分析した方が好ましいです。
しかしながら、サーバにアクセス出来る人が限られるといった理由で問題の先送りをしているケースがあるかもしれません。
最近流行のログの見える化により、データマスキングされないまま多くの人がそういった情報にアクセス出来るようになっているのなら、余計にマズいですよね。

そこでデータマスキングを実現するfluent-plugin-anonymizerの出番です。
このプラグインを経由することで、文字列のハッシュ化と、IPv4/IPv6アドレスの丸め処理が出来ます。
リアルタイム分析用のElasticsearch+Kibanaといった検索ダッシュボードアプリへデータを格納する際にも有用ですね。

y-ken/fluent-plugin-anonymizer

対応している難読化機能

文字列のハッシュ化と、IPアドレス(IPv4/IPv6自動判定)のネットマスク処理に対応しています。
難読化処理の設定毎に、処理対象のキーを任意に選ぶ設定を記述します。

文字列のハッシュ化

  • MD5
    abc => 0bee89b07a248e27c83fc3d5951213c1

  • SHA1
    abc => 03cfd743661f07975fa2f1220c5194cbaff48451

  • SHA256
    abc => edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cb

  • SHA384
    abc => e8d1420b4ff41c3f12186d894a99e1c4aa681da79c47007e9dadecd9ecb0482ee1e224510e7484078c0289f34396b9c3

  • SHA512
    abc => 4f285d0c0cc77286d8731798b7aae2639e28270d4166f40d769cbbdca5230714d848483d364e2f39fe6cb9083c15229b39a33615ebc6d57605f7c43f6906739d

IPアドレスの丸め処理(匿名化)

任意のネットマスクを利用したIPアドレスの匿名化を行います。

  • IPv4アドレスを24bitでマスクする
    10.102.3.80 => 10.102.3.0

  • IPv6アドレスを104bitでマスクする
    2001:db8:0:8d3:0:8a2e:70:7344 => 2001:db8:0:8d3:0:8a2e::

使い方

インストール方法

# fluentdをシステム側に入れている場合
$ gem install fluent-plugin-anonymizer

# td-agentを使っている場合
$ sudo /usr/lib64/fluent/ruby/bin/fluent-gem install fluent-plugin-anonymizer

設定例

次の設定は、member_idとmailに対してはsha1_keysSHA1を用いたハッシュ化を行い、hostに対してはIPアドレスを丸める処理を行う例です。

<source>
  type forward
  port 24224
</source>

<match test.message>
  type anonymizer
  
  # データマスキング処理毎に適用するキーをカンマ区切りで指定
  # md5_keys sha1_keys sha256_keys sha384_keys sha512_keysを複数指定可能
  sha1_keys         member_id, mail

  # ハッシュ化する際に渡すsalt文字列を指定(レインボーアタック対策)
  hash_salt         mysaltstring

  # IPアドレスの丸め処理を行うキーと、その際のネットマスクを指定
  ipaddr_mask_keys  host
  ipv4_mask_subnet  24    # デフォルト: 24
  ipv6_mask_subnet  104   # デフォルト: 104
  
  # test.からanonymized.にタグの付け替えを行う
  remove_tag_prefix test.
  add_tag_prefix    anonymized.
</match>

<match anonymized.message>
  type stdout
</match>

動作テスト

test.messageというtagで、host, member_id, mailというキーを持つレコードを投げます。

$ echo '{"host":"10.102.3.80","member_id":"12345", "mail":"example@example.com"}' | fluent-cat test.message
$ echo '{"host":"2001:db8:0:8d3:0:8a2e:70:7344","member_id":"12345", "mail":"example@example.com"}' | fluent-cat test.message

次のように、sha1_keysおよびipaddr_mask_keysにて指定されたキーに対して、データマスキング処理が適用されています。

$ tail -f /var/log/td-agent/td-agent.log
2014-01-06 18:30:21 +0900 anonymized.message: {"host":"10.102.3.0","member_id":"5ab2cebb0537866c4a0cd2e2f3502c0976b788da","mail":"7e9d6dbefa72d56056c8c740b34b5c0bbfec8d87"}
2014-01-06 18:30:22 +0900 anonymized.message: {"host":"2001:db8:0:8d3:0:8a2e::","member_id":"5ab2cebb0537866c4a0cd2e2f3502c0976b788da","mail":"7e9d6dbefa72d56056c8c740b34b5c0bbfec8d87"}

なお、実際に利用する際にはhash_saltオプションの文字列を指定することでレインボーアタックに強くし、次のような問題が起きないようにしましょう。

リリースノート

0.0.1 (November 19, 2013)
  • 初回リリース

0.0.2 (November 20, 2013)

0.0.3 (December 3, 2013)

0.1.0 (January 7, 2014)

最後に

ログ集約サーバに行動ログなどを保存する際、分析が困難にならない程度にデータマスキングしたいですね。
そして、いま実装されていない有用なデータマスキングロジックがございましたら、Twitter:@yoshi_kenGitHubから連絡をお待ちしております。

追記