はじめに
教育ソリューション担当の柴﨑・沖本です。普段はセキュリティ教育研修講師業務に従事しており、講師としてサイバーセキュリティ人材教育研修を提供しています。
弊社が提供する研修の中には、「Webアプリケーション開発演習」という、ひとりひとりオリジナルのWebアプリケーションを開発する科目が存在します。
期限も2週間ほどと、決して多くはない時間の中、開発のためのアプリケーション企画や設計、実装にひとりで挑む。まさに本研修の「ボスキャラ」ともいえる科目です。
今回は実際に研修で開発に挑戦した2名の研修生にインタビューを行い、その様子をお届けします。
研修生たちはどのようにこの関門を乗り越え、何を学んだのか。このインタビューを通して、NFLabs.の研修の魅力や、スキルアップのために日々努力する研修生たちの姿が伝われば幸いです。
NFLabs.研修「Webアプリケーション開発演習」とは
NFLabs.が提供するセキュリティ教育研修は大きく分けて、サイバーセキュリティならびにITや開発に関する基礎スキルを養成する「BootUP研修」と、より高度で専門的なスキルを養う「高度技術研修(以下ATT)」の2つの研修が存在しています。
その中で「Webアプリケーション開発演習」はBootUP研修の終盤に位置する科目です。
研修生はそれまでの研修で学んだPythonやWebアプリケーションに関する知識をフル活用し、自身の企画のもと開発に挑むことになります。
なぜセキュリティ研修で開発を?
サイバーセキュリティ人材育成がテーマであるNFLabs.研修でなぜアプリケーション開発を行うのでしょうか。
エンジニアとして、プログラミングや開発に関わるスキルを養うこと自体にももちろん価値はありますが、弊社の研修はそれがゴールではありません。
アプリケーションのどういった箇所に実装上の脆弱性が存在しうるか?
ミドルウェアのどういった箇所に脆弱性や設定不備が存在しうるか?
アセンブリを読んで、マルウェアの挙動を解析できるか?
セキュリティエンジニアとして、これらの観点でシステムやソフトウェアを診断・解析するためには対象についての基本的な知識が必要不可欠です。
自分たちで実際にコードを書き、アプリケーションを作ることでアプリケーションの仕組みや動作の裏側を理解し、サイバーセキュリティのスキルを養う土台を築く。
それが、弊社の研修で開発を学ぶ意義といえます。
研修生インタビューその1(Tさん) ~セキュリティガチ勢の開発、出発進行!~
1人目は、ポートスキャンやサブドメインの調査が可能なセキュリティツールを開発したTさんにお話を伺いました。
新入社員ながらセキュリティのバックグラウンドを発揮して専門的なツールの開発に挑んだTさんですが、どういったモチベーションで開発に臨み、研修を通して何を学んだのでしょうか。
(筆者):
どのようなアプリを開発したのか、改めて教えてください。
(Tさん):
ポートスキャンとサブドメインの列挙を一挙にできるツール「Scan Festival」です。
ターゲットドメインに対し、Shodan API*1やVirus Total API*2といったAPIやNmap*3のようなスキャンツールによるスキャンを行い、Webコンソール上でその結果を確認できるアプリケーションです。
ターゲットドメインへのポートスキャンの結果のほか、サブドメインの列挙やサブドメイン関係図を表示することができます。
さらに、以前調査したドメインについては調査結果をデータベース(DB)に保存しているので、過去の調査結果を検索することもできます。
(筆者):
構成や動作環境はどうなっていますか?
(Tさん):
提示された開発要件として、Pythonを使用したCGIアプリケーションである必要がありました。そのため、バックエンドはフレームワークを使わずに(※1)フルスクラッチで実装する必要がありました。
VM(kali Linux※2)上でCGIを動作させ、APIの呼び出しやMaria DBとの連携をしています。
※1 Webアプリケーションの仕組みを学んでもらうため、意図的に開発のルールとしてWebフレームワークの使用を禁止しています。
※2本研修では、デフォルトで組み込まれたツールの豊富さからKali Linuxを開発環境として推奨しています。
(筆者):
研修生によって、様々なジャンルの製品を開発していますが、Tさんはセキュリティ製品をテーマに選んだんですね。学生時代からセキュリティやITを学んでいたのでしょうか?
(Tさん):
小学生のころからPCに触れていて、大学ではサイバーセキュリティの研究室に所属していました。
研究室ではバグハンティングでCVEを取ったり、フィッシングサイトについての研究をしたりしていました。
そういった経験から、アプリ開発の課題を聞いた時に、「せっかくだからセキュリティ製品を作ろう!」と考えました。
Shodanでの調査やサブドメインの列挙に関しては以前から経験があったので、それをアプリケーション上で、一気にできるようになると面白いな、やってみたいなと考えて開発することにしました。
(筆者):
自分の経験もあって、開発でやりたいことが最初から明確だったんですね。
(Tさん):
とはいえ意外と見切り発車で、細かい設計や骨組みは作りながら考えてました(苦笑)
DNSの特定のレコードの記述がない場合には必要な情報が取れないこともあって、仕様変更を余儀なくされるとか……。
(筆者):
これだけのアプリをひとりで開発するにあたって苦労した点はありましたか?
(Tさん):
Webフレームワークなしで、CGIでアプリケーションを使わないといけないということで、CGI自体は触ったことがなく仕組みを理解するまでが苦労しました。
研修序盤にあったPythonの研修でもCGIでアプリケーションを作る演習がありましたが、全然できなくて……。
それでも、復習しながら最終的に仕組みを理解して使いこなせるようになったかなと思います。
(筆者):
アプリケーションで工夫したポイントはありますか?
(Tさん):
今回、研修の要件のひとつに、アプリケーションの堅牢化またはセキュリティ機能の実装という要件が含まれていたので、その対応としてサブリソース完全性(SRI)の検証を実装した点です。
外部リソースを参照する機能が含まれているため、取得したリソースが改ざんされていないのかをチェックすることが必要と考えました。
外部リソースのハッシュ値を突合することで、リソースの改ざんを検知できるようにしました。
あとは、Bandit*4を使ってアプリのコードに脆弱性が含まれていないかもチェックしました。
さらにとっておきの工夫があって……
アプリケーションの画面の下にSLのAAを走らせるようにしました。
(筆者):
セキュリティに関する工夫の話から、急に毛色が変わりましたね(笑)。
なぜSLが走るんですか?
(Tさん):
ちょっと黒背景の画面の、特に下半分が寂しかったので。
(筆者):
寂しかったのなら仕方ない(笑)。
セキュリティの専門性を発揮しながら、遊び心もありで、勉強しつつ楽しみながら開発されていたんだなということが伝わってきました!
(筆者):
開発演習を通して学んだことを教えてください。
(Tさん):
タスクの進捗や締め切りを意識する必要があるのが、学生時代の研究タスクと大きく違うところと感じました。
研修のルールで作業できる時間が決まっていたり、そもそも納期(締め切り)がある中で今日どこまで作業を進める必要があるのか、残り時間で何をどこまで行うべきかの判断が求められるので、タスク管理の概念を学ぶことができました。
また、自分で実際にアプリケーションを作ってみて、日ごろ利用しているアプリケーションの裏側の苦労を垣間見ることができた気がします。
普段使っているアプリで、仕様がイケてないな、UIが使いづらいな、と感じることも今まであったのですが、実際開発者として作ってみると、技術的にやむを得なかったり、(納期との兼ね合いで)理想を実現することが難しかったり……と開発者側の苦労が理解できた気がします。
(筆者):
社会人としてのタスクと納期との向き合い方や、エンジニアとしてアプリケーションを作る側の事情など、「職業: エンジニア」の世界を体感することができたのですね。
(筆者):
最後に、これまで数か月間NFLabs. 研修を受けてみてのモチベーションの変化や感想、さらにこれから続いていく研修の意気込みを聞かせてください。
(Tさん):
セキュリティやITという自分が好きな分野をガッツリと学ぶことができるので、モチベーションは研修が始まってからずっと最高状態です!
モチベーショングラフにすると水平一直線状態ですね。
(筆者):
うわ、ほんとにずっとまっすぐ。
(Tさん):
研修は、序盤の科目は既に経験していたことや知っていたことも多かったですが、周りのメンバの中にはIT初学者の方もいて、そういった人たちとのコミュニケーションの中で自分も改めて気づかされること、学ぶことがあるとひしひしと感じています。
初学者の人と一緒に研修を受ける中で、その人がポツリと投げかける、素朴な、かつ根本的な疑問も、自分も今まで考えたことがなかった疑問であることがよくあります。
その疑問について、そういえばなぜなのだろう、と自分も考えるキッカケをもらっています。
そういった場面は「なぜ?」という本質の部分を初心に帰って考える機会になっていて、勉強になっています。
(筆者):
自分のスキルにおごることなく、初心者の仲間からも刺激を受けて成長に繋げているんですね!
(Tさん):
とはいえ最近は研修の内容も高度になってきて(※取材当時は既にBootUP研修からATTに進んでいました)、難しくなってきたなと感じていますが、変わらず楽しく学べています!
また、個人でのアプリ開発では(本来よくはないですが)変数名や、アプリの仕様は自分がわかればよい、という状態でしたが、今度はチームを組んで複数人でソフトウェア開発を行う科目が登場してきました。
チームでコミュニケーションを取り、足並みをそろえながら共通のゴールを目指すスキルが求められていて、簡単ではないのですが、これからは技術力だけでなく、チームで動く力もこの研修で養っていきたいと思います。
(筆者):
苦労している面もありながら、楽しみながら研修に臨み、様々な面でのスキルアップに努めていることが聞けて嬉しい限りです!これからも研修頑張ってください!
研修生インタビューその2 (Dさん) ~文系出身、初めての挑戦、学習の足跡~
続いては、文系出身ながらセキュリティの世界に飛び込んできたDさんにお話を伺いました。
初めてのアプリ開発に挑戦した彼は、この課題にどう立ち向かい、乗り越えていったのでしょうか。
(筆者):
どのようなアプリを開発したか、改めて教えてください。
(Dさん):
「らーめんサーチ」と題して、全国のラーメン店に関して、情報の検索やレビュー投稿ができるアプリケーションを開発しました。
キーワードやエリア、時間帯など、指定した検索条件でHOT PEPPER API*5がラーメン店の情報を取得し、その情報を一覧で表示することが可能です。
さらに、各ラーメン店について独自のレビュー投稿フォームを用意し、各店のレビュー投稿・閲覧を可能にしました。
ユーザごとに使い分けられるように、DBを用いたユーザ管理機能も実装し、ユーザアカウントに基づくログインや、ユーザごとのセッション管理も実現しました。
(筆者):
ラーメン店をテーマに、店の検索やレビュー機能をユーザ管理機能と結びつけるなど、各要素がうまくまとまったアプリだなと感じました。学生時代にITや開発の経験があったのでしょうか?
(Dさん):
文系出身で、そういった経験はありませんでした。大学の教養の講義で、Pythonをちょっとだけ触ったことはありましたが……。
そのため、ITやセキュリティについて学ぶのも、もちろん、アプリケーションを作るのもこの研修が初めてでした。
(筆者):
経験がない中でも、自力でアプリ開発にチャレンジし、成し遂げるためには相当なモチベーションが必要ではないかと思います。この開発研修にはどういった想いでチャレンジされていたのでしょうか。
(Dさん):
まず、開発研修に限らず研修全体の話をすると、文系で経験もない中でセキュリティの世界に飛び込んでいるということもあり、NFLabs. 研修を通して、自分の専門性、いわば武器を身につけたいという想いで参加しています。
そして、この開発研修はBootUP研修でこれまで学んだPythonやWebアプリケーションに関するセキュリティの知識を総動員する必要のある科目なので、自分がこれまで学んだことを、目に見える形としてアウトプットしようという想いで開発に臨みました。
アプリケーションのテーマ自体はなんでも良くて、単純にラーメンが好きだからラーメンをテーマにしましたけど、せっかく開発するのであれば研修で学んだ要素を無理なく取り入れられればよいかな、という考えでした。
(筆者):
開発で苦労した点はありますか?
(Dさん):
初めての開発で、苦労だらけではありましたが……開発でたくさんのエラーたちと遭遇したことです。
トラブルシューティングが大変でした。検索して調べて、粘り強く試行錯誤する……その繰り返しでした。
手詰まりになって悩むことも多くありましたが、一緒に研修を受けている周りの仲間に教えてもらって助けられたところもありました。
(筆者):
苦しみながら、時には仲間を頼ることで課題を乗り越えていったのですね。
(筆者):
アプリケーションで工夫したポイントはありますか?
(Dさん):
ユーザ管理機能の実装の際にパスワードの保存を行う必要がありますが、ハッシュ化のほかにソルトというものを学んで取り入れることができました。
のちのち、さらに勉強していくとソルトとパスワードハッシュの保存の階層をわけた、ペッパーの方が安全だということを知ったのですが、時間切れで取り入れることは間に合いませんでした。
そういった面でベストプラクティスを取り入れられなかったという反省点は残りますが、ソルトという概念を学んで自分の開発物に取り入れられたのは工夫できた点かなと思います。
(筆者):
開発研修を通して学んだことを教えてください。
(Dさん):
セキュリティ対策の実装でセッション管理を実装したのですが、その実装はたくさんのことを学ぶきっかけになりました。
Cookieの実装の技術面そのものもそうですが、ログインした状態とそうでない場合において画面遷移を変えなければならないといったアプリケーションの動作仕様の面であったり……。
Tくんの感想と被りますが、普段使っているアプリケーションってよくできているんだなあと感じました(笑)。
あとは、周りのスキルの高い人の姿勢面からも学ぶことがありました。ソルトとペッパーについて周りの仲間に相談したときに、それこそTくんのようなバリバリ経験のある人の様子を見ると、わからないことが出てきたときに、そのことを調べるのがすごく速くて上手だなと感じました。僕は止まって考え込んでしまうことがあったので、知らないことはすぐ調べる必要があると学ばされました。
(筆者):
最後に、これまで数か月間NFLabs. 研修を受けてみてのモチベーションの変化や感想、さらにこれから続いていく研修の意気込みを聞かせてください。
(Dさん):
さっき話した通り、研修を通して武器を身につけたいという意図があったので、モチベーションはある程度ある状態でしたが、研修に参加して最初は、それこそTくんのようなスキルの高い人が中にいたこともあって「来る場所間違えちゃったかな……」と不安になりました。
その日の研修の内容がわからなかった後は、明確にテンションが下がっていたと思います。解けない課題があった日とか……。
それでも、復習やのちのちの振り返りを通して理解できるように努力はできたと思っていて、実際にわからなかった内容を理解できるようになったときはモチベーションが上がっていきました。
開発演習も、ある意味Pythonを含めたこれまでの研修の復習でもあるので、日々自分でできることが増えていき、スキルの成長を感じられる期間でもあったので、モチベーションはどんどん高まってきたかなと思っています。
今取り組んでいるATTは今まで以上に高度な内容を扱っていることもあり、BootUP研修であればギリギリ名前くらい聞いたことはあるなという概念を扱うことがありましたが、最近は聞いたこともないようなことを扱うようになってきたなと思いますね。Windows APIとか、何者?と思いました(笑)。
(筆者):
研修が進むにつれて、内容も高度化していますよね。研修に対し今はどのような関わり方、受け方をしていますか?
(Dさん):
チームで取り組む演習が多くなってきましたが、その際はファシリテートを担当するようにしています。僕がメンバに話を振ることで、チームとして協力しながら学んで研修を乗り越えられたらいいなあ、と。
きちんとチームの議論を回せているかは講師の方も見守ってくれていますが、手探り状態で少し不安なところはあります。
それでも、日々の研修で高度な内容をチームで協力して取り組むことで、ひとりでは限界があることも乗り越えながら確実に実力をつけられているかな、と感じています。
(筆者):
受け身にならず主体的に研修に関わる中で、頼れる仲間と協力し、時には刺激を受けながらスキルアップに励んでいる姿が伝わってきますね!これからも研修頑張ってください!
おわりに
研修生の研修に対する貴重な生の声を聞くことができました。
インタビューから、この開発演習にて、苦労もありながら多くのことを学び、成長に繋げていることが伺えました。
また、今回インタビューをさせていただいたおふたりは今年の春に新社会人となり、同じ研修を受けている仲間でもあります。彼らは学生時代のバックグラウンドこそ違えど、セキュリティエンジニアとして成長するという同じ志のもと、研修を通してお互いに刺激を受けながら高めあっているというお話も聞け、今後の成長を非常に楽しみに感じています!
このようにNFLabs.研修ではセキュリティエンジニアを目指す仲間とともに切磋琢磨できる環境のもと、開発系の科目のほか、Offensive SecurityやDefensive Securityにかかわる実践的な科目を通してセキュリティエンジニアのスキルを学ぶことができます。ご興味のある方は是非お問い合わせください。