Python WebSSHを使用してブラウザからターミナルに接続する方法
以下の文章を日本語でパラフレーズしてください。1つのオプションだけでかまいません。
イントロダクション
通常、SSHサーバーに接続するためには、ターミナル上でコマンドラインアプリを使用するか、SSHクライアントが含まれたターミナルエミュレーターソフトウェアを使用します。PythonのWebSSHのような一部のツールでは、SSH経由で接続してウェブブラウザ内で直接ターミナルを実行することが可能になります。
これはさまざまな状況で役立つことがあります。特にライブプレゼンテーションやデモを行う際には非常に便利です。通常のターミナルウィンドウを視覚的にわかりやすく共有するのは難しい場合にも役立ちます。また、コマンドライン初心者にアクセス権限を与える教育環境でも役に立ちます。彼らが自分のマシンにソフトウェアをインストールする必要がないためです(特にWindowsでは、デフォルトのオプションに注意が必要です)。最後に、PythonのWebSSHは非常にポータブルであり、Python以外の依存関係を必要としません。他のウェブベースのターミナルスタックははるかに複雑で、Linuxに特化しています。
このチュートリアルでは、WebSSHを設定し、ブラウザでSSHに接続します。さらに、オプションでSSL証明書でセキュリティを強化し、本番環境での展開にNginxリバースプロキシの背後で実行します。
前提条件
- A Windows, Mac, or Linux environment with a running SSH service. It can be useful to run WebSSH locally, but if you don’t have an SSH service running on a local machine, you can use a remote Linux server by following our initial server setup guide for Ubuntu 22.04.
- The Python programming language installed along with pip, its package manager. You can install Python and pip on Ubuntu by following Step 1 of this tutorial.
- Optionally, to enable HTTPS in the browser, you will need SSL certificates and your own domain name. You can obtain them by following How To Use Certbot Standalone Mode to Retrieve Let’s Encrypt SSL Certificates. If you do not have your own domain name, you can use an IP address for the first two steps of this tutorial.
ステップ1:WebSSH のインストール
Pythonとpipがすでにインストールされている場合、PyPI(Pythonソフトウェアリポジトリ)からPythonパッケージをインストールすることができるはずです。WebSSHはコマンドラインから直接インストールおよび実行するように設計されているため、How To Install Python 3 and Set Up a Programming Environmentで説明されている他の仮想環境のセットアップは必要ありません。仮想環境は、システム全体のツールをインストールする場合ではなく、自分自身のプロジェクトで作業する際により便利です。
WebSSHパッケージをインストールするには、pip installコマンドを使用してください。
- sudo pip3 install webssh
… 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.0
sudoを使用してインストールすると、wsshコマンドがグローバルにインストールされます。これを確認するには、which wsshを使用してください。
- which wssh
/usr/local/bin/wssh
WebSSHをインストールしました。次のステップでは、実行して接続します。ただし、最初にファイアウォールのルールを追加する必要があります。WebSSHはデフォルトでポート8888で実行されます。ファイアウォールとしてufwを使用している場合は、そのポートをufwに許可してください。
- sudo ufw allow 8888
このチュートリアルの後で、そのファイアウォールのルールを後で再訪します。
ステップ2 – WebSSHの実行と接続
ローカルマシンでWebSSHを実行している場合、追加の引数なしでwsshを単体で実行することで開始することができます。リモートサーバーでWebSSHを実行している場合は、通常のHTTP経由でのリモート接続を許可するために、–fbidhttp=Falseフラグを追加する必要があります。これは保護されていないネットワーク経由で接続している場合は安全ではありませんが、デモ用に便利であり、後でこのチュートリアルでWebSSHを安全に設定できます。
- wssh –fbidhttp=False
今では、WebSSHに接続してログインすることができます。Webブラウザでyour_domain:8888に移動してください(ローカルで実行している場合は、your_domainの代わりにlocalhostを使用してください)。WebSSHのログインページが表示されます。
定期的なSSHの資格情報を提供してください。もしSilicon Cloudの初期サーバーセットアップガイドに従っている場合、パスワードではなくキーベースの認証が使用されているはずです。つまり、接続先のサーバーのホスト名、サーバーのユーザー名、そしてSSHキーのみを指定すれば大丈夫です。SSHキーは通常はローカルのホームディレクトリ内の.ssh/フォルダに位置しています(通常はid_rsaという名前です)。
Note
「接続」ボタンをクリックすると、デフォルトのターミナルのウェルカムプロンプトが表示されるはずです。
この時点では、SSH接続したかのように、通常通りにターミナルを使用することができます。また、複数のユーザーが同じWebSSHインスタンスに同時に接続することもできます。WebSSHをビデオストリーミングやキャプチャのためにローカルマシンで実行している場合は、これで十分です。終了時には、WebSSHサーバーを起動したターミナル(WebSSHのターミナルではありません)でCtrl+Cを入力して停止することができます。
リモートサーバー上で実行している場合、WebSSHを安全でないHTTP接続の背後で本番環境で使用したくはないでしょう。SSHサービスの認証メカニズムにより保護されますが、HTTP経由のSSH接続は重大なセキュリティリスクをもたらし、他の人がSSHの資格情報を盗む可能性が高くなります。次の手順では、WebSSHインスタンスを通常のSSH接続と同じくらい安全にするためにセキュリティを確保します。
ステップ3-(任意)SSL証明書でWebSSHをセキュアにする
このステップを完了するためには、すでに自分のドメイン名とSSL証明書を取得している必要があります。それを行う方法の一つは、スタンドアロンモードでLetsEncryptを使用することです。
デフォルトでは、LetsEncryptが証明書を取得すると、それらは自動的に/etc/letsencrypt/live/your_domainに保存されます。確認してください。
- sudo ls /etc/letsencrypt/live/your_domain
README cert.pem chain.pem fullchain.pem privkey.pem
WebSSHをHTTPSで動作させるためには、certのパスとkeyのパスを指定する必要があります。これらはfullchain.pemとprivkey.pemです。デフォルトでは、WebSSHはポート4433でHTTPSアクセスを提供しますので、ファイアウォールでそのポートを開けてください。
- sudo ufw allow 4433
次に、許可する必要があります。
それでは、証明書とキーのパスを指定してWebSSHを実行してください。
- sudo wssh –certfile=‘/etc/letsencrypt/live/your_domain/fullchain.pem’ –keyfile=‘/etc/letsencrypt/live/your_domain/privkey.pem’
ウェブブラウザでhttps://your_domain:4433に移動し、前の手順と同じインターフェースが表示されるはずです。これによりHTTPSがサポートされます。これで安全なプロダクション設定に十分です。ただし、まだwsshアプリを直接ターミナルから実行しており、ブラウザからは異常なポートでアクセスしています。このチュートリアルの最後の2つの手順で、これらの制限の両方を解除します。
ステップ4 –(オプション)NginxのリバースプロキシにWebSSHを実行する
他のウェブアプリケーションの前にNginxなどのウェブサーバーを配置すると、パフォーマンスが向上し、サイトのセキュリティ確保が簡単になります。Nginxをインストールし、設定してリバースプロキシとして使用することで、ユーザーからWebSSHへのリクエストやその逆の処理をNginxが管理します。
パッケージリストを更新した後、aptを使用してNginxをインストールしてください。
- sudo apt update nginx
- sudo apt install nginx
もしUFWファイアウォールを使用している場合、デフォルトのHTTP/HTTPSポートである80番と443番へのアクセスを可能にするために、ファイアウォール設定にいくつか変更を加える必要があります。UFWには、これらのポートへのアクセスを提供する「Nginx Full」という標準の設定があります。
- sudo ufw allow “Nginx Full”
Nginxでは、sites-available/というサブディレクトリに個別のファイルごとにサイトごとの設定を追加することができます。nanoまたはお気に入りのテキストエディタを使用して、/etc/nginx/sites-available/websshに新しいNginxの設定を作成してください。
- sudo nano /etc/nginx/sites-available/webssh
新しい設定ファイルに以下をコピーして、your_domainを自身のドメイン名に置き換えてください。
「/etc/nginx/sites-available/webssh」というファイルを日本語で言い換えると、以下のようになります:
「/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つの主要な「ブロック」から構成されていると解釈できます。最初のブロックは、/ラインの前に配置されており、デフォルトのHTTPポートでウェブサイトを提供するためのNginxの雛形設定を含んでいます。/ブロックには、内部でポート8888で実行されているWebSSHへの接続をSSLを維持しながらプロキシする設定が含まれています。ファイルの最後にある/ブロックの後の設定では、LetsEncrypt SSLのキーペアを読み込み、HTTP接続をHTTPSにリダイレクトします。
ファイルを保存して閉じてください。もしnanoを使用している場合は、Ctrl+Xを押し、プロンプトが表示されたら、Yを押してからEnterキーを押してください。
次に、この新しい設定を有効にする必要があります。Nginxの慣習では、sites-available/にあるファイルから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
Note
次に、Nginxを再起動する前に、設定を確認するためにnginx -tを実行してください。
- sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful
新たな設定が反映されるよう、Nginxサービスを再起動できます。
- sudo systemctl restart nginx
最後に、標準のHTTP/HTTPSポートを介してNginxがすべてのトラフィックを処理するようになったので、以前に作成したWebSSHに直接アクセスするためのファイアウォールルールを削除できます。
- sudo ufw delete allow 8888
- sudo ufw delete allow 4433
コマンドラインでWebSSHを再起動してください。
- wssh
今回は、Nginxがそれを処理しているので、証明書と鍵のパスを提供する必要はありません。その後、ウェブブラウザで「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
ユニットファイルには[ユニット]セクション、[サービス]セクション、[インストール]セクションが必要です。
[Unit]
Description=WebSSH terminal interface
After=network.target
[Service]
User=www-data
Group=www-data
ExecStart=wssh
[Install]
WantedBy=multi-user.target
このファイルは以下のように分割することができます。 (Kono fairu wa ika no yō ni bunkatsu suru koto ga dekimasu.)
- The [Unit] section contains a plaintext description of your new service, as well as an After hook that specifies when it should be run at system startup, in this case after your server’s networking interfaces have come up.
- The [Service] section specifies which command should actually be run, as well as which user should be running it. In this case, www-data is the default Nginx user on a Ubuntu server, and wssh is the command itself.
- The [Install] section contains only the WantedBy=multi-user.target line, which works together with the After line in the [Unit] section to ensure that the service is started when the server is ready to accept user logins.
ファイルを保存して閉じてください。新しいWebSSHサービスを開始し、起動時に自動的に実行できるように有効にしてください。
- sudo systemctl start webssh
- sudo systemctl enable webssh
systemctl status webssh コマンドを使用して、正常に起動したことを確認してください。ターミナルで最初にコマンドを実行したときと同様の出力が表示されるはずです。
- sudo systemctl status webssh
● 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は自動的にサーバーとともに再起動し、バックグラウンドで実行されます。
結論
このチュートリアルでは、Webブラウザでコマンドラインインターフェースを提供するためのポータブルなソリューションであるWebSSHをインストールしました。その後、SSLを追加してデプロイメントを改善し、さらにNginxのリバースプロキシを追加し、最後にWebSSHのシステムサービスを作成しました。これは、小規模なサーバーサイドのWebアプリケーションを一般的に展開するための良いモデルであり、特にSSHではセキュリティに鍵ペアが必要なため、非常に重要です。
次に、SSHの他の接続オプションについて学ぶこともお考えになるかもしれません。