はじめに
こんにちは。新卒1年目の塩谷です。
4月に入社してから3ヶ月が経過し、ようやく社会人としての生活にも慣れてきたと感じる今日この頃です。
FFRIでは、4月に入社してから3ヶ月の間、「エンジニアとして戦うための基礎を身に着ける」ことを目的として新人研修を行っており、つい先日、2019年度の新人研修が無事に終了しました。この記事では、2019年度の新人研修について、実際に受講した感想も交えながら振り返っていきます。
対象読者としては、「FFRIへの入社に興味があり、入社後にどういったサポート・トレーニングが受けられるのか、その詳細を知りたい」という現在就職活動中の方を想定しています。
募集要項の要件「必須条件」に「※セキュリティに関しての事前知識は必要ありません。」と書いているものの、実際のところセキュリティの事前知識なしで本当に大丈夫なのか不安という方は、具体的にどういったサポートを受けられるのか、この記事を通じて把握できると思います。
昨年度の新人研修の記事 も参考になるかと思います。
2019年度新人研修の内容
オリエンテーション
入社初日と2日目は入社式、オリエンテーション、ビジネスマナー研修を行い、FFRIの社内制度や基本的なビジネスマナーについて学びました。
PCセットアップ
ビジネスマナー研修修了後は、各人に支給されたノートPCのセットアップを行いました。ちなみに、支給されたノートPCのスペックは以下の通りでした。
- CPU:
Intel(R) Core(TM) i7-8850H CPU @ 2.60GHz
- メモリ: 32GB
- SSD: 1TB
- HDD: 2TB
- GPU:
NVIDIA Quadro P1000
ノートPCのセットアップ作業では、Git、Visual Studio、VMware Workstation等の業務に必要なソフトウェアをインストールした他、テキストエディタ等を各人の好みでインストールしました。今年の新人はVisual Studio Codeを入れている人が多かったです。レポート等をMarkdownで書くことが多いので、私のPCのVSCodeは専らMarkdownエディタとして働いています。
プログラミング課題
PCセットアップ終了後、C/C++によるWindowsシステムプログラミングの問題が5題出題されました。私はWindowsプログラミング未経験者でしたが、Microsoftの公式ドキュメント等で情報収集しながらコーディングを進めることができました。
FFRIでは、バージョン管理にGitを、ホスティングにGitHub Enterprise (GHE) を利用しています。このプログラミング課題においても、各人のソースコードはGitで管理を行い、GHEでプルリクエストを作成し、先輩エンジニアのレビューを受けるという形で進めていきました。
先輩エンジニアのレビューは非常に丁寧で、
- バグが発生しないような作り込み
- 適切なエラー処理
- 可読性の高いコーディング
等、様々な観点から指摘を頂きました。私の場合、約1週間の期間内でプルリクエストがApproveされた(=全てのレビューが通った)のは5問中2問でしたが、レビューを通じて多くの知識やコーディングスキルを習得することができました。ちなみに、残りの問題についてはその後の研修の合間にレビューをお願いしていました。先輩エンジニアは期間終了後も丁寧にレビュー対応して下さり、本当に有り難い限りです。
サイバーセキュリティ基礎・マルウェア解析
以下の内容について先輩エンジニアから講義を受け、演習に取り組みました。
セキュリティ技術者育成
代表的なサイバー攻撃や、攻撃の発見・検知と防御方法など、情報セキュリティの基礎的な知識について学びました。演習では、Nmap、OpenVAS、Metasploitといったツールを使い、脆弱性に関する知識を身に着けることができました。マルウェア動的解析
マルウェアを実際に動作させ、APIの呼び出しやプロセスの動作状態を見ることで解析を行う方法について学びました。演習では、API MonitorやProcess Monitorを使ったマルウェアの解析を行いました。リバースエンジニアリング
マルウェアをデバッガー上で動作させ、ディスアセンブラを用いて解析を行う方法について学びました。x86/x64アセンブリを読むことになるので、それらに関する基礎知識の講義から始まり、演習では、x64dbgを使ったマルウェアの解析を行いました。セキュアコーディング
バッファオーバーフロー等の脆弱性の原因とその解決策について学びました。演習では、サンプルプログラムの中から脆弱性の原因となる記述を探し、それを適切な記述に修正するということを行いました。
私はサイバーセキュリティに関する知識がほとんど無い状態で入社したのですが、この研修を通じてサイバーセキュリティの基礎的な知識・技術を習得することができました。特に、マルウェア解析のツールの使い方や、解析する上でのテクニックはその後のWindows解析研修や検知ロジック開発研修でも大いに役立ちました。
テクニカルサポート研修
企業におけるITシステムやネットワークに関する講義を受けました。学生の時に習ったことも含まれる内容でしたが、FFRIの製品やサービスを利用するお客様の環境という観点を持つことによって、製品のUX向上に役立つのではないかと感じました。
メモリダンプ解析研修
Windowsのクラッシュダンプファイルを解析し、問題の原因を究明する手法について講義を受けました。また、メモリダンプ解析の具体的な手法として、WinDbgを用いた手法を教わりました。WinDbgはコマンドが多く、公式ドキュメントも量が多いので、入門的な内容がまとまっている研修資料が非常に有り難かったです。
演習では、FFRIの製品を導入している環境で実際に発生したクラッシュの原因を、メモリダンプ解析によって調査するということを行いました。どれだけ作り込んでも製品のバグは発生しうる上に、特定の環境で偶発的に発生する問題にも対応する必要があるため、原因を究明するメモリダンプ解析の技術は、ソフトウェアエンジニアにとって必須だと感じました。WinDbgとはもっと仲良くなりたいと思います。
製品開発研修
実際の製品の開発を通して、製品開発業務の一連の流れを経験しました。大まかには、以下のような流れで開発を行いました。
- 要求仕様書を基に開発の見積もりを行い、開発計画書を作成
- 具体的に実装する機能をまとめて、機能仕様書を作成
- 機能仕様書を基に開発を行い、チーム内でレビュー
- 出来上がったコードを先輩エンジニアにレビュー依頼
- レビューが通るまで3~4を繰り返し
製品開発研修では、
- 新人たちが1つのチームとなって開発を行うこと
- 設定された期日までに要求を満たすよう開発を進めること
- バグが発生しないように作り込むこと
- 読者に過不足無く伝わるように文書を書くこと
といったことが要求されました。自分1人が使うだけのプログラムの開発においては、これらの要求を意識することは無いので、改めて実際の製品開発の大変さを実感しました。
製品開発研修は他の研修よりも長い期間行われるのですが、研修中に挟まっていたGWが今年は10連休だったこともあり、約1ヶ月にわたり研修が行われました。この研修期間中、チームとして一丸となって開発を行った結果、新人たちの間で連帯感が強まったと思います。
品質保証研修
実際の製品のテストを通して、品質保証業務の一連の流れを経験しました。大まかには、以下のような流れでテストを行いました。
- 機能仕様書・テスト要求分析を基にテストを設計し、テスト仕様書を作成
- テスト仕様書に従ってテストを実施
品質保証業務では、製品が仕様通りに動作するかを漏れなくチェックするのですが、機能仕様書に書かれている内容を基にテストを設計するので、テスターの立場に立ってみると、改めて過不足無く意図が伝わるように文書を書くことの重要性を思い知りました。
Windows解析研修
渡されたPE形式の実行ファイルのリバースエンジニアリングや、WindowsのWin32APIの解析を行う問題が5題出題されました。Windows上におけるアプリケーションの動作の仕組みを深く理解することは、マルウェア解析を行う上で必要不可欠です。基本的には、これまでの研修で習得した知識やツールを駆使し、適宜情報収集をしながら解き進めていきました。
この研修においては、例外的に他人との情報共有が禁止されていたので、自分で仮説を構築し検証するという能力が身に着きました。業務においては積極的に情報共有をすべきですが、未知の問題に遭遇した際の自己解決能力を高めることも重要だと感じました。
問題を解く中でWindowsの知識が身に着く他、解答に至るためのアプローチが複数存在する問題もあったので、非常にやりがいのある研修でした。期間中に全ての問題を解くことができたのは、私にとって大きな自信になりました。
検知ロジック開発研修
マルウェアの検知ロジックを考え、FFRIの製品に実装するという課題に取り組みました。
マルウェアの検知ロジックを考えるために、静的解析・動的解析を行ってマルウェアの挙動を把握するところから始まり、実害が発生しないタイミングで止めるためには具体的にどの段階で検知すべきかを検討し、実装しました。
同じマルウェアであっても検知ロジックは1通りとは限らず、実際研修後に確認してみたら各人で実装した検知ロジックは異なっていました。解析に基づいて、どのような条件を設定すればマルウェアだけを検知できるか、を考える必要があるため、仮説構築・検証能力が試される研修だと思いました。
また、ウイルス対策ソフトにとって、過検出の割合を低減することは非常に重要であるため、この研修においては、約500個の正常なファイルに対して、実装した検知ロジックで1件も過検出しないことも要求されました。
ちなみに、500個のファイルを手動で実行していくのは現実的ではないため、各人で様々な工夫を凝らして自動実行のプログラムを書いていました。私はWindowsプログラミングの勉強も兼ねて CreateThread
と CreateProcess
を使って並列実行するプログラムを書きました。
機械学習研修
機械学習を用いて、用意されたテストデータの分類を行うという課題に取り組みました。
課題を通して、データの前処理、モデルの学習、およびモデルの評価といった機械学習の一連の流れを経験しました。この研修においてのみPythonを使用しましたが、Pythonおよび機械学習の経験が無い人でも理解しながら課題を進めることができる内容でした。
各人が作成したモデルの分類性能を測るために、この研修ではKaggleのようなコンテスト形式でテストデータの分類を行いました。期間中はスコアサーバーが稼働しており、リアルタイムで各人が提出したモデルの正解率を見ることができました。0.1%でも正解率を上げるために、特徴量エンジニアリングやモデルのパラメーターチューニングなどに奮闘し、非常に楽しい研修となりました。
2019年度の新人研修を振り返って
大まかな内容ではありますが、上記のような研修を3ヶ月間にわたって受講しました。
新人研修を終えた今、振り返って自分が得たものを考えてみると、Windowsのプログラミングスキル、セキュリティの基礎知識、マルウェアの解析技術など枚挙に暇がなく、入社時点の自分と比べて、大いに成長できたと感じています。
新人の中には入社時点でサイバーセキュリティの知識を有している方も居ますが、私のようにほとんど知識が無い状態でも新人研修を無事にこなすことができました。募集要項の「C/C++プログラミングができる方、コンピュータサイエンスの基礎を習得されている方」であれば問題なくこなせる内容だったと感じています。
おわりに
2019年度の新人研修について紹介しました。入社後の研修制度に不安があった方にこの記事が役立てば幸いです。
FFRIではサイバーセキュリティに関する研究開発を希望するエンジニアを募集しています。採用に関しては こちら を御覧ください。