💻

Argo Tunnel でブラウザからSSH接続をする方法

2021/08/10に公開

はじめに

CloudflareのArgo Tunnelを使用し、ブラウザ上からVPSにSSH接続をする方法を紹介します。

この記事ではCloudflareのアカウントを持っている、自由に使用できる独自ドメインを持っている方を対象としています。

制作背景

  • 普段VPSなどを利用してDiscordのBotを制作しており、SSH接続を多用していること
  • 私は学生のため学校からVPSに直接アクセスすることが難しい状況にあること
  • 外出先からも手軽にSSH接続をできるようにしておきたいこと

という観点からブラウザでSSH接続をする方法を模索していました。

制作手順

準備

  1. Cloudflareにドメインを登録する
     こちらは今回の記事では割愛します。
  2. VPSを用意する
     今回はUbuntu20.04を使用して解説していきます。

1. Cloudflare Teamsの設定

こちらの公式ドキュメントに従ってTeamsの設定を行います。
https://developers.cloudflare.com/cloudflare-one/setup

2. Access Applicationの作成

1. Accessタブの中にApplicationという項目を選択します。

2. "Add an application" というボタンが表示されるのでクリックします。

3. "Self-hosted" と "SaaS" の2つの選択肢がありますが今回は左の "Self-hosted" を使用します。

4. アプリケーション名・ドメインを設定します。

ここではSSHをする際に使用したいドメイン・サブドメインを指定します。

解説画像では、

アプリケーション名:Sample SSH
ドメイン設定:ssh-sample.example.com

と設定しました。

5. SSH接続をする際に使用する認証の設定を行います。

認証に使うルール名、アクション、認証方法などの設定があります。

今回は自分のEmailで認証を行います。

ルール名には好きなルール名、アクションにはAllow、Configure a ruleのIncludeにはEmailsを設定し、右の欄にアクセスを許可するメールアドレスを入力します。

解説画像では、メールアドレスに example@example.com を指定しました。
このメールアドレスは自分が普段使用していてログイン時に使用できるアドレスを設定してください。後ほどここで指定したメールアドレスにワンタイムパスワードが送信されます。

6. アプリケーションがブラウザでSSHコンソールをレンダリングするように設定します。

こちらの設定が今回の記事の肝となります。

CORS settingsやCookie settingsがありますがここで重要になるのは画面の一番下にあるcloudflared settingsです。

"Enable automatic cloudflared authentication" のトグルをオンにし、"Browser rendering" をプルダウンメニューの中からSSHを選択します。

右上の"Add application"を押し、アプリケーションの作成を完了します。

3. cloudflaredのインストール・設定

1. cloudflaredをインストールします。

タイトルにもあるArgo Tunnelを使用するためにcloudflareが配布しているオープンソースソフトウェアのcloudflaredをインストールします。

以下の公式ドキュメントにダウンロードリンク・インストール手順があります。
VPSにダウンロードしてインストールを行ってください。

https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/installation

Ubuntu20.04の例

sudo wget https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i ./cloudflared-linux-amd64.deb

2. Argo Tunnelを作成します。

ここではCloudflareとVPSが通信するためのトンネルを作成します。

ここからはほとんどのOS共通のコマンドとなります。

cloudflared tunnel login

と実行することでログインするためのリンクが表示されます。

リンクを踏み、2-4の手順で登録したドメインを選択します。
(画像を取ることができませんでした。申し訳ありません。)

cloudflared tunnel create sample-ssh

と実行することでトンネルが作成されます。

この際に表示されるUUIDは後ほど必要になるのでコピーしておきます。

3. SSHに必要な情報をトンネル設定に書き込みます。

vim ~/.cloudflared/config.yml

好きなエディタで~/.cloudflared/config.ymlを次のように編集します。

tunnel: 6ff42ae2-765d-4adf-8112-31c55c1551ef
credentials-file: ~/.cloudflared/6ff42ae2-765d-4adf-8112-31c55c1551ef.json

ingress:
  - hostname: ssh-sample.example.com
    service: ssh://localhost:22
  - service: http_status:404

tunnelには先ほどコピーしたUUIDをペーストします。
credentials-fileはjsonの名前をコピーしたUUID.jsonとします。

hostnameには2-4で設定したドメイン名にします。

最後に

cloudflared tunnel run sample-ssh

と実行し、トンネルを起動させます。

これでVPSでの作業は終了となります。

4. Argo Tunnelをドメインに設定

Cloudflareに戻り2-4で設定したドメインのDNSの設定ページを開きます。

DNSにCNAMEレコードで6ff42ae2-765d-4adf-8112-31c55c1551ef.cfargotunnel.com のように3-2でコピーしたUUID.cfargotunnel.comのレコードを追加します。

5. ブラウザから2-4で設定したドメインにアクセスする

2-4で設定したドメインにアクセスすることでSSHのログインページが表示されます。

2-5で設定したメールアドレスを入力し、送られてきたメールに記載されているワンタイムパスワードを入力するとユーザー名を入力する画面が表示され、次に秘密鍵、VPSのパスワードを入力する画面が表示されます。

すべての情報を入力し終わるとSSHに接続することができます。

以上でArgo Tunnelを使用してブラウザからSSHをすることができました。
大変お疲れ様でした。

おまけ

ブラウザからSSHをする際、ユーザー名、秘密鍵、パスワードを入れるのはめんどくさいと思うかもしれません。

次の手順を実行することでそれらの入力をスキップすることができます。
ただし、VPSのユーザー名がメールアドレスの@の前と一致している必要があります。

1. 手順2で使用したAccessタブの中のservice Authという項目を選択します。

2. applicationと書いてあるプルダウンメニューから作成したアプリケーションを選択し、右のGenerate certificateを押します。

ここで作成した公開鍵を次の手順で使用します。

3. VPSにSSHの追加設定を行います。

/etc/ssh/ca.pub というファイルを作成し、その中に先ほど作成した公開鍵をコピーします。

次に/etc/ssh/sshd_configをお好みのエディタで開き、

TrustedUserCAKeys /etc/ssh/ca.pub

を追記します。

最後に sudo systemctl restart sshを実行しOpenSSHサーバを再起動します。

以上です。

おわりに

Argo TunnelはほかにもGUIのデスクトップ表示をブラウザで行うことができるらしいので今後機会があれば挑戦していきたいと思います。

読んでくださった皆様ありがとうございます。

また、Argo Tunnelを紹介してくれた2レジさんありがとうございました。

Discussion