ブラウザから ConoHa に SSH で繋ぎたい（Cloudflare Zero Trust）

この記事は、[ConoHa Advent Calendar 2024 14日目](https://qiita.com/advent-calendar/2024/conoha)の記事です。
今回は清楚かわいい ConoHa ちゃんにブラウザから SSH 接続できる環境を作成しています。

# コピー・ペーストがしたいです

ブラウザからの SSH 接続は ConoHa ちゃんであれば[コントロールパネルのコンソール](https://support.conoha.jp/v/console/)からできます。

ただこの機能「コピー・ペーストが利用できません」

「テキスト送信」でまとめてコマンドを送ることができますが、わたしは**コピー・ペーストがしたいです**

ということで Cloudflare の Zero Trust が Browser SSH を提供しているようなので、作成していきます。

## 仕組み

[Self-hosted applications ・ Cloudflare Zero Trust doc](https://developers.cloudflare.com/cloudflare-one/applications/configure-apps/self-hosted-apps/)

![alt](https://developers.cloudflare.com/_astro/network-diagram.0qIzpPCm_Z2iA8cg.webp)

VPS にエージェントをインストールして ConoHa ちゃんに Cloudflare のネットワークに参加してもらいます。

Cloudflare 上に SSH クライアントアプリを展開して、あとはブラウザからアクセス。終わり

ネットワークは Cloudflare がいい感じにしてくれます。ポート開放もいりません

アプリには認証があり、あらかじめ設定した認証方式（GitHub や Google など）で制限します
（今回はめんどくさいので初期設定であるメールアドレスのワンタイムパス認証です）

実際の動きは[つないでみる](#つないでみる)を見てください。

# 目次

 1. VPS をつくる
 1. Tunnel をつくる
 1. Application をつくる
 1. つないでみる

# 前提条件

 - Cloudflare アカウントを持っていること
 - クレジットカードを持っていること
     - 無料です
     - が、Zero Trust 使用開始時にカード番号入力が必要です（不正利用対策？）


# VPS をつくる

~~生贄となる~~ ConoHa ちゃんを作成します。

この後のセットアップ作業で SSH を使うので SSH のセキュリティグループ設定は必要です。

![alt](https://qiita-image.cloudremix.net/ConoHa-Create-VPS.jpg)


# Tunnel をつくる

Cloudflare <-> VPS 部分となる Tunnel を作成します。

Cloudflare のダッシュボードから「Zero Trust」を開いて

![alt](https://qiita-image.cloudremix.net/Cloudflare-Zero-Trust.jpg)

「Tunnels」から新しい Tunnel を作成していきます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel.jpg)

タイプで「Cloudflared」を選んで

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel-Type.jpg)

名前をつけます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel-Name.jpg)

インストール先の OS やアーキテクチャを選択。
すると、下側にエージェントインストールコマンドが生成されるので、左側のほうをコピペ
（右側は更新のとき用）

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel-configure.jpg)

作っておいた ConoHa ちゃんに SSH 接続してコマンドを丸っと貼り付け実行します。
`cloudflared installed successfully`になればOKです。SSH は不要なのでセキュリティグループは塞いでOKです
（スタートアップスクリプトに仕込めば SSH も不要かも）

```:shell
# sudo cloudflared service install xxx
2024-12-01T00:00:00Z INF Using Systemd
2024-12-01T00:00:00Z INF Linux service for cloudflared installed successfully

```

設定がOKだったら、ページ下の`Connectors`に追加したサーバが表示されます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel-connectors.jpg)

ブラウザからアクセスする際の FQDN を決めます。
`Path`指定もできますが [Browser SSH](https://developers.cloudflare.com/cloudflare-one/applications/non-http/browser-rendering/) は非対応です。空欄で。

その下の Service は VPS の接続先となる SSH を指定します。
この設定で Cloudflare から来た通信が SSH のポートに転送されます。

 - `Type`:`SSH`
 - `URL`:`localhost:22`

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Tunnel-route.jpg)


# Application をつくる

ブラウザ <-> Cloudflare 部分となる Application を作成します。

「Applications」から新しい Application を作成していきます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Application.jpg)

「Self-hosted」を選んで

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Application-type.jpg)

`Application name`に名前を入れます。
この値は FQDN にアクセスすると誰でも確認できるの注意です。
（そういえば「NG ワード：おっさん」は消えたんですか？）

その下の`Application Domain`には Tunnel で指定した FQDN と同じ値を入れます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Application-configure.jpg)

接続を許可する条件を指定します。
`Policy name`に名前を入れます。

いろいろ設定項目はありますが、`Configure rules`だけ設定すればOKです。

[条件](https://developers.cloudflare.com/cloudflare-one/policies/access/#selectors)として特定メールアドレスやアクセス元 IP と選択肢は盛りだくさん。
今回は特定メールアドレスを指定します。

このメールアドレス条件がアプリのログインとマッチして、一致した場合だけ SSH できます

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Application-Policy.jpg)

追加設定を設定します。
今回は「Additional settings」の「Browser rendering」から`SSH`を選ぶ点だけ変更
これで SSH クライアントがブラウザで動きます。

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Application-setup.jpg)

# つないでみる

ブラウザから指定した FQDN にアクセスします。

許可条件で指定したメールアドレスを入れて「Send me a Code」

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Login.jpg)

`noreply@notify.cloudflare.com`から届いたワンタイムパス（数字）を入れて「Sign in」

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Signin.jpg)

ここからは SSH 接続の時間です。
VPS のユーザー名（`root`）を入れ

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-User.jpg)

ssh ユーザーのパスワードを入れます。
「Private Key」を選べば鍵認証も可

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell-Password.jpg)

見慣れた黒い画面が降臨

SSH サーバーから見ると VPS で動いているエージェントからのアクセス扱い
アクセス元は常に`127.0.0.1`です

![alt](https://qiita-image.cloudremix.net/ConoHa-Cloudflared-WebShell.jpg)

# あとがき

ConoHa ちゃんの Advent Calendar は[2019年](https://qiita.com/CloudRemix/items/691caf91efa3ef19a7ad)から毎年参加してきましたが、去年は参加できていません

某パブリックで従量課金なクラウドサービスに浮気した結果、ミスって 100万円の請求書襲来だったからです

今年はそんなこともなく、やすらぎの年末年始を迎えられそうです。たぶん