DUICUO

SSHを使用してWindowsからLinuxに接続する方法

Linuxの世界では、コマンドラインからリモートコンピュータを制御する最も一般的な方法は、Secure Shell(SSH)プロトコルです。SSHはLinux独自のプロトコルですが、Windowsの世界でもますます普及しています。OpenSSHを使ってWindowsを制御する方法を説明した公式のWindows SSHドキュメントさえあります。

この記事では、一般的なオープンソース ツール PuTTY を使用して、Windows から Fedora 33 Linux システムへの SSH 接続を確立する方法を説明します。

SSHを使用する方法

SSHはクライアントサーバーモデルを採用しており、SSHクライアントがSSHサーバーへの接続を確立します。SSHサーバーは通常デーモンとして実行されるため、SSHDと呼ばれることがよくあります。SSHデーモンを搭載していないLinuxディストリビューションを見つけるのは困難です。Fedora 33では、SSHデーモンはインストールされていますが、有効化されていません。

SSHを使えば、仮想マシンとして実行されているか、ネットワーク上の物理デバイスとして実行されているかを問わず、ほぼすべてのLinuxマシンを制御できます。一般的なユースケースとしては、Raspberry Piなどのヘッドレス組み込みデバイスが挙げられます。また、SSHは他のネットワークサービスへのトンネルとしても使用できます。SSH接続は暗号化されるため、デフォルトで暗号化を提供しないプロトコルのトランスポート層としてSSHを使用できます。

この記事では、SSH を使用する 4 つの方法について説明します。1. Linux で SSH デーモンを構成する方法、2. リモート コンソール接続を設定する方法、3. ネットワーク経由でファイルをコピーする方法、4. 特定のプロトコルのトンネルとして SSH を使用する方法。

1. SSHDを設定する

この例では、Linuxシステム(この場合はFedora 33)をSSHサーバーとして使用し、PuTTY SSHクライアントからの接続を許可します。まず、デーモンのSSH設定を確認します。設定ファイルは​/etc/ssh/sshd_config​にあり、関連する行のコメントを解除することで有効になる多くのオプションが含まれています。

 # $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $
# これはsshdサーバのシステム全体の設定ファイルです。
詳細についてはsshd_config(5)を参照してください。
# この sshd は PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin でコンパイルされました
# 同梱のデフォルトのsshd_configのオプションに使用される戦略
# OpenSSHは、デフォルト値でオプションを指定します。
# 可能ですが、コメントアウトしたままにしてください。コメントアウトされていないオプションは、
# デフォルト値。
/etc/ssh/sshd_config.d/*.conf をインクルードします。
#ポート22
#AddressFamily 任意
#リッスンアドレス 0.0.0.0
#Listenアドレス::

この例では、何もコメント解除していないデフォルト設定で動作するはずです。SSHデーモンが実行中かどうかを確認するには、 ​systemctl status sshd​と入力してください。

 $ systemctlステータス sshd
● sshd.service - OpenSSHサーバデーモン
ロード済み: ロード済み (/usr/lib/systemd/system/sshd.service; 有効; ベンダープリセット: 有効)
アクティブ: 2018年6 22日(金) 11:12:05 UTC からアクティブ (実行中)、 211か月前
ドキュメント: man:sshd(8)
man:sshd_config(5)
メインPID: 577 (sshd)
タスク: 1 (制限: 26213 )
Cグループ: /system.slice/sshd.service
└─577 /usr/sbin/sshd -D -oCiphers = [[email protected]][5],chacha20-[...]

非アクティブの場合は、コマンド ` ​systemctl start sshd​使用して起動します。

2. リモートコントロールコンソールを設定する

WindowsにPuTTYインストーラーをダウンロードし、インストールして開きます。次のようなウィンドウが表示されます。

PuTTY設定画面

「ホスト名(またはIPアドレス)」入力ボックスに、Linuxシステムの接続情報を入力します。この記事では、ブリッジネットワークアダプタを使用するFedora 33仮想マシンを設定し、IPアドレス​192.168.1.60​経由でこのシステムに接続できるようにします。「開く」をクリックすると、画像のようなウィンドウが開きます。

PutTTY セキュリティ警告

これはSSHのセキュリティ対策の一つで、中間者攻撃を防ぐために設計されています。メッセージ内のフィンガープリントは、Linuxシステムの​/etc/ssh/ssh_host_ed25519_key.pub​にある鍵と一致する必要があります。PuTTYはこの鍵をMD5ハッシュとして出力します。鍵の真正性を確認するには、Linuxシステムに切り替えてコンソールを開き、次のコマンドを入力してください。

 ssh-keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub

出力は PuTTY によって表示されるフィンガープリントと一致するはずです。

 $ ssh -keygen -l -E md5 -f /etc/ssh/ssh_host_ed25519_key.pub
256 MD5:E4:5F:01:05:D0:F7:DC:A6:32 コメントなし (ED25519)

PuTTYのセキュリティプロンプトを確認し、「はい」をクリックします。ホストシステムのフィンガープリントは、WindowsレジストリにあるPuTTYの信頼済みリストに保存されます。

 HKEY_CURRENT_USER\SOFTWARE\SimonTatham\PuTTY\SshHostKeys

正しいログイン資格情報を入力すると、ユーザーのホームディレクトリにあるコンソールにアクセスできるようになります。

SSHにログインしました

3. ネットワーク経由でファイルをコピーする

リモートコンソールに加えて、PuTTYを使ってSSH経由でファイルを転送することもできます。PuTTYは​C:\Program Files (x86)\PuTTY​にインストールされています。このディレクトリで​ppscp.exe​を探してください。PuTTYを使ってLinuxシステムとの間でファイルをコピーできます。

​Windows + R​キーを押して​cmd​と入力し、コマンドプロンプトを開きます。Linux ユーザーのホームディレクトリから​MYFile.txt​ Windows のホームディレクトリにコピーし、以下を入力します。

 C:\"Program Files (x86) "\PuTTY\pscp.exe [email protected]:/home/stephan/MyFile.txt 。

Windows ホーム ディレクトリから Linux ユーザーのホーム ディレクトリにファイルをコピーするには、次のように入力します。

 C:\"Program Files (x86) "\PuTTY\pscp.exe MyFile.txt [email protected]:/home/stephan/

すでにご存知かもしれませんが、コピー コマンドは通常次のように構成されます。

 pscp.exe <ソース> <ターゲット>

4. プロトコルのトンネリング

Linuxマシンで特定のアプリケーション用のHTTPベースのサービスを実行しているとします。Windowsマシンからインターネット経由でこのHTTPサービスにアクセスしたいとします。さらに、以下の理由により、関連するTCPポートをパブリックインターネットに公開することはできません。

  1. このサービスは HTTPS ではなく HTTP 経由で実行されます。
  2. ユーザー管理やログインシステムは全くありません

一見すると、深刻な脆弱性を生じさせずにこのようなアーキテクチャを構築することは不可能に思えます。しかし、SSHはこのような状況に対して簡単に安全なソリューションを提供できます。

このプロセスを、私のソフトウェアプロジェクト「Pythonic」を使って説明します。これはコンテナ内で実行されます。Pythonicはコンテナとして実行され、TCPポート7000(メインエディタ)とTCPポート8000​​(コードサーバのコードエディタ)の2つのTCPポートを開きます。

Linux マシンに Pythonic をインストールするには、次のコマンドを実行します。

 podman プル pythonicautomation/pythonic
podman 実行-d -p 7000 :7000 -p 8000 :8000 pythonic

Windowsマシンに切り替え、PuTTYを開き、「接続」→「SSH」→「トンネル」に移動します。転送したい2つのTCPポートを追加します。

  • ソース: ​7000​ / ターゲット: ​localhost:7000​
  • ソース: ​8000​ / ターゲット: ​localhost:8000​

PuTTYでのポート転送

次に「セッション」セクションに戻り、先ほどと同様にSSH接続を確立します。Webブラウザを開き、 ​http://localhost:7000​にアクセスすると、次のようなウィンドウが表示されます。

Pythonic

ポート転送の設定が正常に完了しました。

警告:TCPポート22をパブリックインターネットに公開する場合は、簡単に推測できるログイン認証情報は使用しないでください。世界中から、一般的な標準認証情報を使ってLinuxマシンにログインしようとするログインリクエストが届くことになります。そのため、ログインできるのは既知のユーザーのみにしてください。このログイン制限は、公開鍵暗号方式によって実現できます。公開鍵はSSHホストに保存され、秘密鍵はクライアントに保存される鍵ペアが使用されます。

デバッグ

Linux マシンへの接続に問題がある場合は、SSH デーモンのプロセスを追跡できます。

 journalctl -f -u sshd

これは通常のログイン プロセスですが、ログ レベルは DEBUG であり、次のようになります。

LogLevel DEBUG出力

もっと詳しく知る

この記事ではSSHの使い方についてはほとんど触れていません。特定のユースケースに関する情報をお探しの場合は、インターネットで無数のチュートリアルを見つけることができるでしょう。私は職場でPuTTYを使用しています。セットアップが簡単で、2つのOS間での相互運用性が高いため、接続ソリューションの万能ツールと言えるでしょう。

(この記事の画像はStephan Avenwedde氏提供、CC BY-SA 4.0より引用)