🥦

Azure上の仮想マシンにVPN接続する方法と同仮想ネットワーク上のAzure App Serviceからプライベート接続する方法

2023/02/01に公開

前回Azure上の仮想マシンにFTPサーバを立てました。
https://zenn.dev/shimotani/articles/02794962aee4e5
今回はよりセキュリティを高めることを目的として、作成した仮想マシンにVPN接続してリモートデスクトップ接続したり、FTP接続したりする方法、また同じ仮想ネットワークにAzure App Serviceを作成してそこからプライベートIPで仮想マシンにFTP接続する方法の備忘録です。
つまり、目標とする構成は以下の図の通りです。

仮想ネットワークにVPN接続するまで

今回も詳しい方法については、公式リファレンスで重複するので、端折りつつ行きたいと思います。
VPN接続についてはポイント対サイトを想定して行います。
手順の詳細は公式リファレンスの通りです。
簡単に流れをまとめると、

  1. VNet を作成する(仮想マシンを作成している場合はセットで作成される)
  2. VPN ゲートウェイを作成する
  3. ルート証明書を生成する
  4. クライアント証明書を生成する
  5. VPN クライアント アドレス プールを追加する
  6. ルート証明書の公開キー情報をアップロードする
  7. エクスポートしたクライアント証明書をインストールする
  8. VPN クライアントの設定を構成する
  9. Azure に接続する

となります。それぞれの詳しい方法はリンクに記載があります。
一つ詰まったところとしては、8.のVPN クライアント プロファイルを構成するの部分VpnClientSetupAmd64.exeをダブルクリックした際に黒いコンソールが一瞬移るだけでインストールができているかわかりませんでした。
対策として、こちらの記事を参考にexeのディレクトリでコマンドプロンプトを開き、VpnClientSetupAmd64.exe /T:C:\Installを実行することで、VPN接続の設定画面を見ると無事インストールされていることを確認しました。

上記画像の接続からでVPN接続を行い、Windowsのリモートデスクトップから仮想マシンのプライベートIPを入力することで無事VPN接続でリモートデスクトップ接続ができることを確認しました。

以上から作成したクライアント証明書VPN クライアント プロファイル(今回の場合VpnClientSetupAmd64.exe)をインストールすることで、他のPCでもリモートデスクトップ接続できます。
また、FTP接続も行えることを確認しました。ただしこの場合は、下記の図のように、IISマネージャのFTPサイトの「ファイアウォールのサポート」の「ファイアウォールの外部IPアドレス」を仮想マシンのプライベートIPアドレスに変更する必要があります。
これにより前回記事の通りVPN接続しているPCからエクスプローラーでFTP接続が行えます。

Azure App Serviceから仮想マシンのプライベート接続

Azure App Service(以下、アプリと呼ぶ)を作成してそこから仮想マシンにFTP接続したい場合、作成したアプリから、仮想マシンのグローバルIPに向けてFTP接続をすれば良いです。
しかし、セキュリティ面を考え、仮想マシン側のIP制限を行いたい思っていました。
ただこの場合、仮想マシンのグローバルIPが必要なのと、FTP接続する際に仮想マシンのIIS側でアプリのドメイン名でのIP制限ができなかったことから、IP制限するにはアプリのIPを固定する必要がある、など色々めんどくさいことがわかりました。
このような背景より、アプリを仮想ネットワーク上に入れてプライベートIPで接続する方法でセキュリティ面を担保しようと考えました。

アプリの仮想ネットワーク統合

アプリの作成についてはこちらのサイトなどを参考にしてください。
アプリを仮想マシンの仮想ネットワークに入れるためにはVNET統合というのを行います。
これも公式リファレンスがありますので、こちらの手順でVNET統合を行ってください。
統合後、アプリの「ネットワーク」を見ると以下の通りVNET統合がオンになっていると思います。

また、仮想ネットワークの「サブネット」を確認すると以下の通り、設定したサブネットが表示されていると思います。今回アプリはappという名前にしました。上のdefaultは仮想マシンで、GatewaySubnetはVPNゲートウェイだと思います。

これでプライベートIPで接続する準備は整いました。

アプリからの接続の確認

今回作成したアプリの以下のPHPで作成したものです。仮想マシンのFTPサイトの「text.txt」をとってきて、画面にテキストファイルの中身を表示して、varディレクトリに「get.txt」として保存するといったものです。
アプリに直接ファイルをデプロイする方法については以下を参考にしてください。
https://zenn.dev/shimotani/articles/b33ea7caa310cd

index.php
<?php
$ftp_server="10.0.0.4"; //FTPサーバーのプライベートIPアドレス
$local_file = './var/get.txt';//ダウンロードしたファイルの置き場所
$server_file = 'test.txt';//FTPサーバー上のファイルのパス
$ftp_user_name="ftp_user"; //ユーザー名
$ftp_user_pw="********"; //パスワード
echo $_SERVER["REMOTE_ADDR"]; // 接続IP確認

//FTP接続確立
$conn_id = ftp_connect($ftp_server);

//ユーザ名とパスワードでログイン
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pw);

//接続確認
if ((!$conn_id) || (!$login_result)){
    die("FTP接続失敗!");
}

// パッシブモードをオンにする
ftp_pasv($conn_id, true);

if (ftp_get($conn_id, $local_file, $server_file, FTP_BINARY)) {
} else {
    echo "ダウンロード失敗!\n";
}

//FTP接続を閉じる
ftp_close($conn_id);

//ローカルに保存したファイルを読み込む
$filepointer=fopen($local_file, "r");

//<div>タグの中にファイルの内容を出力する
print('<div id="csv">');
while(!feof($filepointer)){
    $fileline = fgets($filepointer);
    print($fileline );
}
print("</div>");

fclose($filepointer);

アプリに接続した結果以下のようにうまくテキストファイルの中身が表示できました。

varディレクトリの中身は、ファイルがダウンロードされています。

プライベートIP接続のIP制限

プライベートIP接続でアプリと仮想マシンがFTP接続できることが確認できました。さらに仮想ネットワーク上でのセキュリティを高めるためにプライベートIP接続のIP制限を行います。
仮想マシンの「ネットワーク」で「受信ポートの規則を追加する」から以下の通り、FTPについて、プライベートIPを設定することでアプリから仮想マシンの接続許可が行えます。あとは、これより優先度が低い規則にFTP接続を拒否する設定を追加すれば、仮想マシンに対してアプリからしかFTP接続できない制限がかけられると思います。

以上です。

Discussion