😎

Azure Active Directory のアカウントでログイン可能な外部環境向けプロキシーを作る

2021/09/03に公開

やりたいこと

特定の環境に SSH でログインすることがありますが、相手先によってはファイアウォールの設定を行うため特定の固定 IP からのアクセスを求められる場合があります。筆者は自宅で作業していますが、自宅はマンション加入のインターネット回線を利用しており固定 IP の契約がありません。

このようなとき便利なのがクラウドで、固定 IP を容易に取得できるため、仮想マシンを立ててそこからアクセスするという手段を取ることができます。

本記事では Azure に仮想マシンをプロキシーとして構築し、外部環境に対してアクセスする際に SSH ポートフォワーディングして相手先のサーバーにアクセスするまでの設定を行います。

やらないこと

Azure の内部ネットワーク上の仮想マシンが接続先である場合は Azure Bastion というマネージドサービスがあります。前述の通り今回は外部が接続先となるためこちらは利用しません。

Azure Active Directory

Azure Active Directory(Azure AD)は Azure の ID 基盤で、 Microsoft 365 のアカウントと統合されているため、ほとんどの企業では導入済みかと思います。

Azure AD は Azure のリソース権限管理にも利用されます。 Azure の仮想マシンにおいては、 Azure AD の資格情報を利用することで Linux 仮想マシンに接続できるようになります。

仮想マシンのセットアップ

Linux 仮想マシンを作成する

後で拡張機能をインストールする必要があるため、サポートされている OS を選択する必要があります。 Ubuntu や CentOS など主要な OS はサポートされています。詳細は参考文献を参照してください。

仮想マシンの作成手順は割愛します。今回の目的は固定 IP からの接続になりますので、静的 IP を指定するを忘れずに。作成後、必要に応じて sshd の設定を行います。

拡張機能をインストールする

Azure の Linux 仮想マシンに AADLoginForLinux 拡張機能をインストールすることで、 Azure AD のアカウントでログインできるようになります。

Azure Cloud Shell で下記を実行します。

az vm extension set \
    --publisher Microsoft.Azure.ActiveDirectory \
    --name AADSSHLoginForLinux \
    --subscription <サブスクリプション名> \
    --resource-group <リソースグループ名> \
    --vm-name <仮想マシン名>

成功すると以下のように provisioningState が Succeeded で返ります。

{
  "autoUpgradeMinorVersion": true,
  "enableAutomaticUpgrade": null,
  "forceUpdateTag": null,
  "id": "/subscriptions/***/resourceGroups/***/providers/Microsoft.Compute/virtualMachines/***/extensions/AADSSHLoginForLinux",
  "instanceView": null,
  "location": "japaneast",
  "name": "AADSSHLoginForLinux",
  "protectedSettings": null,
  "provisioningState": "Succeeded",
  "publisher": "Microsoft.Azure.ActiveDirectory",
  "resourceGroup": "***",
  "settings": null,
  "tags": null,
  "type": "Microsoft.Compute/virtualMachines/extensions",
  "typeHandlerVersion": "1.0",
  "typePropertiesType": "AADSSHLoginForLinux"
}

リソースを割り当てる

仮想マシンのアクセス制御(IAM)で、ユーザーまたはグループに対してロールを割り当てます。グループを割り当てた場合は、グループにログインさせるユーザーが所属していることを確認します。

ロール名 概要
仮想マシンの管理者ログイン sudo できる
仮想マシンのユーザー ログイン sudo できない(推奨)

今回の目的は仮想マシンそのものの設定ではなく、仮想マシンをプロキシーとして扱うことなので、管理者権限は不要です。

仮想マシンに接続する

ローカルマシンから仮想マシンへの SSH 接続は az ssh コマンド経由で行うことができます。まだ機能がプレビューのためデフォルトでは az ssh コマンドが利用できないため、拡張機能をインストールします。

az extension add --name ssh

拡張機能をインストールしたら、以下のように仮想マシンに接続できます。

az ssh vm \
    --subscription <サブスクリプション名> \
    --resource-group <リソースグループ名> \
    --vm-name <仮想マシン名>

外部環境への接続

az ssh のコマンドラインオプション -- 以下は ssh に渡されるため、以下のように指定すればAzure 仮想マシン経由で外部環境に接続できます。

ssh -o 'ProxyCommand=az ssh vm ... -- -W %h:%p' <ユーザー名>@<外部ホスト名>

以下のように ~/.ssh/config に設定しておけば ssh <接続名> のみで接続できます。

Host <接続名>
    ProxyCommand az ssh vm --subscription <サブスクリプション名> --resource-group <リソースグループ名> --vm-name <仮想マシン名> -- -W %h:%p
    HostName <外部ホスト名>
    User <ユーザー名>

費用等

静的 IP は保持しておく必要がありますが、仮想マシンは不要な時に停止できます。効率よく作業すればほとんど静的 IP の費用のみでよく、月額 500 円程度で済みます。

まとめ

自宅に固定 IP の契約がなくとも Azure を利用することで固定 IP を要求する外部環境にもアクセスできるようになりました。費用もあまりかからず、セットアップの手間もあまりないため、気軽に使えるのが良いですね。

参考文献

Discussion