Web ブラウザから SSH リモートログインできるサーバ(ttyd を使用)(Ubuntu 上)
Ubuntu 24.04 LTS で,Web ブラウザ経由の SSH 接続を行う ttyd サーバを構築する手順である。ファイアウォールの設定,SSH の設定,ttyd のインストールと起動を説明する。
要点は次の通りである.
- Ubuntu を使用する.
- ファイアウォール (
ufw) を稼働させる. ttydを中継サーバとして,Web ブラウザからリモートログインできるように設定する.
ttyd は,Ubuntu 24.04 LTS の公式リポジトリ(universe)にバージョン 1.7.4 が収録されており,apt でインストールできる。ブラウザ側の端末エミュレータは xterm.js,サーバ側は libwebsockets を使用し,WebSocket で端末の入出力を中継する。同じ用途のソフトウェアとして,Apache Guacamole(SSH に加えて RDP, VNC にも対応するゲートウェイ),Wetty(Node.js 上で動作)がある.
前準備
Ubuntu のインストール
Ubuntu のインストール手順は,「別のページ」で説明する.
Ubuntu のシステム更新
次のコマンドを実行する.
# パッケージリストの情報を更新
sudo apt update
# インストール済みのパッケージを更新 (依存関係も考慮)
sudo apt full-upgrade
# 変更をシステム全体に反映させるために再起動
sudo shutdown -r now
ssh によるリモートアクセスの設定(Ubuntu 上)
要点: openssh-server をインストールする.
Ubuntu 上のファイアウォールを有効にし,予期しないアクセスを抑止する.
- ファイアウォール(
ufw)を有効にする.sudo ufw enable - ssh を使っている場合には,この時点で ssh アクセスを許可しておく.
sudo ufw allow 22 sudo ufw default deny incoming ufwの設定を確認する.ポート 22 についての通信が開放されていることを確認する.
sudo ufw status- openssh server のインストール
sudo apt -y install openssh-server - ポートスキャンを行い,
ufwの設定を確認する.ポート 22 についての通信が開放されていることを確認する.
sudo apt install nmap nmap localhost
SSH によるリモートログインを行うアカウントの作成と設定
SSH によるリモートログインの受付に用いるユーザである.
ここで作成するユーザ名: ai
- 新規ユーザの作成とパスワードの設定
sudo adduser --uid 1234 --home /home/ai ai
この操作がうまく行かなかったときは「sudo deluser ai; sudo rm -rf /home/ai」のように操作した後に,この操作をやり直す.
- SSH キーペアの作成と,
authorized_keysへの公開鍵の追加sudo -u ai -i mkdir ~/.ssh chmod 700 ~/.ssh cd ~/.ssh ssh-keygen -t ed25519 -C "<鍵を識別するための文字列>" # 保存先については,Enter キー.パスフレーズについては適切に設定 cat id_ed25519.pub >> authorized_keys chmod 600 authorized_keys exit
- 試しに ai ユーザでログインしてみる
ssh ai@localhost
ttyd のインストールとテスト実行
ここでの設定:使用するポート番号 8443
ttyd のインストール
次のコマンドを実行する.
# パッケージリストの情報を更新
sudo apt update
sudo apt -y install ttyd
バージョンを確認する.
ttyd --version
ufw で ttyd のポートの解除
次のコマンドを実行する.
sudo ufw allow 8443
ttyd のテスト実行
次のコマンドを実行する.--writable はブラウザからのキー入力を許可するオプションである(ttyd は既定では読み取り専用である).
ttyd --port=8443 --writable bash
ポートスキャンを行い,ufw の設定を確認する.
ポート 8443 についての通信が開放されていることを確認する.
nmap localhost
Web ブラウザから使ってみる
Web ブラウザで,次の URL を指定する.端末の画面が開くことを確認する.確認後,Ctrl+C で ttyd を停止する.
http://127.0.0.1:8443
このテスト実行では,通信が暗号化されず,認証も行われない。動作確認のみに使用する.
ttyd サーバを立てて,Web ブラウザによるリモートログインを行う
- SSL/TLS 用の証明書の作成
次のコマンドを実行する。ここでは動作確認用に自己署名証明書を作成する。Web ブラウザには警告が表示される。外部に公開する場合は,認証局が発行した証明書を使用する.
cd ~ openssl req -newkey rsa:2048 -nodes -keyout server.key \ -x509 -days 365 -subj "/CN=localhost" -out server.crt chmod 600 server.key - ttyd サーバの起動
次のコマンドを実行する。
ssh ai@localhostを実行する端末をブラウザに公開する.ttyd --port=8443 --writable --credential webuser:<パスワード> \ --check-origin \ --ssl --ssl-cert ~/server.crt --ssl-key ~/server.key \ ssh ai@localhost各オプションの意味は次の通りである.
--credential:Basic 認証のユーザ名とパスワードを指定する.--check-origin: 異なるオリジンからのWebSocket接続を拒否する.--ssl,--ssl-cert,--ssl-key:SSL/TLSによる通信の暗号化を有効にする.
- 試しに,Web ブラウザからリモートログインしてみる
Web ブラウザで,次の URL を指定する.
https://<IP アドレス>:8443
Basic 認証のユーザ名とパスワードを入力する.- SSH の認証(公開鍵のパスフレーズ,またはパスワード)を行う。ログインできることを確認する.
実運用
- ポート番号は 8443 である必要はない.
- 必要のないときは,ttyd サーバを停止する(
Ctrl+Cで停止する). - 常時稼働させるときは,
systemdのサービスとして登録する. -
Nginxなどのリバースプロキシ経由で公開し,証明書の管理と認証をリバースプロキシ側で行う構成にもできる。この場合,--auth-headerオプションでリバースプロキシによる認証を利用する. -
ttydとOpenSSH サーバはセキュリティ更新が提供されるため,最新の状態に保つ. -
chrootによる隔離を行う.(詳細はこちら)