ynk800のメモ帳

イベントの参加記録や備忘録などを書いていきます。

DevLOVE マイクロサービスのためのkubernetes活用

DevLOVE行ってきた

DevLOVEというコミュニティがあり今年から月1でプレミアムイベントを開催するとのことで、第1回の「マイクロサービスのためのkubernetes活用」というテーマの勉強会?に参加してきた。

devlove.doorkeeper.jp

スピーカーの寺田さんは昔はJavaの人だったが今ではすっかりKubernetesの人という印象。勉強会の前半はgithubの資料をベースにKubernetesの基本的な使い方をデモを交えつつ紹介。 github.com

後半はSlideshareに上がっているトピックをデモを交えながら紹介していく感じ。

www.slideshare.net

これからKubernetesを開発環境、本番環境で使おうと思っている人にとってはかなり有益な情報がてんこ盛りだったと思う。 寺田さんがJJUG CCC 2018 Fallでも言っていたことだけど、

  • 流行ってるからとか話題だからとか短絡的にKubernetesを使うとするのではなく、実現したいことに対して適しているかをちゃんと分析した上で使うこと。
  • Kubernetesが高機能化しているのでなんでもKubernetesで出来てしまいそうだが、他にシンプルな実現手段があるなら無理にKubernetesを使わない
  • Kubernetesのバージョンアップにある程度追従していく覚悟を持とう
  • クラスタがぶっ壊れても作り直せるくらいの大きさに保つこと

あたりは結構刺さった。 特に後ろ2つの「バージョンアップの追従」とか、「クラスタぶっ壊れたら作り直せる」かとかは難しいね。 自分が運用保守まで担当できるな取り組みたいけどね…

昨年Docker Swarmを使った本番環境の構築に携わったけど今回の話と共通する点がたくさんあって、 もっと早く聞いていれば楽だったのにな…と思う。

次回はRPAがテーマとのことなので、興味がある人は是非。

devlove.doorkeeper.jp

A Tour of Goのメモ2

前書き

前回の続き。 y-nk800.hatenablog.com

defer

defer ステートメントは、 defer へ渡した関数の実行を、呼び出し元の関数の終わり(returnする)まで遅延させるものです。 defer へ渡した関数の引数は、すぐに評価されますが、その関数自体は呼び出し元の関数がreturnするまで実行されません。

deferは関数のreturnのタイミングで別の関数を呼び出す仕組みらしい。 deferは1関数内で複数回呼び出すことができ、呼び出す関数はスタックに積まれる。 スタックに積まれた関数はLIFO(Last In First Out)の順に実行される。

例えば、下記のようなコード

これを実行すると、

This
is
defer
sample.

と出力される。

Closeが必要なリソースの処理などの後始末に有用。Javaのfinallyっぽい使い方ができる。

興味深いのが、こちらのコード。

実行すると、2が表示される。 多分、下記の順番で処理が行われる

  1. defer func() {i++}()の宣言により、関数がスタックに積まれる。この段階ではまだ式は評価されない。
  2. return 1の処理で、名前付き戻り値の変数iに1が代入される
  3. returnが呼び出されたのでスタックに積まれた関数が評価され、iがインクリメントされる
  4. 処理が呼び出し元に(インクリメント後の値で)返る

名前付き戻り値に慣れていないと不思議な挙動に見えて面白い。

A Tour of Goのメモ1

前書き

普段はJavaエンジニア(と言いつつDockerやらミドルウェアやらをせっせと準備するお仕事)をしているのだが、ちょうど手が空いた折に社内で「Golangを使ってみよう」という勉強会の告知があり、飛び入りで参加してきた。 「毎年1つは新しい言語を学べ」と偉い人も言っていたわけだし、いい機会なので公式チュートリアルをおさらいしつつ気になった点をメモしておく。 本記事は「Welcome」と「Packages, variables, and functions.」までのメモ。 あくまで自分の勉強のためのメモ書きなので、文法の解説には触れない。文法を勉強したければ本家のA Tour of Goを参照してほしい。

A Tour of Go

変数の型宣言

https://go-tour-jp.appspot.com/basics/4

Javaやその他多くの言語とは違い、変数名と型の宣言が逆になっている

func add (x, y int) int{
    return x+ y
}

今までC,Java,Groovy,C#,Ruby,Python等、いろんな言語を触ってきたがこのパターンは初めて。 なぜこのような言語仕様なのかは別ページにまとまっていた。

https://blog.golang.org/gos-declaration-syntax

日本語に翻訳した記事:https://qiita.com/m0a/items/2b03b189d746ae231756

「宣言部を読むときに左から順番に読めば済むからわかりやすいだろ?」という主張のようだ。

主張は理解できるし判ってしまえば何ということはない。けど、これは慣れるまでは気持ち悪さがあるかな。。。

関数の複数戻り値

https://go-tour-jp.appspot.com/basics/6

最近のC#ではメソッドが複数の戻り値を返せるようになったと小耳に挟んだりしたけれど、Golangでも関数から複数の戻り値を返せるようだ。

func swap (a string, b string) (string, string){
    return b, a
}

Javaではどうしても複数の値を返したければ何がしかのクラスを作ってラップしてやるしかなかった。 オブジェクト指向でキチンと設計するためには意味のある単位でクラスを作って返却したほうがわかりやすいと思うが、 一方でサクッと簡単なツールを作りたいときにいちいちクラスを作るのが面倒だったりもする。 重宝しそうだが、めんどくさがって何でもかんでもこれで返却するのは禁物かなぁというのが今のところの感想。

関数定義時の名前付き戻り値

https://go-tour-jp.appspot.com/basics/7

関数定義の戻り値部分に変数名を明示してやると、当該関数内での変数の宣言とreturn文の記述がある程度省略できるらしい。 これは結構便利かな。元ページにも書いてあるけど、関数が長くなると可読性下がりそうなのでやりすぎは禁物。

Goで扱える組み込み型

標準で複素数が扱えるらしい。 業務では複素数扱う機会がなかったのでそんなに困ったことはないが…Javaでやるなら外部ライブラリを使うことになる。 Complex (Apache Commons Math 4.0-SNAPSHOT API) 標準で複素数が扱えるということは、組み込みの数値計算系処理も充実しているのかな?

SECCON Begginers 2018の振り返り

SECCON Beginners 2018

CTFやってみたいんだけどどこから始めればよいのだろう…と思っていた折に、丁度よくSECCON Beginners 2018の案内が目に入り登録したところ抽選が見事当選。

SECCON Beginnersとは - SECCON 2018

せっかく参加してきたので振り返ってみます。 自分にとっては入門的な内容の講義+演習のCTFというスタイルは丁度よい構成でした。 ただ、講義の内容をすぐに演習で活かすのはちょっと難しかったな…。

今回のSECCON BeginnersではCryptoとPwnが題材でした。 講義パートで技術解説があり、CTFパートではCrypto4問、Pwn3問、Misc4問が出題されました。

講義パート

Cryptoはその名の通り暗号解読系の問題で、公開鍵暗号方式RSAが取り上げられていました。 公開鍵暗号RSAといえば超メジャーな技術ですが、CTFの問題を解くとなると仕組みを正確に理解しておくだけでなく、 どういう条件のパラメータだと既知の攻撃手法が使えるのかまで知っておく必要があります。 また限られた時間内で問題を素早く解くという意味では、 利用できる周辺ツール類、ライブラリをどれだけ知っているかということも重要ですね。 実務の観点でいうと、使ってはいけない素数のペアについて詳しくなれてよかったです。 あと乱数生成器の話の中で、「予測可能な乱数生成器でセッションIDなどを発行していると別の人のセッションIDが予測できる」というのが興味深かったかな。 言われてみればそりゃそうなんですが、意識したことがなかったので気を付けるべきですね。

Pwnはプログラムや環境の脆弱性を突いてFlagを取得するタイプの問題です。BOF(バッファーオーバーフロー)が題材でした。 Pwnは仕事柄あまり馴染みがなく大苦戦…。

CTFパート

どうやって解いたかを振り返ってみます。

Factoring

具体的な値はメモるのを忘れてしまいましたが、RSAで使うN=pqの値が与えられるので、p+qを求めよという問題。 演習に使用した環境にfactorコマンドが入っていたので、これを使えば一発でした。

Go Fast

2^{4085} mod 97 を解く問題。 演習環境に入っていたpythonでpow(2,4085) % 97をたたいて終わり。 他の人の話を聞くと、pow(2, 4085, 97)でよかったらしいです。 2. 組み込み関数 — Python 3.6.5 ドキュメント

SimpleRSA

これも具体的な値はメモってませんが、RSAのp, q, e と暗号文Cが与えられるので、平文を求めよという問題。 講義資料に記載の拡張ユークリッドの互除法pythonのコードを使って暗号鍵を求め、復号して終わりでした。

Find Primes

問題はgenerate.pyとproblem.txtの2つのファイルが与えられるだけ。 generate.pyは中身を見ると、どうやらRSAで鍵を10個程度用意し、平文のflagをそれぞれの鍵で暗号化して出力しているだけ。 problem.txtはその出力っぽい感じでした。 generate.pyの中身をよくよく見ると、公開鍵に使用する素数の組み合わせの一部が使い回されていました。 講義パートの中で鍵の素数を使いまわすと既知の攻撃手法が使えるという話があったので、 それをどうやって実装しようか考えている最中にタイムアップ。 普段仕事ではJavaを使っていますがわりとEclipseに頼りきりなので、ちゃちゃっと書いて動かせるスクリプト系言語に強くなる必要性を痛感… PythonRubyと仲良くなろう。

Pwnの問題

講義パートでアセンブリgdbについて解説があったものの、アセンブリを読み慣れていないのもあり20分くらい経っても解けそうになかったので諦めました。 一応、講義で触れていたCanaryっぽい文字は見えたんですが、何バイト与えればBOFして上書きできるのかがわからなかった…

Misc

PwnとCryptoに時間を使いすぎたのであまり見れませんでした… Welcomeの問題は採点システムの使い方のチュートリアルみたいなものなのでよいとして、 Tekeisan4b ShinagawaはCookieか何かに回数が保存されていてそれを改変すれば簡単にFlagが出てくるのかと思いましたが、本当に愚直に100回計算するタイプの問題だったようで。 decrementも取り組む時間が取れれば解けたような気がしますが、時間配分ミスなので後の祭り。

終わりに

初めてCTFのイベントに参加しましたが、解けたときの達成感が気持ちよく純粋に楽しかったです。 CTFを通じて攻撃手法を知ることは転じて防御手法を知ることになるので、ただ遊びとしてだけでなく実務でも役に立つものだと思いました。 ちょっと興味あるけどどこから始めればよいのだろう、とお悩みの方にはSECCON Begginersはおすすめです。 運営スタッフの皆様、ありがとうございました!