セキュリティ・キャンプ2016 応募用紙

どうも、馬です。

なんか2017年セキュリティ・キャンプ全国大会の募集が始まった事により、

www.ipa.go.jp

 

去年以前にセキュリティ・キャンプに行った人の応募用紙がまとめられてるスプレッドシートができる事態になっています。

 

というわけで、僕も流れ的に晒して、スプレッドシートに載ろうと思います。

 

ただし一つ注意点。

晒してるみなさんはプロの人達ばっかで、それに比べて僕の応募用紙はみすぼらしいものとなっています。他の方と比較されると、どうしても劣って見えるかと思いますが、その点ご容赦ください。

 

問題文

https://www.ipa.go.jp/files/000053055.pdf

 

 

共通問題 【1-1】:https://063.jp/location2/  (今は動かしてない)
今いる場所から近い順に駅を表示するアプリを作りました。GPS情報が変わることをトリガーに情報を更新しているので、移動している時に、リアルタイムに一番近い駅を出せます。また、最寄り地点リストは、線路情報から、一番近い線路を出すことができます。このアプリにより、今どの路線に乗っていて、次の駅まで何mくらいあって、周辺の鉄道はどんな路線があるのかなどが簡単にわかるようになりました。
技術的な自慢としては、駅情報は約3万件、線路地点情報は約100万件のデータベースの検索を、一般的な土地では1秒以内に終わらせられるようにチューニングした点です。
また、googlemapへの表示も、なめらかにカーブが表示されるように工夫しています。

共通問題 【1-2】:サーバー側はPHP7でAPIが動いています。このAPIにリクエストを送ると、APIは駅情報などを保存しているMySQLに対してクエリを発行し、帰ってきたデータをJSON形式でクライアントに返します。
クライアント側はReact.jsで書かれています。また、表示をきれいにするために、bootstrapも用いています。

共通問題 【1-3】:組み終わったあとにブログ記事を書きました。
http://goryudyuma.hatenablog.jp/entry/2016/02/05/225848

共通問題 【2-1】:データベースの正規化がよくわからなかった。具体的には、正規化する目的、正規化するにはどうすればよいのか、正規化のメリットデメリットなど。
共通問題 【2-2】:ネットの記事を読み漁った。書籍では「理論から学ぶデータベース実践入門(奥野幹也)」を読んだ。また、実際に正規化を試してみたりした。
共通問題 【2-3】:正規化する目的は、同じデータを同じカラムにデータそのもののまま入れることを防ぐことにある。一つのデータを更新したい時に、データがそのまま入っている状態だと、そのデータと同じものをすべて更新しないといけない。しかし、そのデータそのものが入っているところにリンクとして入れておき、データそのものは別のところで持っておくことで、更新は一回ですむ。正規化する基準としては、同じデータが複数同じカラムに入っていて、更新がかかる可能性があるとき。メリットとしては更新時に一回のみ更新すれば良くなること、デメリットとしてはテーブルが増えてしまうので、きちんとドキュメント化しておかなければ管理できないほどテーブルが増えてしまうこと。
共通問題 【3-1】:5-A サーバー運用におけるパスワード管理
普段、自分はVPSを運用している。その上で動いているサービスや、他のところで動いているサービスには、パスワード認証が使われている物が多い。これからさらに自分が扱うサーバーの数は増えていくことが予想され、扱うパスワードも増えるであろう。まさにこの講義でパスワード管理の問題点と対処法を学び、自分の力としたい。

2-C 人工知能セキュリティ
詳細にも述べられている通り、人工知能に関するセキュリティと言われてもなにも思い浮かばないので、とても惹かれた。人工知能機械学習は様々な分野で使われており、自分も興味がある。確実に自分の知らないことを講義してくださると思うので、楽しみにしている。

3-A Webアプリケーションの脆弱性の評価と発見
Webアプリケーションを運用する上で、脆弱性は特にあってはいけないものだ。自分で作るときは自分で分かる範囲では対策するが、自分が知らない脆弱性については対処しようがない。個人レベルでしか脆弱性があるかチェックできないので、本講義を通して、より実践的な脆弱性の発見の手法を身につけ、今動いているWebアプリケーションや今後作るWebアプリケーションにおいて、脆弱性を発見して理解し、対処していきたい。

共通問題 【3-2】:今まで、自分はセキュリティに対して一種の恐怖感を持っており、例えばアプリケーションを作る際、できるだけ個人情報となりうるものは保存しないように徹底していた。個人情報を持ちたくないがために、作りたいと思ったアプリケーションの仕様そのものを変えたこともあるくらいである。自分程度が組むアプリケーションなら、脆弱性など有って当然だと思っていた。もし流出したら・・・と考えると、どうしても保守的な考え方になってしまっていた。しかし、そろそろわがままも言えない状態になってきていて、個人情報の保存に手を出さざるを得なくなりそうだ。もし可能ならば、セキュリティキャンプに参加し、セキュリティ脆弱性について知識をつけ、自信を持った上で今後のサーバー運用やアプリケーションの開発に挑みたい。
選択問題 【1】:
選択問題 【2】:
選択問題 【3】:
選択問題 【4】:プログラム(C++)

-----------


#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>

#define DEBUG 0

struct FRH {
        char Magic[3];
        char Source[21]; /* null(‘\0’) terminated ascii strings */
        char Destination[21]; /* null(‘\0’) terminated ascii strings*/
        uint32_t DataLength; /* min 0, max 4,294,967,295 */
        char *Data; /* null(‘\0’) terminated ascii strings */
};

//デバッグ用の出力関数
void show(FRH now) {
        std::cout << "Magic       :" << now.Magic << std::endl;
        std::cout << "Source      :" << now.Source << std::endl;
        std::cout << "Destination :" << now.Destination << std::endl;
        std::cout << "DataLength  :" << now.DataLength << std::endl;
        std::cout << "Data        :" << now.Data << std::endl;
        std::cout << std::endl;
}

//条件1のチェック
bool checkCondition1(FRH now) {
        if (now.Magic[0] == 'R' && now.Magic[1] == 'H') {
                return true;
        } else {
                return false;
        }
}

//条件2のチェック
bool checkCondition2(FRH now) {
        std::string S = now.Source;
        transform(S.begin(), S.end(), S.begin(), ::tolower);
        if (S == "rise-san" || S == "cocoa-san") {
                return true;
        } else {
                return false;
        }
}

//条件3のチェック
bool checkCondition3(FRH now) {
        std::string D = now.Destination;
        transform(D.begin(), D.end(), D.begin(), ::tolower);
        if (D == "chino-chan" || D == "chino") {
                return true;
        } else {
                return false;
        }
}

//条件4のチェック
bool checkCondition4(FRH now) {
        std::string S = now.Source;
        std::string D = now.Destination;
        transform(S.begin(), S.end(), S.begin(), ::tolower);
        transform(D.begin(), D.end(), D.begin(), ::tolower);
        if (!(S == "cocoa-san" && D == "chino")) {
                return true;
        } else {
                return false;
        }
}

//条件5のチェック
bool checkCondition5(FRH now) {
        std::string data = now.Data;
        if ( ( int)data.find("BlueMountain") != -1 ||
                        (int)data.find("Columbia") != -1 ||
                        (int)data.find("OriginalBlend") != -1) {
                return true;
        } else {
                return false;
        }
}

//条件6のチェック
bool checkCondition6(FRH now) {
        std::string data = now.Data;
        if ( (int)data.find("DandySoda") == -1 &&
                        (int)data.find("FrozenEvergreen") == -1) {
                return true;
        } else {
                return false;
        }
}

int main() {
        //ファイルとして開く
        std::ifstream fin("pyonpyon.rh", std::ios::in | std::ios::binary);
        if (!fin){
                std::cout << "ファイルが開けません" << std::endl;
                return 1;
        }

        FRH now;

        //順番に処理する
        while(fin.readsome(now.Magic, 2)) {
                fin.readsome(now.Source, 20);
                fin.readsome(now.Destination, 20);

                //4byte読み込んでuint32_tに変換する
                now.DataLength = 0;
                char x[4];
                fin.readsome(x, 4);
                now.DataLength = 0;
                for (int i = 0; i < 4; i++) {
                        now.DataLength <<= 8;
                        now.DataLength += x[i];
                }

                //文字数+1だけメモリを確保する
                now.Data = new char[now.DataLength + 1];
                fin.readsome(now.Data, now.DataLength);

                //flagが一度でもfalseになればREJECTED、ならなければPASS
                bool passflag = true;
                if(passflag && !checkCondition1(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition2(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition3(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition4(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition5(now)){
                        passflag = false;
                }
                if(passflag && !checkCondition6(now)){
                        passflag = false;
                }

                if(passflag) {
                        std::cout << "PASS" << std::endl;
                } else {
                        std::cout << "REJECTED" << std::endl;
                }


                if(DEBUG) {
                        show(now);
                }

                delete now.Data;
        }
}

-----------

以上プログラム

実行結果

-----------

PASS
PASS
REJECTED
PASS
REJECTED
PASS
PASS
REJECTED
PASS
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED
PASS
REJECTED
PASS
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED
REJECTED

-----------

以上実行結果

選択問題 【5】:OSとは、ハードウェア(物理的なもの)を操作する仮想的なインターフェースだ、と考えています。汎用OSでは、さまざまなメーカーが製造する部品の合作である現在のコンピューターを、共通のインターフェースで操作できるようにしようとしたものであり、逆に組込みシステムは、自分の会社の製品に特化して無駄な機能は取り除き、必要な機能のみにすることで、メンテナンスしやすくしたり保存に必要になる容量を少なくしたり、コストを下げたりできます。しかし最近、一台のハードウェアに対応するOSは一つである必要性はないという考え方が主流になってきました。マルチブートで複数のOSを一台のハードウェアに入れて、好みや役割により使いたいインターフェースを選ぶなどもできます。また、動いているハードウェアに対応するOSの上に、仮想的にハードウェアを作り対応するOSを動かす、バーチャルマシンもできてきました。
OSがハードウェアを操作するので、OSそのものには様々な機能が備わっています。OSがCPUをどのように使うのかを決め、OSがメモリをどのように使うのかを決め、OSがマウスやキーボードをどのように使うのかを決めます。OSはコンピューターのすべてを操作する頭脳の役割を果たしています。

選択問題 【6】:IDとパスワードを入力して認証ということは、どこかにデータベースがあり、そこでSQLが使われていると考えました。そこで、SQLインジェクションに対するセキュリティテストを行います。SQLインジェクションがもし成功すると、データの改ざんから個人情報の取得まで、幅広くダメージが与える事が可能です。一度でも信頼を大きく失ったアプリケーションは、今後使われることはないでしょう。これはとても大きな損害で、実際に問題になっています。
セキュリティテストテストですが、まず、IDやパスワードの入力欄に、「'」(シングルクォート)や「`」(バッククォート)などを入れて送信します。もし入力文字列をエスケープせず、文字列結合によりSQLを生成している場合、ここで何かしらのエラーや予期せぬ結果が出ます。
つぎに、入力欄に、「%」(パーセント)や「_」(アンダーバー)などを入れて送信します。入力文字列に適切なエスケープがされていなければ、ワイルドカードとなるのでこちらも予期せぬ結果が出力されるでしょう。

選択問題 【7】:
選択問題 【8】:
選択問題 【9】:マイナンバーカードは、本人とマイナンバーを紐付ける大切なカードである。別人に送られてはいけない。自分なら、カードの申請時に住所に誤りがないかをチェックしてもらい、情報が確認取れ次第、本人限定受取で郵送されるというクレジットカードの送付と似たシステムにするだろう。郵送時の誤りは極力抑えられるとして、申請時に誤りが入りにくいようにしなければならない。マイナンバーカードが発行されるのは、マイナンバーが発行された後なので、発行したい人はすでにマイナンバーを手元に持っているはずである。よって申請時には、マイナンバーと、氏名年齢などの個人を特定できる情報を要求し、データが一致していた時に申請が通るようにする。ネット弱者にも配布できるように、市役所などの窓口でも申請はできるようにしなければならないが、これはこの申請手続きの代行である。
選択問題 【10】:
選択問題 【11】:

 

 

(メールそのままコピってきた)

 

以上です。自分でもなんで通ったかあんま分かってないし、その分今後に期待されてるのかなと勝手に思ってます。今後とも、精進いたします。

終結

この記事は、kstmアドベントカレンダー25日目(最終日)の記事として書かれました。

qiita.com

 

まずは、25日間、一日も落とすことなく終えることができました!お疲れ様でした!

この記事は、特に技術的にどーとか言う話はナシで、純粋な心でMerry Christmas!と祝いましょう。

ちょっと最初に、ツッコミどころとして残っている所だけ突っ込まさせてください。(これ片付けとかないとオチオチ新年も迎えられない)

 

ツッコミどころ

その一:みんな締切守りすぎ

え、どゆこと!?絶対「記事遅れました~テヘペロ」って人一人くらい出ると思ってたのに!ふつーに締め切り守るとか、外に公開されてるものだからって張り切りすぎでしょみんな!!後から多少の編集したものはあるものの、全日当日夜には記事が公開されてて、「やればできるやん・・・」って思いました。

その二:続きがあると思わせぶりなタイトルの記事

「前半」「その1」とかタイトルに入ってたり、

 タイトルに(技術編)とか付けてしまったので誰か別のも書いてくれると嬉しいなー。

強いkstm部員になるために(技術編) - bgpatのブログ

とか。早く続きが読みたいです!

 

kstmの活動

さて、アドベントカレンダーでだいたいkstmの雰囲気とかわかってもらえたと思います。そうです、kstmとは飲みサーです!

・・・って冗談で言ってますけど、実際そう言っても間違いではないです。もちろん未成年や飲みたくない者に飲ませることはしないですし、節度を持って飲みますけど、それは置いといて。"全員で"何かを成し遂げるってことは少なくて、その場にいたメンバーで「やろうぜ!」って声かけあって、コンテストに参加したりしています。または個人で勝手にやって、記録だけkstmに置いていくとか、最近は多いです。なので、「kstmの"みんな"は普段どんなことしてるの?」って聞かれると、「飲み会です」と答えざるを得ないのです・・・。

 

( 追記:上のことを書いておいたものの、後から検索してみても「kstmは飲みサー」とはアドベントカレンダーのどこにも書いてなかった・・・!誰か一言くらい触れてると思ってたのに・・・!

追記終わり )

 

それはさておき、kstmではコンテストや勉強会などに積極的に参加しています。一例として、去年度の活動記録を貼っておきます。

f:id:Goryudyuma:20161224234411p:plain

(kstmメンバーがコンテストや勉強会に参加する時に、kstmの名前で参加した他に、個人で参加して後からkstmの活動としてこのリストに入れたものがあります。)

今年度はさらに、ICTSCやISUCONなどで、参加しただけにとどまらず結果も残るようになってきました。先輩たちから受け継いできたゆるい雰囲気を維持しながらやるときはやる、っていういいサークルに更に磨きがかかってきたと思います。

 

メンバー募集

最後くらいダラダラ書いても仕方ないので、言いたいこと言ってしまいます。

kstmでは、メンバーを募集しています。信州大学生で、このアドベントカレンダーを見て興味を持った、活動に参加してみたくなったら、是非サークルメンバーにコンタクトしてください!見学だけでも大歓迎です!

 

来年のアドベントカレンダー

来年のことを言うと鬼が笑うと言いますが、笑って過ごせるクリスマスなんていいではありませんか。来年、やるとしたら、今回参加できなかったメンバーや、kstmに関わりのある人なんかを呼んで、もっと盛大に開催できればいいなーと思います。目標はメンバーの被りなし!ってことで、よろしくね、アドベントカレンダー総責任者のugwisくん!(丸投げ)

 

締め

これにて2016年度kstmアドベントカレンダー、終結です。

メリークリスマス!

それと、良いお年を!

来年もよろしく&がんばりましょう!!!

GitHub緑化運動のすゝめ

この記事は、kstmアドベントカレンダー二日目の記事として書かれました。

qiita.com

 

とりあえずまずはこれを見てくれ。

f:id:Goryudyuma:20161201182707p:plain

Goryudyuma (Goryudyuma) · GitHub

 

緑化運動してるとなんか凄そう(に見える)!

 

やり方

  1. GitHubのアカウントを用意します。
  2. 毎日contributeします。
  3. できた!

ルール

自分なりのルールを定めます。できるだけ(自分が納得できる範囲で)低めに設定しとくと長続きします。

例えば僕は、競技プログラミングで簡単な問題を一問だけ解いてcommitってのはありにしてますが、条件として言語はC++以外ってのを定めています。なぜならC++競技プログラミングは慣れてて、簡単な問題だとあまり意味が無いからです。最近はJavaで書いてますが、その前はGolangOcamlで出してた時期もありました。いろんな言語の標準入出力や、簡単なデータ構造の書き方を学ぶことができます。

メリット

・毎日何かしらのコードを書く必要ができる

「継続は力なりぃぃぃ!」を地で行く感じです。

あと、どーしても進捗出したい物があるときに、毎日コードを書く習慣が付いていると一気に楽になります(個人差あり)。

・三日坊主の克服

何を隠そう僕は三日坊主どころか、一日坊主です。「やるぞ!」って思ったら一気に始めて、やる気なくなるまでやって、燃え尽きて終わるってパターンをずっとやってきました。ですが、継続して何かをするということを覚えないと、この先やっていけないと思いました。

今一年半弱緑化運動が続いているこれを見て、僕が三日坊主だと思う人はいないでしょう。完全に克服したとは言えないと思いますけど、ある程度克服したとは言えると思います。

・アピールできる

 他人に自分のGitHubを晒すのに抵抗が全くなくなりました。以前は「大したものを公開していない僕のアカウントなんて・・・」って感じで、あんまり晒したくなかったのですが、今は大したものを公開していないことは変わっていないのに普通に晒せるようになりました。

デメリット

・ダレる。

しょーもないコミットが増えます。同じ緑化運動をしてる人で、毎日ちゃんとした内容で出してる人もいますが、僕にはそんな能力はないので、簡単な競技プログラミングの問題一問だけみたいな日が結構あります。

これだとそんなに意味がないので、なんとかしたいのですが、それ以上にハードル上げて一日でも緑化できない日を作っちゃうと、その後も怠けるのが目に見えてるので、ハードルは低めに設定しています。

・毎日githubにアクセスする必要がある。

ユニコーン出てたりすると辛くなったりします。

あと、旅行などにもパソコンを置いていくっていう選択肢は無くなりました。一泊二日の旅行で、一日目の早朝と二日目帰ってきてから夜にやるってのを一度やりましたけど、二日目何かの事故で帰れなかったら詰むと判明した(それはそう)ので、日帰り旅行以外は持って行くことに・・・。

終わりに

僕がここまでやれてるのは、緑化運動している先輩の存在が大きいです。自分と同じような時間割で動いているような人ができてたなら自分もできるだろうって考えてます。少なくとも院卒業までは。社会人になったら、どこまで忙しくなるかわからないので、とりあえず学生のうちは続けようと思っています。

kstmメンバーなら誰でもできると思うので、誰か同志になってくれないかなー?

codefestival2016 参戦記

予選Cでぎっりぎりで通ったので、Finalにいってきた。去年に引き続き二回目。

 


11/26朝。
起きる予定時刻から40分寝坊。
僕「まあ時間余裕を持ってるしね、ちゃんと間に合う新幹線あるの知ってる。」

 

駅につく。
僕「指定席満席・・・?かがやきやから自由席もない・・・?一本あとだと間に合わない・・・?」

 

よし。
僕「グリーン車課金・・・しかたない・・・」

 

というわけで、行きは仕方なく、贅沢にもグリーン車で東京まで行きました。
車内はめっちゃ静かに感じた。椅子も電動で倒れるし、ああこれが上流階級の人たちが味わってる世界か~って思いながら、ウトウトしてた。
新橋ついて、会場まで徒歩。電通本社ビル前通って、ここが例の・・・!ってなった。

会場ついて、交通費精算で、グリーン車の旨伝えると、指定席分は出してもらえるとのこと。差額は自腹。まあ仕方ない、けどよかった。


Final開始。
パーカー取るためには、A~Dまでを完答とEかHの部分点を取れば良いことが配点からわかっていたので、まずはEを読む。
わからん。
全然頭のなかに問題が入ってこなくていたずらに時間だけが過ぎた。
仕方ないのでパーカー諦めてAから開始。
Aはやるだけ。
Bは適当にやったらWAで、もう無理~ってなった。飛ばしてCへ。
CはN+M要素を持つUnionFindして、N人が同じグループに属するかどうかだけを判定すればいいってことがすぐにわかったので実装、AC。
Dは問題はすぐに理解できたけど、よくわからなかった。適当に書いてWA。無駄にかけ2わる2してるところがあって、そこが悪さしてそうだったので考察し直したらAC。
E問題に戻って神のお告げ、「DPを使うのじゃ」ってのに閃いて、実装すれば部分点獲得。パーカー確保。

 

目標達成によりやる気は0に。gdgdタイムライン見て過ごす。

 

いろはちゃんに「観戦してばっかじゃだめ!」って言われたので、

 

B問題通してきた。

 


2000点取ってフィニッシュ。

そのあとの表彰式も、touristすげーってなりながら聞いてた。

午後は適当に回ってた。chokudai先生の解説聞いて、ご飯食べて、秋葉先生のトークライブ聞いて、エキシビジョン。
海外勢がめっちゃタイピング早くてびっくりしながら見ていた。

ってな感じで一日目終わり。今回はホテルみんなばらばらで、僕に割り当てられたホテルは少し遠目のところだった。ここだけは今回のコドフェス、去年との比較で唯一の改悪かな~。まあ200人以上を同じホテルにとか、普通は無理なんだけど、交流を増やすという意味で近いほうが良かったな~と。
スタンプラリーなくしたことにより、いっぱい回らなきゃって脅迫概念みたいなのがなくなって、まったりゆっくりコンテンツ見れたし、海外勢入れたこともすごく良かったと思う。

 

ホテルついてからぼーっとテレビ見てた。「とげ」ってドラマやってて、最終回だったんだけど、めっちゃ超展開な気がした。最初から見てるとフラグとかちゃんとあったのかなー。
ひさびさにドラマ見た気がする。それで寝た。

二日目(11/27)、8時集合だと思って6時半に起きて準備してついたのが7時45分、ついてから開場が8時だと知る。
しばらく待って会場入りして、トーナメント戦開始。

round1、A問題全然わからなかった。でも適当に書いた。案の定WA。
時間も短くてめっちゃ焦ってた。仕方なくB開けてみて、「これ全探索で出せば部分点貰えそう」って思った。
この手の問題はPHPで書くほうが楽そうだったのでPHPで書いた。提出は終了20秒前。
そこからひたすらテストケースTLEになってたので、結果が出るのが終了して他のグループの通過者の発表が終わったあとだった。
200点部分点もらって3位通過。まさか通るとは思ってなかった。

round2、round1で早解きが有利とわかったので、ひたすら早解きする。
Aは1足して2で割るだけで200点。2分弱で通す。
Bはとりあえず回せば200点。400点確保で2位通過。

round3、さすがにもう残るのは無理そうって思いながらとりあえずやってみる。
A、とりあえずDPで行けそうとわかるものの、まずCEが消えず。
あとから見ると、size_tの扱いがVC++gccで違うんだねーって話だった。ちくしょう。
そのあとWAが続く。考察何回かし直して、100点を取る。
B行く時間はなかった。
というわけで、round3は5位でした。残念。

そのあとはご飯食べてLT聞いてた。山の話ときゅうり先生の話とchokudai先生の話、どれもおもしろかった。

UFOキャッチャーでセンスのなさを周りに見せて、お情けで手ぬぐいをもらった。

そして最後のイベント、チーム対抗リレー。去年と同様、レッドブルが配られるので、開始前に飲んで気合い入れた。僕はF問題を担当した。
最初に嘘考察して、 @ki6o4 さんに反例だされて、それ含めて考察、書いたら一発で通った。
自分の担当問題通したあとは他の人の考察手伝う(見てるだけ)みたいなことしてた。みなさん頭良すぎでは・・・ってずっと思ってた。

結果発表と表彰式があって、終わって、自宅に帰った。
新幹線の指定席が何故か26日で取られてて(多分伝達ミス。確認する間がなかったから確認怠ってしまった・・・)、指定席書い直す羽目になったり、新幹線が珍しく遅れたりと、無駄に不幸が続いたけど、なんとか帰宅。

家に帰ってからエキシビジョンのB問題通した。一個だけ通らなくて辛かったけど、よくわからない不正っぽいことして通した。

 

基本はTLに流れてた考察通りやれば行けた。プロ各位に感謝。

 

これで終わり。めっちゃ楽しかった!


来年もがんばって、Finalいっくぞ~~!!

ISUCON6で学生一位取ってきた

2016/10/28 10:37 追記

ふぉのさんが上げてくれたのでリンク 

ISUCON6で学生枠1位取れた時の話.md · GitHub

2016/10/28 10:50 追記

あーちゃんも上げてくれてたものの気づかなかった・・・

リンク。

bgpat.hateblo.jp

 

※やったら長文なので、最後まで読まなくても大丈夫、暇な人だけ読んでね。書いてるうちに長文になっちゃったテヘ

去年と同じく予選の様子から書きまーす。

一応去年の貼っとくね。

 

goryudyuma.hatenablog.jp

 

さて、今年も去年と同じくチーム名はkstm、チームメンバーは去年と変わらず僕とあーちゃん(@bgpat_)とふぉのさん(@fono09)の三人で出た。事前に決めたチーム構成は僕がDB、あーちゃんがアプリケーション、ふぉのさんがインフラって感じ。かなりバランスの良いチームだと僕は思っている。

言語は去年に引き続きGolang。何もしなくても速いってのと、去年予選突破した言語だし、使いやすくて速くて、並列も書きやすくてなにより速いってことが特徴の言語だ。クロスコンパイルとか他にも特徴があるけど、ISUCONではあまり関係ないので割愛。Golangはいいぞ。

チャットにはSlackを、タスク管理にはTrelloを使った。チームメンバー全員が所属するものづくりサークルkstmでの今の主な手段がこのSlackで、使い慣れている事が大きい。主に参考ページのURL共有とかに使う。Trelloはとても使いやすい。普通はタグ付けとかして使っていくんだろうけど、僕たちは「umaの仕事」「bgpatの仕事」「fonoの仕事」ってリストを作って、そこにぽんぽん仕事を入れていく感じで使った。Slackと連携していて、Trelloでなにかアクションすると、Slackにも通知が行くので、Trelloを常に見ている必要はないようにした。

 

 

ああ、重要なこと忘れてた、エディタはVimです。

 

予選までにしたことは、主にpixivISUCONで遊んだ練習したことです。INDEX貼ってないテーブルがあって点数伸びて楽しかった。

 

予選はまず、ふぉのさんの遅刻から始まった。彼のマイクロソフトアカウントで登録していたので、彼が来ないことには始まらない。まあよくあることだ・・・とは言え、どーしようもないので緊急事態としてアカウントのユーザー名とパスワードを送ってもらう。もらったあーちゃんがインスタンス建ててスタート。

コード読んでるあいだにふぉのさん到着。大体読み終わったら方針を考える。あーちゃんが一言。「DB消しましょう」・・・僕の仕事が無くなった瞬間だった。

DBを消すって、起動すらしないって方針もあるけど、僕たちはデータベースは一応動かすが、必要なデータはメモリから取って、ユーザーから送られてきたデータはメモリとDBに格納、それで再起動時はデータベースからデータを全部読み込んでメモリに格納する方針。INDEX貼ったような貼ってないようなって感じだけで、それ以外は特にいじらず、あーちゃんが実装していく横で効率的なデータ構造(基本的にはmapだけど、何をキーとするかで効率がだいぶ変わる)考えて口出してた。

あとISUDAとISTARの統合はほぼ僕がやった。無駄に通信してたので、消すに限る。仕事無くなったので恵んでもらった感じだ。ありがたや。

で、今回のターニングポイント、htmlifyをどーするかだけど、とりあえずGolang正規表現は超絶遅いってことは有名な事実なので消す方針、replaceだけでなんとかやるって感じにしようとした。だけどただreplaceを順番に適応させていくと、一度変換したものに対してさらにリンクを貼ろうとするので全然ダメ。というわけで、@はあらかじめ@@に変えた上で、一つの単語を@(id)という風に変換して、あとでリンクに変換するようにした。この辺はほぼあーちゃん考案・実装。これが決め手となった。

ふぉのさんはnginxの設定書いたり色んなとこ見て回ったあとは白ご飯炊いてお茶淹れて鯖缶あけてくれてみんなで食べた。インフラ班はこの辺の面倒までみて大変だなと思いました(小並感)。

再起動試験をしっかりとやって終了。ちょっと不安ではあったものの、これ以上どうしようもない。

 ああ、今年は落ちたかなーと話しながら終わった。

 で、ちょっと経ってから合格通知。予選学生10位(社会人枠に一枠食い込んでくれたので、9位だけど10位)でギリギリ。今年も渋谷行ける~~って喜んだ。

 アルゴリズム、競プロでいろんなものに触れてきたつもりだったけど、アホコラは知らなかった。知ってても使えたかどうかは不明だけど、ちょっと悔しい。strings.Replacerは一度使ったことあったのに、本番中思い出せなくてこっちはマジで悔しい。

 

さて、続いて本戦。

まずは前日(今年も前日かよ!?って全く反省していない感じ)に、ISUCON5Finalの練習をした。あーちゃんがDocker-ComposeFileを作ってくれたので、それで(あーちゃんとんでもなく優秀)。

github.com

いつも使ってる鯖がトラブルで動かなくて、僕のwindowsにDocker建てて動かして見たけど、外からつながらなくて、仕方なくファイアーウォール切って(!!)やると繋がったので、三人でやっていました。この練習でもDocker-Compose使ったくらいには、僕たちはDockerに慣れていたので、本戦に活かせた感じです。

 

本戦当日。

 長野駅行ったらいたあーちゃんと一緒に蕎麦食った。予定時間に来ないふぉのさん。相変わらずだなーと思いながらも、僕はスーツケース持ってて、東京で電車乗り換えダッシュできない(したくない)状態だったので、とりあえず予定の電車で僕だけ先行、ふぉのさんとあーちゃんは次の新幹線で行くことになりました。で、渋谷。渋谷駅やたら広くなっててびっくりした。ああ、またヒカリエ来れた~~って喜んで会場入りした。ちょっと待って会場にてあーちゃんとふぉのさんと無事合流。レッドブル飲んでコンテスト開始!

最初の動画から「は?10万ユーザー同時接続?」ってなって、「これどーすんだ」ってなってました。予選の問題ははてなにちなんだ問題だったので、本戦はpixivかなーと大雑把には話してましたけど、まさかこんな形とは・・・って感じでした。コンテストが始まって、最初1時間位はデプロイできない問題にハマってました。会場全体が。運営大変だなーって話ながら、レギュレーション何回も読んでました。コア数を20から10に落としてつなげるようになったとのアナウンスがあり、もう一度デプロイ。これも失敗したけど、その次のデプロイで成功。まずとりあえずベンチ動かして、次にGolangに変えてまたベンチ。DBのインデックス確認とかしてみるも、どうにもおそそうなところが分からない。

静的ファイルあるので、とりあえずNginx入れようという話になったのと、Reactレンダリングを行うNode鯖もあるねって話、あと画像を予め生成しておいて静的ファイルとして配信したいなって話になりました。あーちゃんはJS大好きマンなので、Node鯖見たいと言い出し、ふぉのさんはいつも通りNginxを入れてイジる、じゃあ僕はというと、DBはいじれるところなさそうだしアプリケーションいじるかーってなりました。と言ってもほとんどいじれるところはなく、Strokeをメモリに載せる作業をしただけでした。あんまり劇的な効果があったようには見えなかったけど。それから静的ファイル生成するはいいんだけど、どのくらいの時間なら大丈夫か確かめようとしてSleep入れてみたけど、めっちゃ小さくしても、ベンチでタイムアウトしちゃってダメだなー、これ静的ファイル吐き出してる間にタイムアウトしそうだなーってなりました。あとはコード読んでる間に気づいたDBのインデックス、一個貼りました。それからMySQLが立ち上がっていなくてもGolangのアプリケーションは、MySQLが立ち上がるのを待つ設定を書いときました。再起動試験が重要なISUCONでは必須ですね。

他にチームとしてやったことは、Node鯖でTLS処理してたのが重そうだって、Nginxに処理させて、Node側からは抜いたりしました。それから、Golangのアプリケーションにインスタンス一つ、Nodeの処理にインスタンス一つ、MySQLの処理にインスタンス一つ、Nginxの処理にインスタンス一つ、一つのインスタンスは何もしない構成にしました。この2つが点数を伸ばした要因となったようです。あと、終了二時間前くらいから再起動試験を開始しました。その時点で学生一位取ってたのと、このあと急に点数伸ばせるとは思えなかったこと、去年みたいにFailしてしまうのはなんとしても避けたかったことが理由です。最初にrebootコマンド叩いていって、systemctl enable忘れで立ち上がってこないアプリケーションがあった(気づけてよかった・・・)ものの、二回目はちゃんとベンチ通りました。「再起動試験ってrebootコマンドじゃなくてAzureのダッシュボードからやるんじゃね?」って話になり、Azureのダッシュボードからも再起動試験をやり、「インスタンス1,2,3,4,5の順番に再起動試験やったけど、5,4,3,2,1の順番でやると落ちるかもしれなくね?」って話になってその順番でもためしたり、「MySQLが立ち上がる前にGolang立ち上がったらまずくね?」ってなって前述のMySQL立ち上がるまで待つコードを入れてる話したりしました。ここは本当に念入りにしました。

最後30分であーちゃんが「いま第五鯖何も動かしてないけど、この鯖もNode鯖にすればもうちょい捌けそう」とか言い出しましたけど、全力で止めました。点数上げるためにはたしかに必要だし、あーちゃんなら時間内に作業を終わらせられることはほぼ確実でしたが、ここはISUCON本戦、なんとしてでもFailしたくなかったので。そのあとはベンチの点数のうち最後にしたものが扱われるとの記述により、ガチャしてました。二万点超えたところでもう触らないって決めてフィニッシュ・・・ちょっとしたミスで、結局二万点を少し下回ってのフィニッシュでした。来年はこのミス、なんとしてでもなくします(強い決意)。

どうだろうなー、何位かなー。潜っててスコア表示が止まる17時からガンガン点数伸ばしてきそうだなーって話は結構初めの方からしてました。途中社会人枠含めて一位だったときは特に、「あのチームとあのチームは絶対隠れてスコア伸ばしてくる!!」って話を。学生一位、社会人合わせた全体で5位に入ってて本当に良かったです。

ちょっと大きめの金額をもらっちゃったので、ノートPC買い替えたいと思ってます。まだどれにするか迷い中です。

運営の皆さんありがとうございました!来年もこのチームで頑張りたいと思っています。チームメイトに見捨てられないように精進して、来年も本戦行ってなんかしら賞とるぞ!!!

 

 

 

ここから下はただのチラシ裏の落書き。

 

最近ブログ更新してないナーと思った。セキュキャンの3日目まではギリギリ更新できてたけど、グループワークも忙しくなって4日目から先は書けなかった・・・。で、実家帰ってもやる気でなくて、ICTSC6ってコンテストでサークルで出て3位に入るものの、僕は知ってることを手順通りにやった(MySQLの見たことあるエラー文を、その通りに直した)ってだけで特に書くことなし。IBMメインフレームコンテストも名前載るまで(パート2まで)やったけど、それまでもメインフレーム特有の普段と違う手順でいろいろやらないといけなくて、更に問題文も英語になって、更に更に忙しくて、もう無理ぃ・・・ってなってやめた。あとこれ書いてるとき(3日くらい費やしてる。道理で長文になるわけだ)にCODEFESTIVAL本戦出場キメた。けどこれも、やれることやったらなんかギリギリ通ったって感じだ。というわけで、なんだかんだいろいろやってはいたものの、書くのがめんどくさいっていうので書いてこなかったけど、言い訳はここまでにして、今回のは特段衝撃的だったので書こうと思った。

 

僕は今まで生きてきて、一位と言うものが取れた試しがない。仮に取れていたとしても、それはかなり限られた環境での一位で、全国、全世界にはもっともっとすごい人達がいるとわかってて取った一位だ。そんなの一時的には嬉しいけど、ああもっと上には上がいるんだなってなって終わる。運動できるわけでもなく、頭も特段いいわけではない。何か特別な特技も持っていないし、落ちこぼれの一学生だった。今してるサークル長も、みんなどう思ってるかしらないけど、消去法で選んでも僕になる気がするし、勝ち取ったって感じはまったくない。大学の成績も、めっちゃいいってわけではなく落ちこぼれない程度のものだ。そんな僕が、今回学生枠とは言え、全国で一位のチームに名を連ねる事ができたことが、本当に衝撃的だった。一生無理だと思っていた。もう自分でも何書いてるのか分からなくなって来てるけど、とんでもない喜びだったことを察してほしい。(でも社会人枠の人たち倒さないと本当の一位とは言えないよなーってちょっと思ってる・・・無理・・・)。

 

次もがんばるぞ!

セキュリティ・キャンプ全国大会2016参加記 その二

三日目

3-A【Webアプリケーションの脆弱性の評価と発見】

もう使われていない古いバージョンのサイボウズオフィスの脆弱性を探す会

ひたすら「これは見ていいものなのか・・・?」と思ってた・・・ので、詳しくは書けません・・・

CVSSv3なる方法で、脆弱性の分類をして、重要度をきめるらしい。

・・・が、意外とあてにならないものもあるらしく、重要度は低いけど早急にやらないといけないものも多いらしい。

.htmlの中にif文があって驚いたが、10年以上前のものも含まれてるそうなので、闇が深い。

4-A【クラウドセキュリティ基礎】

クラウドでなにができるようになったか?

-> サーバーをポンポン産んだり殺したりすることが可能となった。

-> サーバーはペットから家畜へ。

ここでもCVSS。やはり重要らしい。

AWSでサーバー立てて遊んだりハンズオンしたりした。

5-A【サーバ運用におけるパスワード管理】

100台サーバーがあって、4人管理者がいたら、理想は400個のパスワードがあるべきだが、実際にそんなこと出来るの?って話。

まあ無理なので、じゃあどうしようか。

とある会社で使われているシステムの説明などをしてくださり、とても面白いと思った。

企業プレゼン

なんか正直良くわからなかった・・・

データを分散して、全部合わさらなければ元データは取り出せないので安全ってのはわかった。

これを用いると、仮にPCをなくしたとか言ったトラブルでも、データをとられることはない。

でも、復元できなくなるので、重要な情報はどうすればいいのか。質問してる人もいたが、回答がなんというか、理解できなかった。

グループワーク

順調・・・なのか?

デスマしそう・・・?

ハニーポットハンズオン

お話聞けてよかった、あんな世界もあるんだ。

ちょっと立ててみたいと思ってしまった。

三日目終わって

ああもう折り返しか、楽しいなあ、もっとやりたいなあ!

goryudyuma.hatenablog.jp

セキュリティ・キャンプ全国大会2016参加記

メモ代わりに残していたものを、ちょっと時間あるので公開。

時間あるときに追記します。

セキュキャン参加記

1日目

特別講義1

サイバーディフェンス研究所

トレンドマイクロ」、「カスペルスキー」などと一緒に、インターポールに協力している会社。

どのようにして入りこんだか?

->事例を効果的に見せることで、印象をあげた

印象大事!

人とのつながり大事!!

特別講義2

警察の人

犯罪とは?バレなきゃいい?

グループワーク

チーム名

三対一

読み方

イーマックスのかち

Vim負けちゃったよ・・・

題目

子供の倫理観をどうやって育てるか?

一日目終わって

twitter.com

twitter.com

もしかしてこのキャンプ、最高では?

二日目

1-A【HTTPプロキシ発展】

burp楽しい!Javaはめんどくさいけど、通信の中身を読みやすくしたり自動書き換えしたりできる!

最後の課題、分かったのにPCが不調で・・・。答えはあってたっぽい。また解いておく。

2-C【人工知能とセキュリティ】

人工知能というより機械学習という印象。

(どう違うのかというとうまく説明できないけど、機械学習はめちゃくちゃ頑張れば手がぎりぎり届きそうだけど、人工知能はどうがんばってもまだ無理って感じ。)

1

データから特徴を抽出することは機械学習で可能だが、その抽出した結果を見て判断する、しきい値を決めるのは人間である。

しきい値そのものを機械学習しようとしたところで、その先もまた人間の手が必要となる。(この結果はいい結果か悪い結果か?など)

よって機械学習は果たして本当に銀の弾丸となれるのだろうか?

2

機械学習ハンズオン

TensorFlowを用いた画像分類の学習。コードも短く、簡単にできそうな印象。

3

学習した結果、暴言を吐きまくるbotができてしまった。

-> 悪いデータに汚染されないように、どうすればよいか?

  • 人間が判断して間引けば良い

  • 悪意を持って学習させる人は少数派という仮定のもと、学習させるのは全データの内から幾つか抽出して学習させる。

  • 事前学習の重み付けを大きくして、自由な学習の重みを下げる

CTF

辛さしかなかった。

RasPi二台持ってて、どちらもRaspbianで、パスワードも朧気ながら覚えてたのに「まさかそれはないだろ~ww」なんて思うのはホント駄目。

CTFと自分、相性めっちゃ悪いなーと。なにもかもエスパー問題に見えてもう無理という感想しかない。

一対三(ヴィムのかち)に負けたのは、三体一(イーマックスの勝ち)の一の方のVim派の自分としては嬉しいやら悲しいやら複雑。

二日目終わって

速攻で部屋帰って寝た。もうここに住みたい。