個人情報を難読化するfluent-plugin-anonymizerの安定版をリリースしました #fluentd
突然ですが皆さん、アプリログをFluentdで収集する際に個人情報となるデータの扱い、どうしていますか?
こういったログデータは個人情報保護や内部統制の観点から、データマスキングをしてから分析した方が好ましいです。
しかしながら、サーバにアクセス出来る人が限られるといった理由で問題の先送りをしているケースがあるかもしれません。
最近流行のログの見える化により、データマスキングされないまま多くの人がそういった情報にアクセス出来るようになっているのなら、余計にマズいですよね。
そこでデータマスキングを実現するfluent-plugin-anonymizer
の出番です。
このプラグインを経由することで、文字列のハッシュ化と、IPv4/IPv6アドレスの丸め処理が出来ます。
リアルタイム分析用のElasticsearch+Kibanaといった検索ダッシュボードアプリへデータを格納する際にも有用ですね。
y-ken/fluent-plugin-anonymizer
対応している難読化機能
文字列のハッシュ化と、IPアドレス(IPv4/IPv6自動判定)のネットマスク処理に対応しています。
難読化処理の設定毎に、処理対象のキーを任意に選ぶ設定を記述します。
文字列のハッシュ化
MD5
abc => 0bee89b07a248e27c83fc3d5951213c1SHA1
abc => 03cfd743661f07975fa2f1220c5194cbaff48451SHA256
abc => edeaaff3f1774ad2888673770c6d64097e391bc362d7d6fb34982ddf0efd18cbSHA384
abc => e8d1420b4ff41c3f12186d894a99e1c4aa681da79c47007e9dadecd9ecb0482ee1e224510e7484078c0289f34396b9c3SHA512
abc => 4f285d0c0cc77286d8731798b7aae2639e28270d4166f40d769cbbdca5230714d848483d364e2f39fe6cb9083c15229b39a33615ebc6d57605f7c43f6906739d
IPアドレスの丸め処理(匿名化)
任意のネットマスクを利用したIPアドレスの匿名化を行います。
IPv4アドレスを24bitでマスクする
10.102.3.80 => 10.102.3.0IPv6アドレスを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_keys
でSHA1を用いたハッシュ化を行い、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)
- テストの強化
- v0.0.1とv0.0.2のコード差分
0.0.3 (December 3, 2013)
- HandleTagNameMixinの扱いの不備を修正 Bug #1
- v0.0.2とv0.0.3のコード差分
0.1.0 (January 7, 2014)
- 0.1.0
ipv4_mask_keys
設定を廃止
IPv4/IPv6自動判定化に伴い、ipaddr_mask_keys
への変更をお願いします - v0.0.3とv0.1.0のコード差分
最後に
ログ集約サーバに行動ログなどを保存する際、分析が困難にならない程度にデータマスキングしたいですね。
そして、いま実装されていない有用なデータマスキングロジックがございましたら、Twitter:@yoshi_kenやGitHubから連絡をお待ちしております。
追記
- 2014年1月10日 : @haruyamaさんよりご指摘を頂き、hash_saltオプションについての補足を加えました。