【SSLVPN】OPNsense on Azure

クラウドへリモートアクセス環境を準備する場合,クラウドネイティブな方法もあるがVPN仮想アプライアンスをたててオンプレライクにSSLVPNで乗り込みたいシーンがよくある。(私の案件では)
クラウドにアカウントを作りたくない,プロトコルが対応していない等いくつか理由があるが,一番の理由は「クラウド構築担当している人がVPNとか全然分からんからNW部隊に丸投げしてくる。そんでもってユーザ管理や運用はそっちでやってね。」というもの。(

ぼやいても仕方ないので毎度VPN対応のFW仮想マシンをたてて構築するのだけれど,まぁ高いのなんの。そこで丁度よさそうなのがOPNsenseだったので構築手順を残しておく。

公式ドキュメントがあるので基本それに従って進めていく。
https://docs.opnsense.org/manual/how-tos/installazure.html

構成イメージ

バージョンは以下の通り。

サーバ側
OPNsense 24.1.1-amd64
FreeBSD 13.2-RELEASE-p9
OpenSSL 3.0.13

クライアント側
OpenVPN GUI v11.47.0.0

仮想マシン作成

ユーザ設定で認証を証明書にするとデプロイ失敗するのでパスワードを設定する。
パブリックIPとネットワークセキュリティグループを適切に設定してデプロイ完了したらHTTPSでログイン。

続いてSSLVPNの設定へ。

OPNsense設定

まずは認証関連の設定。今回は自己証明書で構成を組む。

CA作成

System: Trust: Authorities
※ 中身は省略

サーバ証明書作成

System: Trust: Certificates
※ 中身は省略

2FA用のGoogleAuth登録

System: Access: Servers
サーバ名を入れて,TypeでLocal+OTP。それ以外はそのまま。

SSLVPN Server作成

Serverを作成して~という流れはLegacyとあるのでインスタンスの作成。その前にTLS Keyを作成する。

認証用なのでAuthオンリーで。

入力したパラメータ一覧は以下の通り。それ以外は空欄ないしはデフォルトのまま。

GeneralSetting

  • Role: Server
  • Description: 適宜
  • Server(IPv4):172.16.1.0/24

Trust

  • Certificate: SSLVPN CRT(作成したサーバ証明書)
  • Certificate Authority: SSLVPN CA(作成したローカルCA)
  • Verify Client Certificate: none
  • Certificate Depth:One(Client+Server)
  • TLS static key: TSL-Key(作成したもの)
  • Auth:SHA256
  • Data Ciphers: AES-256-GCM

Authentication

  • Authentication: Google Auth(先ほど作成したもの)
  • Renegotiate time: 0 ※ OTP認証のため再接続になるとTokenが切れているため認証エラーとなってしまう。そのため,ここは「0」に設定する必要がある。OTPでなければ不要。

Routing

  • Local Network: 10.0.0.0/16 (VNetにアクセスできれば良いのでVNetに割り当てたセグメント指定)

SNAT設定

VPNのトラフィックをインタフェースでSNATする。
Modeをマニュアルへ変更。

Interface,Source addressをそれぞれ設定。

結果。

リモートアクセスユーザ作成

ユーザ名,パスワードを入力し,OTP用の設定を入力する。

ここでSaveをするとユーザ証明書作成ページに跳ぶ。自己証明書作成を選択し、その他項目も適宜入力して作成する。

その後,GoogleAuthenticatorへ登録するためのQRコードが生成されるのでスマホアプリで登録する。

OpenVPNClient設定エクスポート

TypeはFileonly。Windowsの証明書ストアのオプションは外す。

一番下にあるユーザ用の構成ファイルをダウンロードして完了。

FW設定

今回,Azure上で構築しているので通信制御はNetworkSecurityGroupで対応することとして,OPNsenseのルールは全許可とした。よってここは省略。(LANとOpenVPNのIFにIN全許可ルールを1行入れたのみ)

接続試験(Windows11)

サーバ側でも設定した再認証させない設定をダウンロードしたファイルにも追記する必要がある。

dev tun
persist-tun
persist-key
auth SHA256
client
verb 5  # デバッグ用
ping-restart 0  # これ0に指定する必要がある
resolv-retry infinite

保存した設定ファイルをOpenVPNクライアントにインポートし,接続すると認証画面が出るので「 Token + Password 」の並びで入力する。これが分からなくてサーバ設定見直したりキャプチャ眺めたり,VM作り直したりとかなり迷走した orz。

無事に成功するとIPアドレスが割り当てられAzure内に通信できるようになる。

疎通確認

無事Pingも通った。

ping 172.16.1.1  # Tunnel対向

172.16.1.1 に ping を送信しています 32 バイトのデータ:
172.16.1.1 からの応答: バイト数 =32 時間 =187ms TTL=64
172.16.1.1 からの応答: バイト数 =32 時間 =186ms TTL=64

172.16.1.1 の ping 統計:
    パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 186ms、最大 = 187ms、平均 = 186ms
Ctrl+C
^C

>ping 10.0.0.5 -t # VPNサーバAzure内部IP

10.0.0.5 に ping を送信しています 32 バイトのデータ:
10.0.0.5 からの応答: バイト数 =32 時間 =187ms TTL=64
10.0.0.5 からの応答: バイト数 =32 時間 =187ms TTL=64

10.0.0.5 の ping 統計:
    パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 187ms、最大 = 187ms、平均 = 187ms
Ctrl+C
^C

>ping 10.0.0.4 -t # Azure内同一Subnet別インスタンス

10.0.0.4 に ping を送信しています 32 バイトのデータ:
10.0.0.4 からの応答: バイト数 =32 時間 =189ms TTL=63
10.0.0.4 からの応答: バイト数 =32 時間 =189ms TTL=63

10.0.0.4 の ping 統計:
    パケット数: 送信 = 2、受信 = 2、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 189ms、最大 = 189ms、平均 = 189ms
Ctrl+C
^C

以上で完了。おつかれさまでした。

Microsoft Azure Fundamentals

先日,Microsoftのオンラインセミナー受講したらバウチャーを配布してくれたので受験してきました。
Azureの初級という位置づけで,「クラウド初めてさわる」「これからAzure案件に関わる予定」という人向けのようです。(個人的には新人のスキルアップに丁度良い教材&資格ではないかと思っています。)

私自身は初心者ではありませんが,Azureというクラウドサービスを理解するというきっかけには丁度良い試験でした。もちろんセミナーを受けただけでは受からないので

  • Microsoftのラーニングパスを通して理解を深める。
  • Azureアカウントを作成して一通り操作や見方を覚える。

と,ある程度対策をしたうえで受験し,無事に合格しました。

個人的にオススメラーニングパスは以下の通り。

Microsoft Azure クラウドの概念について調べる (AZ-900) ・・・ 4つのモジュールがあり,これはオンラインセミナーと結構重複していたので,復習のためやっておくと良い。

Azure の基礎 ・・・ 12個のモジュールがある。実際にAzureを操作してVMや可用性ペアを作るなどのハンズオンが盛り込まれている。まったくのクラウド初心者だと,これくらいまでは最低限やっておかないと厳しいかもしれない。

以下のモジュールでさらに理解を深めておくと余裕をもっていけるはず。ただ,受けた感想として,クラウド一般的な技術の話というよりは,Azureに特化したサービス(ポリシー/課金/サポート)に重点を置いて対策をとったほうがよいと感じた。

Azureを触ってみてAWSとは違う使いやすいさ,チュートリアルの豊富さが良いと感じたので今後個人的にも使ってみよう。