どんぐり戦記

「お前らの成長具合は俺からみると,どんぐりの背比べ」と言われはやn年.どんぐり戦記はじまります.

セキュリティキャンプ応募課題 Write up @shiso*

超お久しぶりです.
久々にブログ書きます.

正直write upを書くのを迷ったのですが,将来の誰かのためになるなら....と思い書きます.
怒られたらその時はその時で💫

Noプロなので難しいことは書きません.
あくまでも,私が課題にどうやって向き合ったかについて書きます.

1.応募した経緯

2018年からCode Blueの学生スタッフをやっているのですが,その時から各所で「セキュリティ・キャンプ」っていう単語
をチラチラ聞いていて気になっていました.
じゃあ,2019に応募したのか?というと してません

理由

1. 応募時期が期末レポート祭りで単位取るのに必死だった
2.セキュリティは興味あるのに「何に(どんな技術に)興味あるのか」がはっきりわかってなかった
3.応募課題を見て今の自分には解けなさそうだなと思った

という,3つの理由(言い訳)が大きかったと思います.
2019年から一年経ち,理由にあげた2番目がはっきりしました.

「私はネットワークについてやりたい!」

どうやってそこまでに至ったのかは,長編作になるため割愛します.

自分の興味がある技術を見つけた(?)私は,セキュリティキャンプ2020の応募課題提示を見に行きました.
見に行くとそこに面白そうなゼミがあるじゃないですか....!!!!!!

城倉ゼミ「独自セキュリティ機構を追加可能なモジューラブルなソフトウェアルータの開発」

「ここだぁああ!」っていう心の声とともに,課題提出までの1ヶ月と数週間がスタートしました.

2.募集課題晒し

募集課題は希望するトラックごとに違います.
ちなみに,私はZ(プラットフォームセキュリティ)トラック のⅣ 城倉ゼミ に応募しました.
今年度はZトラック内で複数希望が可能だったのですが,私は単願で出しました.

2.1 課題内容冒頭

城倉ゼミ「独自セキュリティ機構を追加可能なモジューラブルなソフトウェアルータの開発」
## 原文、画像、添付ファイルなどは[こちら](https://gist.github.com/slankdev/a47dccbc9eda0e5d37c1cb95bc4f6200)


以下の問題は**完答することが通過条件ではありません**.いかに応募者のみなさんが
技術に興味があるか, 手を動かしているか. (もしくは手を動かしてくれそうか)を
判断する基準で見させていただきます. また演習課題は難易度を高く設定しているため**基本的に完答できないくらい**を目安に作問しています.
みなさんがどれだけこの問題に挑戦し, 熱意を持って手を動かしてくれるかを測っています.

以下から自由に課題を選択して答えてください.全てをまんべんなく解いてもよく,
もちろん一つだけをものすごく深掘りして取り組むのでも構いません.
しかし基本的に調査課題は取り組んでいただきたいです.

努力評価してくれる....!たくさん頑張ろう...!と心に決め問題に取り組みました.

2.2調査課題の回答

提出した原文ではなく,あくまで書いた文章の流れだけざっくりと書きます.

問題1 調査課題: ネットワークやパケットに関するプログラミングの経験や動機

ネットワークや, パケットに関するプログラミングの経験がある場合(入門中も可),
どのようなものを作ったのか(作っているか, 作りたいか) 説明してください.
また, 本ゼミのテーマである「モジューラブルなソフトウェアルータの開発」
に関わる作りたいソフトウェアやそれに対するロマン,必要性等を説明してください.


回答
プログラミングは入門レベル.演習課題のパケット解析でネットワークプログラミングに興味を持った.
そこから,個人で勉強始めました.流れてくるパケットに対してラベルをつけて表示できるC言語プログラムを作っています.
最終的には,パケットの特徴によって制御できるものを作ってみたいです.
パケット特徴によって制御するルータをつくるって二番煎じ感あるので,柔軟性と新規性があるSRv6使いたいです!


解説
入門でもいいって書いていたので,正直に「この課題で入門しました!」ニュアンスで書きました.
そこから,手を動かして学んでいること・まなんだことで将来的にどういうことをしたいのかを書きました.
最後の一行は強気にロマン語っていいって記載されていたので,「二番煎じはいやだ!!!」って書きました.
やりたいことは考えて,手は動かそうとしているアピールと新しいことやりたい!っていうやる気を書きました.

問題2 調査課題: ルーティングプロトコルとSDN

インターネット上ではたくさんの計算インスタンスがネットワークに接続しています.
ここでの計算インスタンスとはVMや物理サーバ, コンテナ等を示します.
これらはIPを利用して相互に接続されていますが, 特定のインスタンスに対する経路
を全て静的に設定するのではなく, いくつかの動的ルーティングプロトコルやSDN
コントローラを利用して経路設定をソフトウェアによって行なっています.
ルーティングプロトコルやSDNコントローラについて調べてあなたの知識を説明
してください. どのようなルーティングプロトコルやSDNコントローラがあるのか.
それぞれどのような特徴があるのか, メリット/デメリット等の考察があるとさらに
良いと思います.


回答
まず,ルーティングプロトコルはEGPとIGPの説明をしたあとに, BGP・RIP・OSPFの説明(何をするか,どうやってルートを決めるか,メリット・デメリット)
・・・・
MPLSとSRv6についても書きました(どうやってパケット転送するのか,動作の違い,メリット・デメリット)
・・・・・
SDNコントローラはSliceable Switch,ONOS,OpenDaylight の3つについて書きました.(どんなことができるか,特徴)


解説
この課題だけで約2500字書いてました.
もともと,ネットワークの学科在学中なのでルーティングプロトコルについてはいいペースでかけましたが,
SDNコントローラについては0から調べました. 最低限,「このコントローラは何をしてどんな利点があって作られたものか」の各違いをかければ説明にはなるなと思い資料を読み漁りました.
ここで私が伝えたかったこととしては,自分に今ある知識量+調べて得た情報を理解して伝えること に重きを置きました.
このあたりは,オレオレ要旨読みをやって(やらさr)きたから出来たなって思います.

問題3 調査課題: パケット転送技術 (DPDK/XDP/etc...)

講義概要にも記述されている通り, Linux等でパケット転送を行うには
いくつか手段があります. DPDKやXDP等を利用するケースや, AP-PACKET等を
利用するケースなど様々ですが, それらにどのような違いがあるかを説明してください.
性能や機能等の何かに集中して, 利点欠点等を考察できていると良いです.
またもしどれか一つでも使ったことがあればその所感や難しさがあれば
説明してください.


回答
DPDKとは...(動作,なにがすごいのか)DPDKはC言語で実装されていることが多いけど,高速なパケット転送を実現するならRustで実装したほうがいいと考えました.そこで,提出期限延長の1週間でRustでDPDKを触っているものを調べて動かしました.今回はRustで書れているDPDKを動かすことを目標におきました.動作として,実行したコードはDPDKで認識しているCPUに対して,helloメッセージともにコア番号を一行ずつ表示するものをRustとC言語で動かしてみました.動かすことには成功したが,RustでDPDKを触ってみたい!と考えた理由の1つである高速で実行できることを調査出来なかった.出来なかった理由として.......
XDPとは..... (DPDKと比較して何がすごいのか,比較してどのように動くのか)


解説
DPDK・XDPはお初単語でした.
課題延長される前は,何がどうやって動くのかに注目してそれぞれの違いを考えて回答を出していました.(性能や機能等の何かに集中して, 利点欠点等を考察が出来なかった)
課題提出が一週間延長されブラッシュアップしました.ブラッシュアップのポイントとして,課題文末の1文に注目しました.「またもしどれか一つでも使ったことがあればその所感や難しさがあれば説明してください.」 触れってことか :thinking_face
ということで,巷で 早い! 楽! すごい! と噂のRustを触ってみることにしました.
そこで,ただ単純に触ってもアピールインパクトが弱いので「目標設定」しました.私の場合だと「動かすこと」「比較すること」の2つですね.
それに対して,なにが出来たか・出来なかったかを書くことで「問題に挑戦し, 熱意を持って手を動かしていること」をアピールしました.

調査課題: 希望調査

本ゼミを受講するにあたり, 特に興味ある分野等があれば記述してください.
ざっくばらんにあなたの興味範囲とかを書いてもらえるとありがたいです!
選考を通過したあとには, 具体的に何をやっていくかを再度議論するので
その時の材料になります. 以下に簡単な例を示します.

  • この技術で高い能力を身に付けたい. とか
  • この技術を講師(城倉/slankdev)にみっちり教えて欲しい. とか

ちなみに僕はパケット転送プログラミング. ネットワーク仮想化.
BGP等のルーティングプロトコルの実装, SRv6等の新しいフォワーディング方式等が特に好きで仕事でも取り扱っています.


回答
ネットワーク構造やプロトコルに関しての勉強や通信に関する技術が好き.授業にてネットワークがコマンド入力してルータセットアップしている.このゼミ課題でコマンドでの制御だけではなくもっと柔軟にネットワークに対応できることがわかり,とてもネットワークプログラミングに興味を持ちました.
SRv6に興味がある.SRv6で公開されている資料の少なさ+自分のルーティング・ネットワークに関する知識がとても不足していることに気づき勉強しています.このゼミでは,SRv6についてみっちり知りたいと考えているのと.自分のスキルアップ・見えていない視野を広げられたらと考えています.


解説
欲望と願望語りました.
この課題文章の狙いとして,いまの自分のちから+「成長したい欲」を書きました.

2.3調査課題のまとめ

調査課題において,はじめて対面した単語・技術が結構ありました.
それに対して,自分なりに調べてまとめたものが多かったです.
調査課題全体の文字数は4600字ちょっと書いてました.
その4600字ちょっとの文章で意識したことは,「興味があることに挑戦する」ことを書きました.
与えられた課題に対して,どれだけ自分で挑戦できたか.自分で吸収できたかについてを意識して課題に書きました.

2.4 演習課題の回答

演習課題: Virtual Network Playground

LinuxにはNetwork Namespace (netns)というネットワークスタックを仮想的に 複数生成する機能があります.コンテナ型の仮想化技術の多くはそれぞれの コンテナに対して一つのnetnsを作成し, それらをVethで接続してコンテナを 外部ネットワークに接続させています. ここでは三つのnetnsを作成し, 添付の図のように接続して ns1からns3に対して通信を 行うような仮想ネットワークを構築し, その方法を説明してください. 利用するアドレス対に関しては図中のものを利用してください.

{図がここにはいる}

環境構築に利用するOSはLinuxであればおそらくなんでも構いませんが, Network Namespaceの機能に制限がかかっている可能性があるため, Ubuntu18.04か,Centos 7を推奨とします.

もし余裕があればSRv6やTC等を利用して, 独自のパケット制御をするような環境を 構築し, その方法を説明してください. SRv6を利用する場合はkernel 4.18以上を 利用することが推奨です.

回答
VBubuntu 18.04の仮想マシンを立てて構築を行いました.
作った環境は,GitHubにて回答します.
github.com

netns を使用した環境構築では,netns コマンドを使用し機器を作る・つなぐ・アドレスの割当・リンクの開放を一括でできるシェルスクリプトを作成しました.
このシェルスクリプトで作成した環境では,ns1からns3への疎通は出来ないため,今回はOSPFを使用し経路制御を行いました.OSPFを使ったルーティングを実現するためにルーティングソフトウェアの一種であるQuaggaを使用しました.各ルータに対応する,ospfd.conf ファイル と zebra.conf を作成しquaggaを起動させました.
起動後,ns1からns3にpingを送り,疎通の確認ができました.


SRv6を使用したパケット転送も行いました.
構成図はgithubのほうに載せました.
Host1からHost2へのパケット送信時にRouter 1→2→3と通信するのではなく,Node1を経由するSRHをRouter1つけRouter1→Router2→Node1→Router3とNode1を意図的に経由させる環境を作りました.





演習課題: パケット解析プログラミング
添付の icmp_data.pcap というpcapファイルにはある画像が隠されています. これらのパケットには, 基本的なICMPのパケットが記録されているように見えますが, 実はICMPヘッダの後ろのデータ部分を全て繋げるとある画像が復元できます. 実際にコードを書いてその画像を復元してください.

プログラムの実装は原則どの言語を利用しても構いませんが, C/C++, Golang, Rust等のシステムソフトウェア開発に利用される言語がおすすめです. 画像ファイルを復元することがタスク的にはゴールですが, 以下のような マイルストーンがあると思います.

pcapをwireshark等のprotocol analyzerで開いてデータを確認する.
pcapから一つ一つのパケットを好きなプログラミング言語で読み取る.
パケットのヘッダを解析し, どのような通信かをプログラムで解析する.
ICMPパケットのデータ部分をそれぞれ連結し, 画像を復元する.
もし余裕があれば,特定の「フレームワークを利用することを禁止する」等の 特別ルールを加えてこの課題を突破してみてください. 例えば「libpcapは使ってはいけない」等です.

(Special Thanks, 策問者: Takaaki Hoyo)

回答
プログラミングが得意ではないので,ググってほよたかさんの
Scapyで作る・解析するパケット
を超参考にしてプログラムを作成しました.
github.com



以上!課題の解説でした!
いつの日かやる気と時間があったら講義編も真面目に書きます👍