フロムスクラッチ開発者ブログ

from scratch Engineers' Blog

【開催レポ】b→tech Lab. #1 - 詳説ビッグデータアーキテクチャ -

こんにちは!
フロムスクラッチ新卒エンジニアのおんじです。

昨日9/19(水)、弊社主催のエンジニアイベント b→tech Lab.の第1回を開催しました。
今回のブログでは、その様子をお伝えします!

b→tech Lab.は、ビッグデータをメインストリームとするエンジニアが、独自の取り組み事例やナレッジ・ノウハウを共有する、双方向型コミュニティです。
fromscratch.connpass.com
第一回の今回は、詳説ビッグデータアーキテクチャと題して、
ビッグデータを扱う上で避けられない3つの課題について、一部(LT)と二部(Discussion)の二段階構成で、お話しました。

f:id:kota-onji:20180920120834p:plain


【第一部 Lightning Talk】

第一部は、先程お話した3つの課題それぞれについて、フロムスクラッチが取り組んできた内容を、LT形式でお伝えしました!

「おれのセグメントがこんなに早い訳がない」by 開発チームmgr 原口

1人目は、弊社開発マネージャーの原口が、「パフォーマンスに関するアプローチ」として、セグメント集計のhive処理を高速化するために行ったことhttps://www.slideshare.net/secret/uUU3BgNJaLGSE0、について講演しました。
f:id:kota-onji:20180920201449p:plain
f:id:kota-onji:20180920195810p:plain
集計時間を約3分の1に削減させるために何が重要だったのか、そのエッセンスが詰まった内容になったかと思います!

「b→dashを支える監視システム」by インフラチーム髙須

2人目は、「運用に関するアプローチ」として、弊社2年目でインフラエンジニアの髙須がb→dashの監視システムについて。
https://www.slideshare.net/secret/D1qWqgHfMmWmYm

f:id:kota-onji:20180920200615p:plain
f:id:kota-onji:20180920195258p:plain
1000を超えるサーバ上で稼働しているb→dashのシステムの安定稼働はいかに実現されているのか、実際に導入しているツールの話を交えながらお話しました!

「大規模分散処理を扱うためのクラスタ管理システム」by CTO井戸端

3人目は、弊社CTOの井戸端から、「コスト削減へのアプローチ」として、弊社の分散処理を支えるクラスタ管理システム(通称:Resource Manager)
https://www.slideshare.net/secret/b9RJgRBkClJB73についてお話しました。
f:id:kota-onji:20180920195621p:plain
f:id:kota-onji:20180920200045p:plainf:id:kota-onji:20180920200751p:plain
こちらは、AWS Summit TokyoのStartup Architecture of the year 2018で最優秀賞を受賞したコンテンツということもあり、特にご盛況頂きました!

【第二部 Discussion】

続く第二部では、「パフォーマンス」「運用」「コスト」のテーマごとにテーブルを分けて、軽食を交えた座談会を行いました!
Discussionの時間では、LTの内容に関する質問や、b→dashで使われている他の技術の話もあれば、おぎやはぎのプロモーションに関する裏話など、より深堀ったお話をお楽しみ頂けたかと思います!

おわりに

イベント終了後のアンケートでも「内情を隠さずさらけ出してくれていて、大変満足のいくコンテンツだった。」「内容が良かった。知人にも紹介したい。」とのお声を頂き、
b→tech Lab.初回はなんとか成功と言えるのでは無いかと思っています。

また、第二回b→tech Lab.の開催は11月中旬を予定しております。
今後のb→tech Lab.では、「前処理」「分析基盤」「レコメンデーション」等を扱っていくことを予定しており、また、外部の方のLTや一般公募でのLTも予定しております!

今後のb→tech Lab.に関するご案内は、connpassのフロムスクラッチのイベントページから周知致しますので、こちらのメンバー登録も宜しくお願い致します!
fromscratch.connpass.com

皆様に次回イベントでお会いできることを楽しみにしております!
宜しくお願い致します。

CTFのSQLインジェクションから学ぶセキュリティとハッキング vol.1

 今回のフロムスクラッチ開発ブログでは「CTFのパケット解析から学ぶセキュリティとハッキング」に続いて、SQLインジェクション編の勉強会について書きたいと思います。
 ※CTFパケット解析編のバックナンバーは、
CTFのパケット解析から学ぶセキュリティとハッキング vol.1 - フロムスクラッチ開発者ブログ
からどうぞ!

1.CTFとは?

 CTFとは情報技術に関する問題に対して適切な形で対処することで、「フラグ(Flag)」と呼ばれる得点対象の文字列を取得することによって、得られた得点で勝敗を決める大会です。”Capture The Flag”の頭文字をとってCTFといいます。国内ではSECCON CTFが有名です。(CTFについては、こちらの記事で詳しく触れています。)
 

2.SQLインジェクションとは?

 みなさんは、情報漏洩に対してどれくらい対策を取れていますか?

 Amazon GOなど、全てをデータで管理しようとする昨今の社会の流れがあります。より管理が楽になったり、適切なマーケティングができたりと良い面ばかり取り上げられますが、一方で危険性も孕んでいます。
その危険性の一つである情報漏洩、とりわけSQLインジェクションによる情報漏洩に関して、今回は扱います。

 2011年ソニーグループが7700万人の個人情報を漏洩させてしまいました。
これは、ソニーグループに対する標的型SQLインジェクション攻撃によるものと考えられています。SQLインジェクション攻撃による情報漏えいの中でも最大規模のものであり、SQLインジェクションへの対策の重要性が広く認識された事件でした。

ソニー・ミュージックの日本語サイトにSQLインジェクション攻撃? - ITmedia NEWS

 機密情報、個人情報を少しでも扱うのであれば、SQLインジェクション対策をしておくことがいかに大切かお分かりいただけたのではないでしょうか。
 そこで、今回はSQLインジェクションの仕組みを紐解くことで、対策を考えていきたいと思います。

 SQLインジェクションとは、アプリケーションが想定しないSQL文を実行させることにより、データベースシステムを不正に操作する攻撃方法のことです。
一定規模以上のアプリケーションを作るとき、必要になってくるのがデータベースです。いろいろな種類がありますが、現在も多くのWebアプリケーションのバックエンドで使われているのがリレーショナルデータベースです。
そして、アプリケーションのデータ管理を行う際、SQLを中心にプログラミング言語やフレームワークのAPIを用いてリレーショナルデータベースマネジメントシステム(RDBMS)を操作します。そして、このSQL文を書き換えることによって、データ管理者が予期しないデータの漏洩・改ざん・削除などを行うことができます。

 では、実際にどのように書き換えを行うのか、SQL構文をおさらいしながら見ていきましょう。

3. データ操作を行う言語、SQL

 SQLは、ISO(国際標準化機構)で規格化されたデータベースを管理するソフトウェアを操作・制御することが目的のデータベース言語です。

a.SQLの3つの言語

 SQLは、大きく3つの言語に大別することができます。
1つめは、SQL-DDL(Data Definition Language:データ定義言語)です。データベースやテーブルを作成するときに使用します。
2つめは、SQL-DML(Data Management Language:データ操作言語)で、データを操作する時に用いられます。データを操作するとは、例えば、テーブルからデータを取得したり、テーブルにデータを追加したりすることです。
3つめは、SQL-DCL(Data Control Language:データ制御言語)です。データの整合性を保つための機能であるトランザクション制御などに使用します。
それぞれの言語と言語で使われる代表的な構文は以下の通りです。

f:id:ayumi-inukai:20180528121252p:plain

この中で、SQLインジェクションではSQL-DMLを利用します。

b. メタキャラクタ

 「メタキャラクタ」とは、コンピューター言語において、特別な意味を持つ文字のことを指します。単体、もしくは複数の文字が組み合わさって別の意味を持ちます。
SQL文におけるメタキャラクタの代表例は「%(ワイルドカード)」でしょう。
0個以上の任意文字を現し、例えば、以下のSQL文は、名前に「hoge」を含む利用者のみ抽出しています。

SELECT * FROM users WHERE username LIKE '%hoge%';

また、この時の「’(シングルクオート)」もメタキャラクタの一種であり、シングルクオートで挟まれた文字はそのまま文字列として扱われます。
このシングルクオートはSQLインジェクションに多く用いられています。

例えば、以下の2つのSQL文を見てみましょう。

① SELECT * FROM users WHERE username = 'hoge';
② SELECT * FROM users WHERE username = 'hoge' OR 'ab' = 'ab';

①の場合、名前が「hoge」の利用者を抽出します。
一方②の場合、「ab=ab」は常に真であるため、全ての利用者を抽出します。
このような①から②のような書き換えを行うのがSQLインジェクションです。
すなわち、「メタキャラクタ」を用いてSQL文の構造を破壊し、元々あったSQL文を開発者・運営者が意図しないSQL文に改変し、実行させるのがSQLインジェクションの基本原則です。

4. SQLインジェクションでできること

 さて、SQLインジェクションで一体何が可能になるのでしょうか。ここでは、主な被害である、「データ窃取」「データ改ざん・削除」を取り上げます。

a. データ窃取

 任意のSQL文を発行することで、データベース中の機密データを抜き出すことができます。
様々な手法がありますが、ここでは表連結を使ったデータの抜き出しを扱います。検索機能を持つSQL文をUNION句を用いて書き換えを行います。

具体的に見ていきましょう。
次のようなアプリケーションを考えます。

 /***** 脆弱なコード例 *****/     
  
 USE db_users

 SELECT value FROM data WHERE value LIKE '%{$search}%';
           
 /* データベースへの接続解除(省略) */

例えばURL経由でパラメータ"search"にhogeという文字列を渡したときに取得される表はこのようになるとします。

f:id:ayumi-inukai:20180528122309p:plain

このとき、テーブルdata以外に次のようなusersというテーブルがあったとします。

f:id:ayumi-inukai:20180528122446p:plain

パラメータ"search"に

 hoge' UNION SELECT id||':'||name||':'||password FROM users -- 

という文字列を渡すと、次のような表が取得されます。

f:id:ayumi-inukai:20180528122506p:plain

結果として、別のテーブルのデータを取得できます。

b.データ改ざん・削除

 複文を実行できる環境では、DELETE文やUPDATE文を追加することによって、データの改ざんや削除を行うことができます。
例えば、先のデータ窃取で使ったサンプルで、仮に複文が実行可能だとします。パラメータ "search"に';DELETE FROM users;--という文字列を渡すとテーブルusersのデータが削除されます。
仮に、アプリケーションでユーザーのデータが削除されてしまうと、そのユーザーはアクセスできなくなり、非常に困ってしまいます。


 さて、SQLインジェクションの基本情報を確認したところで、例を用いてより具体的にSQLインジェクションの行い方をご説明したいと思います。
続編として掲載いたしますので、ご覧いただけましたら幸いです。



 本記事は、前述のとおりSQLインジェクションの攻撃方法を理解することによって、実際のセキュアなシステム開発に生かそうとするものです。
実際のSQLインジェクションの実行等においては法律などに抵触しないように気をつけてください。

CTFのパケット解析から学ぶセキュリティとハッキング vol.2

 こんにちは!フロムスクラッチ新人エンジニアのおんじです!
 今回のブログでは、前回の記事「CTFのパケット解析から学ぶセキュリティとハッキング」の実践編として、Wiresharkを使ったHTTPプロトコルのパケット解析による画像オブジェクトの抽出やFTPプロトコルのパケットによるファイル抽出に取り組んでいこうと思います。
 尚、今回の記事のきっかけとなっている社内勉強会は『セキュリティコンテストチャレンジブック CTFで学ぼう情報を守るための戦い方』の内容を参考にしています。より深く気になられた方は、そちらも御覧頂ければと思います!

1.HTTPプロトコルのパケット解析によるオブジェクトの抽出

 Wiresharkは、前回の記事でも紹介したGUIのネットワークパケット・プロトコル解析ツールです。これを活用すると、HTTPプロトコルの通信をキャプチャして、そこに流れているHTMLファイルや画像、CSS、 JSON や XML などのオブジェクトを抽出することができます。そこで今回は、Wiresharkを使ってフロムスクラッチの子会社であるTechJINのホームページから、会社ロゴの画像オブジェクトを抽出してみたいと思います。
 f:id:kota-onji:20180512140605p:plain
 まずは、抽出したいオブジェクトが流れる通信をキャプチャしてきます。前回も確認した通りパケットキャプチャを開始すると、大量のパケットが記録されていきます。このままだと表示件数が多すぎるので、キャプチャしたパケットの中からHTTPプロトコルのものだけを表示できるようにしたいと思います。
 Wiresharkには、条件にあったパケットのみを表示するDisplay Filterと呼ばれるフィルタリング機能があります。この機能を使い、必要なパケットのみを表示します。今回の場合は、HTTPプロトコルが使われているパケットのみを表示したいので、下記画像のように入力欄に"HTTP"と入力します。
f:id:kota-onji:20180511160430p:plain
すると、、、
f:id:kota-onji:20180512140838p:plain
 このように、HTTPプロトコルを使用したパケットのみが抽出して表示されるようになりました。
 今回は検索ページに直接プロトコル名を打ち込みましたが、他にも直接条件式を打ち込むことでプロトコルのフィールド名まで指定したより詳細なフィルタリングも、このDisplay Filterで実現することが出来ます。

 さて本題に戻りますが、問題のオブジェクトを抽出するために、WiresharkのExport Objects機能を利用していきたいと思います。以下の画像のように、File > Export Objects > HTTP Objects を開きます。
f:id:kota-onji:20180509133956p:plain
 すると、以下の画像のようにHTTPオブジェクトが一覧として表示されます。
f:id:kota-onji:20180512142853p:plain
 先程のページをデベロッパツールで確認すると、該当する画像はmark_i.pngというファイル名であることがわかります。
f:id:kota-onji:20180512143953p:plain
よってExport Objectsの画面で該当するファイルをダウンロードしてくると、、、
f:id:kota-onji:20180512144117p:plain
 上記の通り、画像オブジェクトの抽出とダウンロードに成功しました!
今回は画像のケースを取り上げましたが、他のオブジェクトであってもいとも簡単に、抽出してくることができてしまうのです。

2.FTPプロトコルのパケット解析による転送ファイルの抽出

 さて、ここまではHTTPプロトコルについて見てきました。今度は、FTPプロトコルについて見ていきます。FTPサーバをローカルに構築し、そのサーバにb→dashアイコンのpng画像を転送して、転送した画像データをパケット解析によって抽出してみたいと思います(尚、今回はパケット解析にフォーカスするために、サーバの構築~データの転送の部分については省略致します)。

 その前に、前提となるFTPプロトコルの通信の流れについて確認していきます。
f:id:kota-onji:20180511155144p:plain
 上の図のように、FTPプロトコルは「データコネクション」と「コントロールコネクション」とを組み合わせて転送を行います。データコネクションは、実際にデータを転送するためのコネクションになります。それに対して、コントロールコネクションは、FTPサーバにログインする際の利用者認証やFTPコマンドの送受信など、データコネクションを制御するためのコネクションとなっています。
 
 では、実際にデータを転送した際のパケット情報を見てみます。
f:id:kota-onji:20180511154211p:plain
まず、Aの部分はコントロールコネクションに該当します。ユーザーログインのリクエストとレスポンス、データ転送のリクエストとレスポンスが行われています。次に、Bの部分、ここがデータコネクションに該当します。先程のデータ転送のレスポンスを受けて、クライアントからサーバにデータ転送が行われています。そして最後のCで、またコントロールコネクションに帰ってきて、データ転送成功のレスポンスと、通信の終了が行われています。
 
 さて、抽出するデータがやり取りされているパケットがわかった所で、実際にファイルの抽出に入っていきたいと思います。そこで、今回はTCPストリームという機能で、直接データコネクションの通信内容を参照して、そこからファイル抽出を行います。
 まずは、Wireshark上で先程のデータコネクションに該当するパケットを指定して右クリックを押下し、Fllow > TCP Streamを開きます。
すると、以下のようなデータコネクションのFTPの送信データに遷移します。
f:id:kota-onji:20180510163027p:plain
 この中で、png画像のデータを抽出して保存するため、表示形式をRowに変更した上で下部のテキストボックスでpngと入力して()、絞り込みを行います。そして保存すると、f:id:kota-onji:20180510170607p:plain
このように、画像のダウンロードに成功しました!

3.おわりに

 2週間に渡って、普段の業務とは一味違ったパケット解析というものを行い、非常に楽しかったと同時に、
今週はGUI上で全てが完結したように、本当にあっさりと通信の中身を取ってこれることに怖さも感じました。
 お客様のデータを扱う会社として、今後もこのような社内勉強会を積極的に実施し、記事を掲載していきます。
 この度は、お読み頂きありがとうございました!