とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

SECCON 2014 オンライン予選(英語)32時間 CTFに参加してました

12/6-7に行われていた32時間耐久SECCON 2014オンライン予選(英語)にctpmのメンバとして参加してました。

といいながら、子供の相手した李家の掃除とかしてからの参加だったので、1日目11時間ぐらいと2日目5時間ぐらいの計16時間ぐらいの参加でした。(上:瞬間最大風速、下:最終結果)

f:id:mazinlabs:20141211105128j:plain

f:id:mazinlabs:20141211105133p:plain

瞬間最大風速では全体3位、国内1位だったものの後半伸び悩んでズルズルとさがり、結果として全体25位(全802チーム中)、国内6位でした。 他のチームメンバに頑張ってもらいましたが、QRコード職人としての面目躍如の2問解いたのでwriteup書いておきます。

QR (Easy)

  • 問題文

    世界一面白いジョーク: 昨晩フランネルケーキを食べる夢を見たんだけど、 朝起きたらQRコードが半分なくなってたんだ!

というわけで、去年のオンライン予選よろしく半分になったQRコードの画像があるので復元開始。

このへんとか

Format and Version Information - QR Code Tutorial

このへんをみてフォーマットとタイミングパターンを補ってあげる。

Format and Version String Tables - QR Code Tutorial

分かるのはECC LevelがHでマスクパターンが(row) mod 2 == 0。 で、残ってるデータはどこまであるのかを確認してみると、データ部分はまるっと残っているらしい。

f:id:mazinlabs:20141211110206p:plain

ならこれ以上復元しなくても問題ないやと、あとはWindowsの人に投げてQRコードを読み込んでもらっておしまい。

※最初復元して読み込んだのに通らなかったけど黒塗りの漏れがあったので修正したら通った。

BBQR

  • 問題文

    Let's enjoy BBQR!

というわけで、今度こそ去年と同じ焼けたQRコード。 多分このサイトの最後の一文原因じゃないかなと思ったり。。。

SECCON CTF 2013 online予選 forensics 400 : Eleclog.

今度はQRコードの右半分が消えているので、つまりデータ領域がないので単純に復元はできない。

今回もECC LevelはHだが、マスクパターンは(row + column) mod 2 == 0

一応復元したQRコードにレイヤを重ねてみると幸いにパリティ部分はまるっと残っているのでそちらから復元しろということなのかなと思う。

f:id:mazinlabs:20141211111713p:plain

調べるとリード・ソロモン符号の複合とかになってちんぷんかんぷん。

リード・ソロモン符号 - Wikipedia

いろいろ考えてもできそうになし時間もないのでどうしようかなと考えた結果、Keyは英数字で文字数はQR(Easy)だと勝手に決めつけて、そちらからデータを引っ張ってくれば複合できるのではないかと思い試してみる。

ただ、単純にコピペだとダメそうな気がしたのでQR(Easy)のマスク(row) mod 2 == 0を外したものを、今回のQRコードのマスクである(row + column) mod 2 == 0に再度マスキングしておく。

f:id:mazinlabs:20141211112519p:plain

これをWindowsの人に読み込んでもらったらKeyが出て無事にSubmit。

というわけで、今度こそQRコードは煮たり焼いたり食べたりしないでくださいね!

結局、無事にQR担当のお役目は務めたもののそれ以外はHeartbleed問題用の環境をCloudnの上に構築した程度。 あんまり役に立てなかったのでチームの弱い部分を埋めるスキルを身につけるかな・・・

DevStackでSahara(Juno版)を動かしてみよう

こんばんは。 現在12月8日の33時です。 今日の記事は「OpenStack (2枚目) Advent Calendar 2014」12/8 分です

OpenStackのJuno版から入ったデータ処理サービス「Sahara」に興味があったので、DevStackでSaharaを動かすまでの軌跡を書いております。

Setup DevStack — Sahara

ドキュメントを見ると、DevStackのlocal.confに以下の行を追加するだけで動きそうです。

# Enable Sahara
enable_service sahara

あとはstack.shを叩くだけ!

%  ./stack.sh

何だ簡単じゃん!

そんなわけなかった。。。

1. Horizonのテストでコケる

VagrantUbuntuのBoxを拾ってきて構築したものの、gettextパッケージがないと言ってテストがコケる。

2014-11-28 02:13:29.288 | HEAD is now at d9f336b Merge "Make status in instance details screen translatable" into stable/juno
2014-11-28 02:13:29.290 | + cd /opt/stack/horizon
2014-11-28 02:13:29.290 | + ./run_tests.sh -N --compilemessages
2014-11-28 02:13:29.613 | WARNING:root:No local_settings file found.
2014-11-28 02:13:29.744 | CommandError: Can't find msgfmt. Make sure you have GNU gettext tools 0.15 or newer installed.
2014-11-28 02:13:29.780 | + exit_trap
2014-11-28 02:13:29.780 | + local r=1
2014-11-28 02:13:29.781 | ++ jobs -p
2014-11-28 02:13:29.781 | + jobs=
2014-11-28 02:13:29.782 | + [[ -n '' ]]
2014-11-28 02:13:29.782 | + kill_spinner
2014-11-28 02:13:29.782 | + '[' '!' -z '' ']'
2014-11-28 02:13:29.782 | + [[ 1 -ne 0 ]]
2014-11-28 02:13:29.782 | + echo 'Error on exit'
2014-11-28 02:13:29.783 | Error on exit
2014-11-28 02:13:29.783 | + [[ -z /opt/stack/logs ]]
2014-11-28 02:13:29.783 | + /home/vagrant/devstack/tools/worlddump.py -d /opt/stack/logs
2014-11-28 02:13:29.819 | + exit 1

horizon/install.rst at master · openstack/horizon · GitHub

Installの手順を見ると思いっきりgettextが必要なんですが、DevStackのHorizonが必要とするパッケージには書かれていない。

devstack/horizon at stable/juno · openstack-dev/devstack · GitHub

よってfiles/apts/horizongettextを追加。

apache2  # NOPRIME
gettext # 追加
libapache2-mod-wsgi  # NOPRIME
python-beautifulsoup
python-dateutil

2. requirementsが最新じゃない

インストールの最中にライブラリが足りないみたいなエラーで落ちる。

2014-12-09 00:49:51.052 | Syncing /opt/stack/sahara/requirements.txt
2014-12-09 00:49:51.052 | 'oslo.middleware' is not in global-requirements.txt
2014-12-09 00:49:51.072 | + exit_trap
2014-12-09 00:49:51.072 | + local r=1
2014-12-09 00:49:51.073 | ++ jobs -p
2014-12-09 00:49:51.074 | + jobs=
2014-12-09 00:49:51.074 | + [[ -n '' ]]
2014-12-09 00:49:51.074 | + kill_spinner
2014-12-09 00:49:51.074 | + '[' '!' -z '' ']'
2014-12-09 00:49:51.074 | + [[ 1 -ne 0 ]]
2014-12-09 00:49:51.074 | + echo 'Error on exit'
2014-12-09 00:49:51.075 | Error on exit
2014-12-09 00:49:51.075 | + [[ -z /opt/stack/logs ]]
2014-12-09 00:49:51.076 | + /home/vagrant/devstack/tools/worlddump.py -d /opt/stack/logs
2014-12-09 00:49:51.117 | + exit 1

よく見るとstable/juno版にはないライブラリが必要らしく、requirementsの最新版に入ってることを確認。 local.confに以下の行を追加。

REQUIREMENTS_BRANCH=${REQUIREMENTS_BRANCH:-master}

3. Internal Server Error

これでようやくHorizonのダッシュボードからSaharaの画面が見えた。 ということでSahara触ってみようとすると500 Internal Server Errorをもらう。 ログを見ると以下のとおり。

2014-11-26 08:10:22.602 ERROR sahara.utils.api [-] Request aborted with status code 500 and message 'Internal Server Error'
2014-11-26 08:10:22.602 ERROR sahara.utils.api [-] Traceback (most recent call last):
  File "/opt/stack/sahara/sahara/utils/api.py", line 89, in handler
    return func(**kwargs)
  File "/opt/stack/sahara/sahara/api/acl.py", line 46, in handler
    exc=exceptions.Forbidden)
  File "/opt/stack/sahara/sahara/openstack/common/policy.py", line 314, in enforce
    self.load_rules()
  File "/opt/stack/sahara/sahara/openstack/common/policy.py", line 241, in load_rules
    self.policy_path = self._get_policy_path(self.policy_file)
  File "/opt/stack/sahara/sahara/openstack/common/policy.py", line 287, in _get_policy_path
    raise cfg.ConfigFilesNotFoundError((path,))
ConfigFilesNotFoundError: Failed to read some config files: policy.json

policyを見に行こうとするのだが、policyがないというのでいろいろ考えるものの動かない。 いろいろ調べた結果、これstable/junoじゃないのでは・・・

というわけで、devstackのstable/junoブランチのstackrcを見に行くと。

devstack/stackrc at stable/juno · openstack-dev/devstack · GitHub

# compute service
NOVA_REPO=${NOVA_REPO:-${GIT_BASE}/openstack/nova.git}
NOVA_BRANCH=${NOVA_BRANCH:-stable/juno}

# data processing service
SAHARA_REPO=${SAHARA_REPO:-${GIT_BASE}/openstack/sahara.git}
SAHARA_BRANCH=${SAHARA_BRANCH:-master}

# object storage service
SWIFT_REPO=${SWIFT_REPO:-${GIT_BASE}/openstack/swift.git}
SWIFT_BRANCH=${SWIFT_BRANCH:-stable/juno}

なんでmaster見に行ってんの・・・ねえ・・・ stable/junoって言ったじゃないの・・・

というわけで、Saharaのブランチをlocal.confでstable/junoに切り替え。 ついでにさっきmasterにしたrequirementsの設定は削除

SAHARA_BRANCH=${SAHARA_BRANCH:-stable/juno}

これで無事にSaharaが動いてInternal Server Errorをもらうこともなくなりました。

結論

  • 2014/12/08 33時段階でのDevStack(stable/juno)のHorizonは動かない環境がある。
  • gettextがない場合は入れる。
  • 2014/12/08 35時段階でのDevStack(stable/juno)のSaharaはデフォルトでは動かない。
  • DevStackでstable/juno版のSaharaを動かすときはlocal.confにSaharaのブランチにstable/junoを指定する
  • local.confは以下のとおり
# Enable Sahara
SAHARA_BRANCH=${SAHARA_BRANCH:-stable/juno}
enable_service sahara

おまけ

gettextがない件と、DevStackのstable/juno版のSaharaがstable/junoを使っていない件をプルリクエストにして投げたら速攻クローズされた。 理由はgerrit使えだそうです。 これからgerritの設定して再度修正投げます。。。

jujuでmachineの削除ができなくて

諸事情でMAAS/jujuの素振りをしていて色々言いたくなったので書き込み。

MAASは結構いいかなと思うもののjujuとjuju-guiがかなりの困りもの。

VirtualBox上で素振りしているこっちが悪いのかもしれないが、ちょっとうまく行かなかったのでVMを消して最初からためそうとおもったところ、jujuに登録されているmachineが消えない。

コマンドを確認してもdestroy-machineの文字があるが消えない。 --forceオプションを使っても消えない。

消えないからまた最初から試そうと思ったらVMレベルで作り直しが求められる。

そしてjuju-guiを使うとなんの手違いなのか存在していないmachineを勝手に作られ、また消えない。

結果、juju statをするとゴミ情報が残って見難い。

なにか方法はないのかと思ってぐぐってみたらこんなのが

juju - How do I clean up machines in a dying state? - Ask Ubuntu

環境ごと消すしかないんか!

というわけで、jujuとjuju-guiがイケてない・・・

#RubyHiroba 2014でLTしてきました

最近プライベートは育児で忙しいので、RubyKaigiには残念ながら参加できなかったものの、RubyHirobaに参加してきた。

多分Ruby系のイベント参加は去年のRubyKaigiとHiroba以来なので懐かしい感じがした。

今回は生活発表とLTthonを見ようかなーと思っていたのだが、最近ネタが出来たのでLTthonの会場でLT資料を作り始める。 資料ができて飛び込み参加が間に合えば発表しようと思ったら、昼休憩の間に資料ができたので飛び入り参加してきた。

発表時間が5分だと思ったら飛び込みが多かったので、発表時間が3分になったからいろいろ端折って喋ったのでここで解説しておく。

Rubyアソシエーション

http://www.ruby.or.jp/ja/

Rubyアソシエーションは、プログラミング言語Rubyの普及と発展のための組織、 理事長にMatz(ゆきひろが漢字になってる)、理事に笹田さんなどがいる。 開発支援や、コミュニティ支援、情報発信、Ruby技術者認定試験、事業者認定などを行っている。

Rubyアソシエーション認定システムインテグレータ

http://www.ruby.or.jp/ja/certification/sier/

Rubyの高い技術を持った企業としてRubyアソシエーションのWebサイトにて紹介される。

認定の条件としてSilverでは5名以上のRuby Association Certified Ruby Programmer Silver又はGold資格保持者が正社員として所属していること。

Goldでは5名以上のRuby Association Certified Ruby Programmer Gold資格保持者が正社員として所属していること。

突然現れたRuby案件のヘルプ

当初サポートは2週間という話だったのだが、いつのまにやら2ヶ月になり更に延期になりそうだったが撤収を命じられる。 自分が撤収してしばらくして案件は消滅。

サポート体制について

保守的な組織にありがちな「〜が起きたらどうするんだ!」の典型的なパターン。

社内でRubyの技術サポートは行っていないため、プロジェクトからRubyのサポートを依頼されたら対応できないから、サポート体制を作ってからにしてもらいたいと言われたらしいが、多分サポート体制は向こう3年はできないだろうなーと思ったので、偉い人に相談して別ルートから攻略した次第。

登録手続き

言い出しっぺが異動で逃亡した結果、自分にお鉢が回ってきて、大きな企業にはあると言われている、書類を通すためのスタンプラリーをするはめに。多分自分と他に偉い人3名ほど巻き込んだことから5~6人日ぐらいの稼働は費やされていると思う。

社内周知

Rubyアソシエーションのサイトに載ってお客さんからRubyの話が来たらどうするの!?」という謎な声(むしろ仕事が来たんだから喜べよ)に答えて社内周知をすることになり、ここでもスタンプラリーがはじまり4~5人日ぐらいの稼働をついやして辛み。

結果として、メールは3件来たけど1件は当初のサポート体制の話で、2件有望な若手Rubyistからのメールだったので後者が得られたのが個人的な救い。

ちなみに、Rubyアソシエーション認定システムインテグレータに登録してから1件も営業はおろか、お客様からの反応を聞いたことがないので、最初の心配は杞憂だったんじゃないかと思ってる。

ちなみに最初に相談した少し偉い人たちとの間では「話が来てから考えよう」ということにしている。

社内にいた若手Rubyist

社内にRuby案件なんてないけど自分で勉強してたというエライ若者たち。(そのうち1名はまさかのRubyHirobaに来ていたw)

これは腐る前に保護せねばということで、速攻でランチミーティングをして、社内に生息する数少ない手を動かすエンジニアの勉強会を紹介したり、社外の勉強会、コミュニティを紹介して、Rubyを使った開発案件の話がきたら紹介、推薦することを約束した。


というわけで、Rubyアソシエーション認定システムインテグレータに登録してみた結果、社外よりも社内の方に影響があった。 それも若手のRubyistたちが腐る前に保護できたのが思いもよらない成果だったという発表をしたつもり。

しかしながら、社内で腐る前に救うより、社外に逃す道を示しても良いんじゃないかと今でも少し悩む事がある。 でも、この後彼らが社内外のコミュニティやエンジニアとの交流を通してそこは自分で判断をすると信じて今はよしとしておく。

もしあの会場や、今回公開しておいた資料を見たSIerに勤務しているRubyistの方は、Rubyアソシエーション認定システムインテグレータに登録してみると、社内外で何らかの変化があるかもしれないので、ちょっとおすすめしてみたい。

久しぶりにRubyのイベントに参加でき、更に発表までできて楽しかった。

開催・運営をしていただいたスタッフの皆様、また、場所を提供していただいたCyberAgentの皆様に心より感謝致します。

ServerspecでXMLファイルの中身をテストするために少しテストをイジってみた

最近はChefとかAnsibleで構築を自動化する際に Serverspec で試験することも多くなってきたけれど、ServerspecだとXMLのテストがしにくい。

 

リソースタイプに'file'があるが、 containでは評価が正規表現なので通常のファイルの中身を見る文には便利。

 

describe file('/etc/httpd/conf/httpd.conf') do

its(:content){ should match /ServerName www.example.jp/ }

end

 

しかしXML形式だとタグの中の複数の値(nameとvalueとか)を見なければいけないとなると、スペースとかが入ってきてやたら長大な正規表現を書くことになりそうで、いまひとつしっくりこない。

 

<property>
        <name>dfs.block.access.token.enable</name>
<value>true</value> <description> If "true", access tokens are used as capabilities for accessing datanodes. If "false", no access tokens are checked on accessing datanodes. </description> </property>

 

 

というわけで、なんとなくしっくり来る方法はないかと試行錯誤をしたところこんな形になった。

 

Serverspec to xml file

 

'file'リソースタイプのsubjectがファイルの本体のオブジェクトのようだったので、その中身をnokogiriに喰わせて、タグでまとめられるようにしてみた。

そして、今回はプロパティの中身をチェックしたかったのでプロパティごとに名前でヒットさせてその値をテストするようにしてみた。

 

content + 正規表現よりは読みやすいかと思うのでひとまずはこういう形にしている。

しかし、なんかもっといい方法はないんもんだろうか。。。

 

Herokuでの文字化けを直してみた

FluentdのPluginを書こうかなと思って公式HPのプラグイン作成を解説しているページを見たところ、サンプルコード内の日本語が文字化けしてた。

 

プラグインを書く | Fluentd(現在はPR出して修正済み)

 

どうも調べてみると、Herokuの上でCodeRayを使うと文字化けしてしまうらしい。

 

Herokuにデプロイすると、CodeRayでソースコードの日本語が文字化けする - SKKTM Lab Blog

 

ぐぐってみても日本語で直し方を書いてる人がいなかったので、調べて直してみたのでそのメモ。

 

ちなみに先に結論だけ述べておくと

  1. .buildpacksにRubyとlibxml2のbuildpackのURLを記載
  2. Gemfile.lockのnokogiriを1.6以上にする
  3. HerokuのConfigにBUILDPACK_URLにheroku-buildpack-multiを指定
  4. デプロイ

やり方はPRを見ていただければ何となくわかると思う。

update libxml2 and nokogiri to fix japanese comment rendering on heroku by Mahito · Pull Request #119 · fluent/fluentd-docs · GitHub

 

で、調べてから結論に至るまでは以下のとおり。

 

  1. CodeRayのソースコードを読む

    coderay/lib/coderay at master · rubychan/coderay · GitHub

    しかしどうもCodeRayが原因じゃないので別の原因を調べてみる

  2. rack-codehighligherを調べる

    wbzyl/rack-codehighlighter · GitHub

    fluentd-docの中でCoderayが直接呼ばれてるような形跡がなかったので調べてみたところ、rack-codehighligerが関係していたので、Mac上のローカル環境でデバッグするも再現しないのでHeroku上でデバッグ
    すごい時間がかかったがどうやら中でNokogiriがパースしてるところで文字化けが起きてる模様

    https://github.com/wbzyl/rack-codehighlighter/blob/64bf50520cb1d563432832ae30d85bbd94cec5bd/lib/rack/codehighlighter.rb#L40

  3. Nokogiriとlibxml2を調べる
    Nokogiriのバグっぽいということで追いかけていったが最終的にlibxml2に渡して帰ってきたらバグってることまでは突き止めたので同じ事例がないか調べてみたところこちらでヒット

    ruby on rails - Nokogiri adds characters during parsing on Heroku - Stack Overflow

    原因はHerokuのlibxml2がバグのあるバージョンを使っていることらしい。

  4. Nokogiriのバージョンを上げる
    Fluentd-docはNokogiriの1.5が使われていたが、1.6にするとNokogiriのインストール時にlibxml2を独自にビルドして使うことができるようになったのでbundle update nokogiriをして解決!
    ・・・と思ったらHeroku上でlibxml2がビルドされた形跡がなく問題解決に至らず

  5. buildpackでlibxml2をバージョンアップ
    buildpackをつかえばlibxml2のバージョンがあげられるということでやってみた。
    ・・・アプリが動かなくなったのでこれもボツ

  6. heroku-buidpack-multiを利用してRubyとlibxml2を導入してnokogiriをバージョンアップ
    PaaSといえば個人的にはこの人ということで@jacopenさんに相談したところ、libxml2を入れただけだとRubyが動かないのでbuildpack-multiでRubyとlibxml2を入れないとダメと教えていただいたのでその通りやってみたらようやくサンプルコードの日本語の文字化けが治った。

というわけで、1日ぐらいかかったけど問題も無事に解決できてPRをだしてマージ してもらって問題解決に貢献できた。

そしてこれを記事にしておいたので今後ググればこの記事がヒットして問題解決につながればと思う次第。

 

Herokuさんlibxml2のバージョン上げませんかね・・・?