※本ブログに取り組んだ本人は既に卒業済みのため、メンターである@ken5scal(鈴木研吾)が本人からいただいたドラフトを一部編集した上で公開しています。 ※ドラフト自体は7月にいただいていたのですが、手違いにより公開が遅れてしまいました。
こんにちは、三井物産デジタル・アセットマネジメント(MDM) のコーポレートシステム部にインターンとして参加させていただいた海原(@hrt_k2002)です。
3ヶ月弱のインターンシップを通して、ソフトウェアが抱えるリスクについての知見を深め、DevSecOpsの手法を取り入れた脆弱性管理システムの開発に取り組みました。
きっかけ
大学で数理工学を学び、大学院からは情報セキュリティの研究をすることになっていた私は、「金融」や「セキュリティ」というワードには強く関心を寄せていました。
そんなときに、サポーターズの1on1イベントで LayerX代表取締役CTOの松本さん( @y_matsuwitter)と面談する機会をいただき、そこでLayerXの「Fintech事業部」(MDM)について紹介いただきました。
セキュリティについて実績と言えるものがほぼなかったにも関わらず、このFintech事業部でインターンシップをする機会をくださった松本さん( @y_matsuwitter )には感謝しかないです。
MDMのコーポレートシステム部が抱えていた課題
MDMのコーポレートシステム部の業務の中に自社プロダクトの脆弱性管理というものがあります。脆弱性など存在しないのがベストではあるのですが、実際には意図せず脆弱性が混入したり、まだ誰にも知られていなかった脆弱性が後から発覚したりする、といったことは往々にしてあります。そのように日々現れる脆弱性に対して優先度をつけて対処していくために、脆弱性を管理しておくことが必要です。しかしながら、この脆弱性の管理は大部分が人の手で行われており、手数がかかってしまう、チェック漏れが発生しやすくなるといった問題がありました。このような状況を受けて、脆弱性を自動検出してそれらを管理し、対応が必要なものは通知してくれるといったシステムの開発に取り組むことになりました。
ソフトウェアが抱えるリスク
システムを開発するにあたって、ソフトウェアがどのような攻撃にさらされるリスクがあるか、そしてそれらのリスクにどのように対処できるのかを調査しました。結果、ソースコードそのものに含まれる脆弱性に対してはSAST(静的解析)ツール、サードパーティ製のパッケージを経由して入り込む脆弱性に対してはSCA(ソフトウェア構成分析)ツールが使えることがわかりました。また、クラウドの設定ミスによって生じる脆弱性も視野に入れ、クラウドスキャンツールによる解析結果もシステムに取り入れることにしました。
DevSecOpsについて
SASTやSCAによるコードの解析といったセキュリティ関連の処理を一連の開発プロセスに組み込む手法として DevSecOps というものがあります。開発チームと運用チームが互いに協力し合いながら開発を進める DevOps は既に一般的ですが、そこにさらにセキュリティのプロセスを同時に行うことでより手軽に安全性を高めようという考え方です。
システムの概要と設計
今回の開発において目指した主な機能は次の通りです。
- 脆弱性管理と資産管理
- 開発で利用しているソフトウェアや、クラウドの設定等に関する脆弱性を一元的に管理
- 会社で保有するソフトウェア・ハードウェア資産も管理
- 脆弱性の自動検出
- AWSのサービスを用いて脆弱性を自動検出&システムに取り込み
- プロセス全体を自動化し、DevSecOpsを実現する
- 発見された脆弱性の通知
- ソースコードに脆弱性が発見されたときにGitHubのissueやSlackで通知する
- 対応が必要だが未着手の脆弱性についてリマインド
システム全体の構成は↓のようになりました。他のサービスとの接続性の良さを考えて、スキャンツールは全てAWSのサービスで完結させました。
デモの様子
脆弱性を含んだソースコードをGitHub上でマージすると、CodePipeline上でスキャンが走り、数分後にissueが立てられるようになりました。
インターンシップを通して学んだこと
セキュリティの知識について
これまでの開発経験はバックエンドやフロントエンド開発がメインで、セキュリティについてもそれに付随する知識しか持ち合わせていませんでした。
しかし、今回のインターンの中でセキュリティの専門的な知識をインプットする時間を十分にとっていただき、メンターのken5さんにもサーベイの方向性を示していただいたので、専門的な知見を効率的にインプットできたという実感があります。
開発について
AWSのサービスをここまでフルに使ったインフラの構築は初めてで、ポリシーの設定など戸惑うことも多かったです。それでも、メンターの助言やAIの力を借りて、脆弱性の検出→通知の機能まで作り上げられたことは私の中で非常に自信になりました。特に、気にはなっていたけれど使えていなかったSQSというサービスを組み込めたことが個人的には嬉しかったです。
また、Goを使った開発も3年ぶりということで改めて学ぶことが多かったと感じます。以前Goを書いていたときにはほぼデファクトスタンダードだったGORMというORマッパーが、「GORMは使わない方がいいですね」と言われるまでになっていたことは驚きでした。他にも、技術選定の際にいろいろアドバイスいただいたエンジニアの皆さんには感謝です。
出社について
最後に、インターンシップを通して感じたこととして、オフィスで作業しているときとリモートで作業しているときでは過ごす時間の濃さが違うなと思いました。もちろん感じ方は人によって異なると思いますが、家で作業しているときと比べて、オフィスでは社員の皆さんに見られているという良い緊張感を保てますし、何よりオフィスで働く方と話す機会が圧倒的に多いので会社の理解が進むと思いました。インターンシップにおいては、業務で価値を出すことと同じくらいその会社を理解して今後のキャリアイメージに活かすことが大切だと思っているので、限られた期間のインターンシップという機会を最大限活用するには、なるべく多く出社するべきだと感じました。
おわりに
最後になりましたが、MDMの皆さんはとてもフレンドリーで面白い方が多く、楽しくインターンシップの期間を過ごすことができました。Notionの自己紹介は読んでいて飽きないですし、Slackの会話でも何度も笑わせてもらいました。もちろん技術に関してもken5さんをはじめ多くの方にお世話になりました。3ヶ月に満たない期間ではありましたが、本当にありがとうございました!