NFLabs. エンジニアブログ

セキュリティやソフトウェア開発に関する情報を発信する技術者向けのブログです。

OpenVPN管理サービスを作ってみた

OpenVPN管理サービスを作ってみた

はじめに この記事は、NFLaboratories Advent Calendar 2023 - Adventar 3日目の記事です。

みなさん、こんにちは。研究開発部で製品開発を担当している小川です。

突然ですが、みなさんは先日弊社が開催した学生限定イベントNFLabs. Cybersecurity Challenge for Students 2023をご存知でしょうか?

このイベントの脆弱性診断/ペネトレーションテストの分野の問題では、私たちが開発しているセキュリティトレーニングプラットフォームが使用されました。この記事では、プラットフォームに新しく追加されたVPN接続機能の裏側について紹介したいと思います。

OpenVPN採用の経緯

私たちのプラットフォームではVPN接続機能を提供するためにOpenVPNを採用しています。

昨今VPN接続を提供しようと思ったらAWS VPNのようなクラウドサービスを使うのが一般的かもしれません。しかし、我々があえてOpenVPNを採用したのは理由があります。それは、AWSのサービスではリバースシェルが張れないという問題*1があったためです。

実践的なセキュリティのトレーニングを実施するためにはリバースシェルを使った問題は避けては通れません。そのため、リバースシェルを張ることのできるOpenVPNを採用することとしました。しかし、OpenVPNを採用したために別の問題が発生しました。

設定ファイルの生成

OpenVPNサーバーに接続するためには設定ファイル(以降ovpnファイル)を使った接続がよく使われると思います。しかし、このovpnファイルの生成機能自体はOpenVPNサーバーには備わっていません。そのため、OpenVPNサーバーの管理者はovpnファイルを作成し、何らかの方法でユーザーにファイルを渡す必要があります。

あらかじめ参加人数がわかっている研修やイベントであればあらかじめファイルを作っておき、それを渡すという方法でも問題ないかもしれません。しかし、トレーニングプラットフォームはオンデマンドでユーザーが増えていくことが想定されるためこの方法を取ることができません。

そこで、自前で設定ファイルを管理するためのWebアプリケーション(以降Webアプリ)をREST APIで作成することとしました。

APIの設計

必要な機能としてはひとまずユーザーごとにovpnファイルが生成できて、生成されたovpnファイルがユーザーごとに取得できれば問題なさそうです。現状使うことはなさそうですが、削除機能も作っておくと動作確認の時に便利そうなのでついでに作っておくことにします。

上記より実装するエンドポイントは以下の3つとしました。

  • ovpnファイルを生成
  • ovpnファイルを取得
  • ovpnファイルを削除

各エンドポイントのシーケンス図とAPI仕様は以下の通りです。

※ 認証のためのエンドポイントも作りましたが本筋とは外れるので割愛します。

ovpnファイルを生成

ovpnファイルを取得

ovpnファイルを削除

Fast APIを使った実装

REST APIはFastAPIを使って実装をしました。世間で流行っていて興味があったところにちょうどREST API開発の必要がでたので採用してみました。

公式ページにあるような開発速度が200%~300%向上し,簡単に実装できるというのがどの程度のものかと思ったのですが想像以上でした。

この程度のパラメータしかとらないようなWebアプリでもバリデーションは結構大変だなという印象があったのですが、pydanticのBaseModelで型定義とバリデーションルールを記載するだけなので一瞬で実装できました。 コードの行数を測ってみたところ全部でたったの330行でした。

終わりに

トレーニングプラトフォームに追加したVPN接続機能にはこのような裏側がありました。

最後に

  • AWS のサービスを使ってリバースシェルを張る方法をご存知の方がいたら教えてください
  • 新規開発をする場合はFast APIを積極的に採用することをお勧めします
  • 個人的には私たちが開発しているトレーニングプラットフォーム以外の場でも使ってもらえないかなと思っています

*1:私が知らないだけだったらすいません