Y's note

Web技術・プロダクトマネジメント・そして経営について

本ブログの更新を停止しており、今後は下記Noteに記載していきます。
https://note.com/yutakikuchi/

ブラウザ識別用Cookieを生成する「mod_oreore(仮)」を作ったった

mod_oreore(仮)

ネーミングセンスが糞すぎる@yutakikuchi_です。
アクセス履歴をLogに落として行動履歴を追いたい時はCookieに識別子を設定するのが一般的かと思います。一般的にあるCookie識別子の設定のタイミングはFWやアプリケーションのでやるというように様々パターンを見かけますが、今回はApacheのレイヤーで自動的に付与してくれるModuleを作ってみました。因に同じようなApacheModuleは幾つか存在しますが、完全なる一意性が保証されていないことやApacheのVersionで使えなかったり等、ちょっとイケテナイ感じがしたので自作してみました。※mod_oreoreとはユーザー視点で「俺だよ!俺!」っというLogに自ら足跡を残す意味で、決してオレオレ詐欺とは関係ありません。
mod_usertrack ※ 一意性に問題あり
mod_session_cookie ※ apache2.3以降で利用可能


github : mod_oreore(仮)
識別子の値にはRequestを受け付けたサーバーのIPアドレス、リクエスト時刻(タイムスタンプ:マイクロ秒)、ApacheのプロセスID、コネクションIDを重ね合わせ、最終的な出力はbase64のURLSafeな形でencodeしています。base64する前に生成した識別子を暗号化しようと思ったのですが、処理が冗長的な気がして辞めました(ソースには暗号化をそのまま残しております)。またDOS攻撃を防ぐ処理は入れていません。

設定と確認

$ sudo yum install httpd httpd-devel openssl openssl-devel
$ git clone https://github.com/yutakikuchi/apache_module.git
$ cd apache_module/mod_oreore
$ sudo apxs -i -a -c -I/usr/include/openssl -L/usr/lib64 -lcrypto mod_oreore.c
$ sudo cp conf/oreore.conf /etc/httpd/conf.d/
$ sudo vim /etc/httpd/conf.d/oreore.conf

<IfModule mod_oreore.c>
    #NameパラメータでCookie名を指定する(ここは自由に書き換える)
    Name OREORE
    #Domainパラメータの先頭は.で始める(ここは自由に書き換える)
    Domain .cookie-test.com
    #Expiresパラメータで有効期間を指定する(指定可能なのはyears,months,weeks,days,hours,minutes,seconds)
    Expires "2 years"
</IfModule>

$ sudo vim /etc/httpd/conf/httpd.conf
#以下をcombinedログに指定
LogFormat "domain:%V\thost:%h\tserver:%A\tident:%l\tuser:%u\ttime:%{%d/%b/%Y:%H:%M:%S %z}t\tmethod:%m\tpath:%U%q\tprotocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tagent:%{User-Agent}i\tresponse_time:%D\toreore_cookie:%{OREORE}C" combined

$ sudo /etc/init.d/httpd restart
$ #Webブラウザで2回アクセスしてみる
$ tail -f /var/log/httpd/access_log

domain:cookie-test.com	host:XXXXXXX	server:YYYYYYY	ident:-	user:-	time:07/Aug/2014:16:37:09 +090method:GET	path:/index.html	protocol:HTTP/1.1	status:304	size:-	referer:-	agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_9_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.125 Safari/537.36	response_time:5588	oreore_cookie:id=<ここに設定された識別子が入る>&v=1

$ sudo vim /etc/httpd/conf/httpd.conf 
#消したい場合は以下を削除orコメントアウト
LoadModule oreore_module      /usr/lib64/httpd/modules/mod_oreore.so

Apache側で全て自動的に処理をしてくれるので楽ですね。(^o^)/
後は識別子毎にLog行をsortしたりするとブラウザ毎にどんな行動があったかが纏められて把握できますね。(^o^)/(^o^)/