導入
通常、SSHサーバーへの接続には、SSHクライアントを含むターミナルまたはターミナルエミュレータソフトウェアのコマンドラインツールが使用されます。PythonのWebSSHなどのツールを使用すると、SSH経由で接続し、Webブラウザで直接ターミナルを実行できます。.
この機能は様々な状況で役立ちます。特に、通常のターミナルウィンドウを分かりやすく共有するのが難しいライブプレゼンテーションやデモなどで役立ちます。また、コマンドラインに慣れていない人にアクセスを提供する教育環境にも役立ちます。マシンにソフトウェアをインストールする必要がないためです(特にWindowsでは、デフォルトオプションが問題となる場合があります)。最後に、Python WebSSHは非常に移植性が高く、Python以外の依存関係を設定する必要はありません。他のWebベースのターミナルスタックは、より複雑でLinux固有のものになる場合があります。.
このチュートリアルでは、WebSSH を設定し、ブラウザから SSH 経由で接続します。その後、必要に応じて SSL 証明書でセキュリティ保護し、本番環境へのデプロイに備えて Nginx リバースプロキシの背後に配置します。.
前提条件
- SSHサービスが稼働しているWindows、Mac、またはLinux環境。WebSSHをローカルで実行するのが便利ですが、ローカルマシンにSSHサービスがない場合は、リモートLinuxサーバーを使用できます。.
- Pythonプログラミング言語は、パッケージマネージャーであるpipを使ってインストールされます。UbuntuにPythonとpipをインストールするには、このチュートリアルの最初の部分を参照してください。.
- オプションとして、ブラウザでHTTPSを有効にするには、SSL証明書とドメイン名が必要です。これらはCertbotのスタンドアロンモードで取得できます。.
ステップ1 – WebSSHをインストールする
Pythonとpipがインストールされている場合は、PyPI(Pythonソフトウェアリポジトリ)からPythonパッケージをインストールできるはずです。WebSSHはコマンドラインから直接インストールして実行できるように設計されているため、 Python 3 インストールチュートリアル すでに述べたように、いいえ。仮想環境は、システムツールをインストールするときではなく、独自のプロジェクトで作業するときに便利です。.
WebSSH パッケージをインストールするには、次のコマンドを使用します。
sudo pip3 install webssh出力は次のようになります。
Output
…
Successfully built webssh
Installing collected packages: tornado, pycparser, cffi, pynacl, paramiko, webssh
Successfully installed cffi-1.15.1 paramiko-2.11.0 pycparser-2.21 pynacl-1.5.0 tornado-6.2 webssh-1.6.0sudo を使用すると、wssh コマンドがグローバルにインストールされます。which コマンドを使用して、wssh がインストールされている場所を確認できます。
which wssh出力は次のようになります。
/usr/local/bin/wsshWebSSHのインストールが完了しました。次に、WebSSHを起動して接続します。ただし、事前にファイアウォールルールを追加する必要があります。WebSSHはデフォルトでポート8888で動作します。ファイアウォールとしてufwを使用している場合は、ufwでそのポートへのアクセスを許可してください。
sudo ufw allow 8888
ステップ2 – WebSSHを実行して接続する
ローカルマシンでWebSSHを実行している場合は、追加の引数なしでwsshコマンドを実行できます。リモートサーバーでWebSSHを実行している場合は、-sオプションを使用する必要があります。 --fbidhttp=偽 HTTP経由のリモート接続を許可する場合に使用します。セキュリティ保護されていないネットワークを使用している場合、この接続は安全ではありませんが、デモには役立ちます。次の手順でWebSSHをセキュリティ保護します。.
wssh --fbidhttp=FalseこれでWebSSHに接続してログインできます。アドレス あなたのドメイン:8888 ウェブブラウザで、(ローカルで実行している場合は) ローカルホスト:8888 WebSSH ログイン ページが表示されます。.
いつものSSH認証情報を入力します。DigitalOceanのサーバー設定ガイドに従っている場合は、パスワードではなくキーベースの認証を使用しているはずです。そのため、サーバーのホスト名、ユーザー名、そしてSSHキー(以下のフォルダに保存されているはずです)のみを指定してください。 .ssh/ ホームディレクトリ(通常は id_rsa は)。.
注: ホスト名を手動で指定していることからお分かりいただけると思いますが、WebSSH は、WebSSH が動作しているサーバー以外のサーバーにも接続できます。このチュートリアルでは、WebSSH は接続先と同じサーバー上で動作しています。.
接続するには、ボタンをクリックしてください。 接続する クリックすると、デフォルトのターミナルのようこそ画面が表示されます。.
この時点で、SSH接続時と同様に、ターミナルを通常通り使用できます。WebSSHインスタンスを介して複数のユーザーが同時に接続することも可能です。ストリーミングやビデオ録画のためだけにローカルマシンにWebSSHをインストールしている場合は、この機能が必要になる場合があります。WebSSHサーバーを終了するには、WebSSHを起動したターミナル(WebSSHターミナルではありません)でCtrl+Cを押してください。.
リモートサーバー上で実行している場合、本番環境では安全でないHTTP接続を介してWebSSHを使用することは避けてください。SSHサービスの認証メカニズムによって保護されているとはいえ、HTTP経由のSSH接続は重大なセキュリティリスクを伴い、第三者にSSH認証情報を盗まれる可能性があります。次の手順では、WebSSHインスタンスを通常のSSH接続と同等のセキュリティで保護します。.
ステップ3 – (オプション) SSL証明書でWebSSHを保護する
この手順を完了するには、ドメイン証明書とSSL証明書をすでに取得している必要があります。Certbotをスタンドアロンモードで使用する方法もあります。.
証明書を受け取ったら、次のパスにあることを確認します。
sudo ls /etc/letsencrypt/live/your_domainHTTPS サポート付きの WebSSH を実行するには、証明書とキーへのパスを指定する必要があります。
sudo wssh --certfile='/etc/letsencrypt/live/your_domain/fullchain.pem' --keyfile='/etc/letsencrypt/live/your_domain/privkey.pem''ウェブブラウザで、 https://あなたのドメイン:4433 先に進むと、前の手順で見たのと同じインターフェースが表示されますが、今度は HTTPS がサポートされています。.
ステップ4 – (オプション) Nginxリバースプロキシの背後でWebSSHを実行する
Nginxのようなウェブサーバーをウェブアプリケーションの前段に配置することで、パフォーマンスを向上させ、サイトのセキュリティを簡素化できます。Nginxをインストールし、WebSSHへのリクエストをリバースプロキシするように設定します。.
まず、パッケージ リストを更新し、Nginx をインストールします。
sudo apt update nginx
sudo apt install nginxufw ファイアウォールを使用している場合は、デフォルトの HTTP/HTTPS ポート (ポート 80 および 443) へのアクセスを許可するように設定を変更する必要があります。
sudo ufw allow “Nginx Full”次に、Nginx設定ファイルをパスにコピーします。 /etc/nginx/sites-available/webssh 作成する:
sudo nano /etc/nginx/sites-available/webssh次のような構成を入力します。
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name your_domain www.your_domain
root /var/www/html;
access_log /var/log/nginx/webssh.access.log;
error_log /var/log/nginx/webssh.error.log;
location / {
proxy_pass http://127.0.0.1:8888;
proxy_http_version 1.1;
proxy_read_timeout 300;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
}
listen 443 ssl;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
}
}この設定は主に3つの「ブロック」で構成されていると解釈できます。location/ 行の前の最初のブロックには、デフォルトのHTTPポート80でウェブサイトを提供するためのNginx設定が含まれています。location/ ブロックには、SSLを維持しながら、内部的にポート8888で実行されるWebSSHへの着信接続をプロキシするための設定が含まれています。ファイルの末尾、location/ ブロックの後のブロックには、LetsEncryptのSSLキーペアを読み込み、HTTP接続をHTTPSにリダイレクトする設定が含まれています。.
ファイルを保存して閉じます。nanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたらYを押してEnterを押します。.
次に、この新しい設定を有効にする必要があります。Nginxの慣例により、sites/内のファイルからsites-enabled/という別のフォルダへのシンボリックリンク(ショートカットのようなもの)を作成し、有効化または無効化します。以下のリンクを、分かりやすくするためにフルパスで作成してください。
sudo ln -s /etc/nginx/sites-available/webssh /etc/nginx/sites-enabled/websshデフォルトでは、Nginx は /etc/nginx/sites-available/default に別の設定ファイルを含めており、これは /etc/nginx/sites-enabled/default にリンクされています。このファイルはデフォルトのインデックスページも提供します。このルールは新しい WebSSH 設定と競合するため、 /sites-enabled から削除して無効にする必要があります。
sudo rm /etc/nginx/sites-enabled/default
注: このチュートリアルのNginx設定は、WebSSHという単一のアプリケーションを提供するように設計されています。Nginxのドキュメントに従って、このNginx設定を拡張し、単一サーバー上で複数のアプリケーションを提供することもできます。.
次に、Nginx の設定をテストします。
sudo nginx -tOutput
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulNginx サービスを再起動します。
sudo systemctl restart nginx最後に、すべてのトラフィックが標準の HTTP/HTTPS ポート経由で Nginx によって処理されるようになるため、以前に WebSSH の直接アクセス用に作成したファイアウォール ルールを削除できます。
sudo ufw delete allow 8888
sudo ufw delete allow 4433今回は証明書とキーのパスを指定する必要はありません。Nginxが処理します。次に、Webブラウザでyour_domainにアクセスしてください。.
WebSSHはポートを指定することなく、Nginx経由でHTTPS経由で提供されるようになりました。これで、wsshの設定自体を除くすべてが自動化されました。これは最後のステップで行います。.
ステップ5 – (オプション) WebSSH用のSystemdサービスを作成する
バックグラウンドで自動的に実行されないサーバーサイドアプリケーションをデプロイするのは、毎回コマンドラインから直接起動する必要があるため、最初は現実的ではありません。解決策は、独自のバックグラウンドサービスを開始することです。.
これを行うには、サーバーのinitシステムが使用できる単一のファイルを作成します。ほとんどすべての最近のLinuxディストリビューションでは、initシステムはSystemdと呼ばれており、systemctlコマンドを使用して操作できます。.
ターミナルでWebSSHがまだ実行されている場合は、Ctrl+Cを押して停止してください。次に、nanoまたはお好みのテキストエディタを使用して、/etc/systemd/system/webssh.serviceという新しいファイルを開きます。
sudo nano /etc/systemd/system/webssh.service
ユニット ファイルには、少なくとも 1 つの [Unit] セクション、1 つの [Service] セクション、および 1 つの [Install] セクションが必要です。
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.targetこのファイルは次のように分割できます。
- [Unit] セクションには、新しいサービスのプレーンテキストによる説明と、システムの起動時にいつ実行するかを指定する After フック (この場合は、サーバーのネットワーク インターフェイスが起動した後) が含まれています。.
- [Service] セクションでは、実行するコマンドとそれを実行するユーザーを指定します。この場合、www-data はUbuntuサーバーのデフォルトのNginxユーザーであり、wssh はコマンドそのものです。.
- [install] セクションには WantedBy=multi-user.target という行のみが含まれており、この行は [unit] セクションの After 行と連動して、サーバーがユーザー ログインを受け入れる準備ができたときにサービスが開始されるようにします。.
ファイルを保存したら、サービスを開始し、システムの起動時に実行されるように有効にします。
sudo systemctl start webssh
sudo systemctl enable websshsystemctl status webssh を使用して、正常に起動したことを確認してください。ターミナルで最初にコマンドを実行したときと同じ出力が表示されるはずです。.
sudo systemctl status webssh
Output
● webssh.service - WebSSH terminal interface
Loaded: loaded (/etc/systemd/system/webssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-08-11 22:08:25 UTC; 2s ago
Main PID: 15678 (wssh)
Tasks: 1 (limit: 1119)
Memory: 20.2M
CPU: 300ms
CGroup: /system.slice/webssh.service
└─15678 /usr/bin/python3 /usr/local/bin/wssh
Aug 11 22:08:25 webssh22 systemd[1]: Started WebSSH terminal interface.
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 settings:125] WarningPolicy
Aug 11 22:08:26 webssh22 wssh[15678]: [I 220811 22:08:26 main:38] Listening on :8888 (http)ブラウザで https://your_domain を再読み込みすると、WebSSHインターフェースが再び表示されるはずです。これ以降、WebSSHとNginxはサーバーと連動して自動的に再起動し、バックグラウンドで実行されます。.
結果
このチュートリアルでは、WebSSHをインストールし、Webブラウザでコマンドラインインターフェースを提供するためのポータブルなソリューションを構築しました。さらに、SSL、Nginxリバースプロキシ、systemdサービスを追加することで、WebSSHのデプロイメントを強化しました。このモデルは、特に認証にキーペアを使用するSSHセキュリティのコンテキストにおいて、小規模なサーバーサイドアプリケーションのデプロイメントに非常に役立ちます。.











