builderscon tokyo 2017 に行ってきた

はじめまして。22 歳の学生です。これがこのブログ初のエントリとなります。

突然ですが、builderscon tokyo 2017 に行ってきました。知識も得られて、意識も高まり、知り合いもできて素晴らしいカンファレンスでした。

事前に「家に帰ってブログを書くまでが builderscon」とスタッフの方々からの洗脳を受けていたのでブログ開始に踏み切ることが出来ました。

builderscon tokyo 2017

builderscon は「知らなかった、を聞く」というテーマで開催されているカンファレンスです。

様々な分野のセッションが各部屋で繰り広げられており、自分が興味あるなーと感じたトークを聞きに行くみたいな感じです。フロントからインフラ、コンパイラとか 3D プリンタで作ったアナログコンピュータみたいなめっちゃコンピュータサイエンスっぽい話まで色々ありました。

詳しくは公式をご覧ください。

本エントリでは、私が聞いた中でも特に興味深かったセッションについて 2 つほどメモ的にまとめます。

Go で実装する軽量マークアップ言語パーサー

はてな記法 (LML) のパーサーを作る話。

はてな記法とか Markdown とかの LML は大体 HTML を生成するためのものなんだけど、それ用のパーサーが直接 HTML 吐くと柔軟じゃない (この HTML タグは使っちゃダメだよーみたいな設定が面倒)。はてな記法Perl の実装が多いらしく、手を加えるとなると Perl正規表現を読み解く必要があってツラい。つまり、HTMLじゃなくて中間表現を出力してくれて、かつ正規表現をゴリゴリ使ってないシンプルな実装が欲しい。

じゃあどうやって構文解析するのかというと、yacc に頼る。yaccBNF ライクな構文規則を渡してあげることでパーサーを生成してくれる。Go 用の yaccgoyacc というのがあるらしいのでそれを使う。ちなみにレキサーtext/scanner を使う。Go は公式で色々用意されてて便利。

実装がこれ↓。最近、普段使ってる FSWiki のパーサー書きたいなーと思ってたところなのでこれを機に頑張って書いてみたい。

あと応用編の話の中で、URL のスキーム名以外にも : が出て来る可能性がある関係 (特殊文字では無いらしいので) で、はてな記法のリンクのパースに手こずったということを話していた。独自記法を考えるときはそこら辺色々考慮する点が多くて難しそう。

OSS で始めるセキュリティログ収集

osquery を利用してサーバーのセキュリティログを収集してサーバーを監視する話。会場にはやはりインフラの人が多かったような気がする。

運用をしていく上で分類されるセキュリティ対策として、抑止、予防、検知、復旧の 4 つに分類されており、この話では「検知」がメイン。セキュリティログを記録→視覚化→「検知」というアプローチ。

セキュリティログというものの定義がいまいち理解できてないのですが、とりあえずユーザーのログイン、実行したコマンド、修正されたファイルなどのログという認識をしてます。例としては /var/log/secure とかですかね。

そこで Audit を使うとそのあたりがかなり詳細にできるらしい。Audit はカーネルの機能とその他 Audit デーモンなどから成るシステムで、システムコール周りを監視して、このシステムコールが対象のファイルに実行されたー、とか、こんなコマンド実行されたー、とかをフィルタしてログとかに書き込んでくれるやつ(間違っていたらごめんなさい)。すごく便利そうだし、ログたくさん取ってビジュアライズしたらすごく面白そう。

ブログ書くついでに、手元でも「ユーザーが cd するたびにロギング」するどうでもいいルールを定義してみた。ちなみにシステムコールを指定するときはちゃんと -Fアーキテクチャを指定しないといけない。システムコール一覧は /usr/include/asm/unistd_64.h。(参照: https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Security_Guide/sec-Defining_Audit_Rules_and_Controls.html)

# auditctl -a always,exit -F arch=b64 -S chdir

実際に /var/log/audit/audit.log に出力されるログは下記。読めなくもないけど読みたくない。

type=SYSCALL msg=audit(1502199111.467:94838): arch=c000003e syscall=80 success=yes exit=0 a0=563480012400 a1=7f71a67e5ae8 a2=5634800123d0 a3=563480012401 items=1 ppid=24901 pid=24902 auid=1000 uid=1000 gid=1000 euid=1000 suid=1000 fsuid=1000 egid=1000 sgid=1000 fsgid=1000 tty=pts8 ses=1 comm="bash" exe="/usr/bin/bash" key=(null)
type=CWD msg=audit(1502199111.467:94838): cwd="/home/users/zuiurs"
type=PATH msg=audit(1502199111.467:94838): item=0 name="/home/users/zuiurs/work" inode=486803 dev=fd:00 mode=040700 ouid=1000 ogid=1000 rdev=00:00 nametype=NORMAL
type=PROCTITLE msg=audit(1502199111.467:94838): proctitle=7375002D007572757368696461

このログをパースしてくれるのが osquery。吐き出す形式は JSON で、これを集約して Kibana で可視化したり、イベントを Slack に投げたりする。ちなみにスピーカーの方はこれで 200 台監視して、ログ多めの設定で 1 日 1200 万行くらい溜まるらしいので logrotate は必須。

おわりに

身になる知識はもちろん、勉強の取っ掛かりとなる入門的な知識もたくさん得られたので、これから数ヶ月はやりたいことでいっぱいだと思います。

あとインターンの仲間だったり、その知り合いだったりと人とのコミュニケーションとかもあったので良かったです。懇親会は参加しなかったのですが、行っておけば良かったような気がします。

次回もまた参加したいと思えるくらい楽しいカンファレンスでした。運営の方々、スピーカーの方々、その他関わってくださった皆さま、ありがとうございました。