DebianをWindows10上で動かす その5: SSHで接続する

前回はWindows Subsytem for Linux (WSL)に導入したDebian GNU/Linuxでターミナル多重化ソフト(byobu + screen)を設定してみました。

これで使い勝手はほぼ本物のLinuxと同じになってきたのですが、若干動きがもっさりしているように思います。

遅い理由が使用しているターミナルソフトのせいかわからないですが、SSHでつなげて実績のあるターミナルソフト(PuTTY)を使ってみたいと思います。

SSHとPuTTY

SSH(Secure Shell)とはLinuxをはじめとするUnix系のシステムに安全にリモートで接続するための仕組み(プロトコル)です。

WindowsからLinuxに接続する場合に標準的に使われるのがこのSSHです。

WindowsでSSHを使ってLinuxに接続するためには、専用のクライアントソフトを使用します。

私の場合はいつもPuTTYと呼ばれるフリーソフトの日本語版PuTTYjpを使っています。

WSLのLinuxも同じLinuxでですので、今回もPuTTYjpを利用します。上記のページからダウンロードしてzipファイルを展開しておきましょう。

SSHサーバのインストール

それではWSLで作業をしていきます。

まずはSHHサーバとしてOpenSSHを導入します。

$ sudo apt-get install openssh-server

私の場合は依存しているパッケージと合わせて24個のパッケージがインストールされました。

コマンド一発でインストールできるので簡単です。

SSHサーバの設定

SSHサーバ(OpenSSH)をインストールしたら設定して行きます。

基本的にはデフォルトのままでも運用できますが、安全のため接続はローカル(=WSLを動かしているWindows10)からだけに限定しておきましょう。

/etc/ssh/sshd_configの下記の2行を変更します。

#ListenAddress 0.0.0.0
#ListenAddress ::

↓↓↓

ListenAddress 127.0.0.1
ListenAddress ::1

sshd_configを変更したらOpenSSH serverを再起動します。

$ sudo service ssh restart

SSHクライアント(PuTTY)の設定

つづいてダウンロードしたPuTTYjpを起動します。実行はputtyjp.exeをダブルクリックするだけです。

最初にPuTTYの設定画面が開くのでホスト名に「127.0.0.1」を入力します。IPv6を使う場合はホスト名は「::1」です。

そして接続タイプが「SSH」であることを確認して「開く」を選択します。

puttyでの接続先の設定

これでPuTTYがWSLのSSHサーバに接続しに行きます。

初回は次のようなメッセージが表示されるので「はい」を選択します。

サーバのフィンガープリントの表示

これはPuTTYが知らないSSHサーバに接続したことを示しています。

2回目の接続で表示される場合は、SSHサーバがすり替わっている可能性があるので注意してください。

これで次のような画面に切り替わるはずです。

SSHへのログイン

あとはWSLで作成したユーザ名とパスワードを入力してログインします。

ログインに成功したらシェル画面になります。

SSHでのログイン後

あとはこの画面でWSLの操作をすることができます。

SSHで接続したときは「.bash_profile」が実行されるので、.bash_profileにbyobuを起動するように設定しておけば、PuTTYの画面で複数のセションを切り替えて使うことができます。

byobuの設定については下記を参照してください。

今回はWindows Subsystem for Linux (WSL)の使い勝手を向上すべく、byobuとscreenを導入してターミナルを多重化してみます。 本物のLinuxで設定するのに比べ、若干追加の設定が必要ですが、使い勝手は本物のLinuxとほぼ同様です。若干動作が遅いのが気になる点かもしれません。

SSH接続を自動化する

SSHは鍵認証方式を設定すると、ユーザ名・パスワードを入力することなく接続することができます。

設定手順は次のようになります。

  1. SSHサーバの鍵認証方式を有効にする
  2. Windows上で公開鍵・秘密鍵にペアを作成する
  3. 公開鍵をWSL上のLinuxにコピーする
  4. コピーした公開鍵をSSHの認証ファイルに追加する
  5. PuTTYで公開鍵認証を使う設定を行う

となります。

順々に説明していきます。

SSHサーバの鍵認証方式を有効にする

WSL上の作業になります。

/etc/ssh/sshd_configの下記の行を変更します(先頭の「#」を削除します)。

#PubkeyAuthentication yes

↓↓↓

PubkeyAuthentication yes

同様に下記の行の先頭の「#」も削除します。

#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2

↓↓↓

AuthorizedKeysFile     .ssh/authorized_keys .ssh/authorized_keys2

sshd_configを変更したらOpenSSH serverを再起動します。

$ sudo service ssh restart

Windows上で公開鍵・秘密鍵ペアを作成する

PuTTYjpに付属していたPuTTYgen(puttygen.exe)を使用します。PuTTYgenを実行すると次のような画面が現れます。

公開鍵・秘密鍵のペアを作成する場合は、「Generate」ボタンを押します。

公開鍵・秘密鍵ペアの生成

「Generate」ボタンを押したらキーの生成が始まりますので、「Key」のエリアの上でマウスを適当に動かしましょう。マウスの動きを使ってkey必要な乱数を生成しているようです。

公開鍵・秘密鍵ペアの生成中

Keyの生成が完了すると次のような画面になります。

公開鍵・秘密鍵ペアの生成完了

コメントはこのキーを利用するクライアント(Windowsマシン)の名前などにしておくとよいでしょう。

生成した秘密鍵を安全な場所でのみ利用するでしたらパスフレーズは空欄のままでも構いませんが、そうでない場合は安全のため入力しておいた方がよいと思います。もちろん確認用のパスフレーズの欄にも同じパスフレーズを入力しておきます。

コメントとパスフレーズの設定が終わったら、「Save private key」で秘密鍵をファイルに保存します。ここではprivate.ppkとして保存したとします。

最後にOpenSSH用の公開鍵(赤枠で囲った部分のテキスト)をすべてテキストファイルにコピーしておきます。

ここではデスクトップのpublickey.txtにコピーしたとします。

公開鍵をWSL上のLinuxにコピーする

ここはWSLでの作業になります。

WSLではWindowsのCドライブは「/mnt/c」以下に見えます。

この仕組みを使って先ほど作成したテキストファイル(デスクトップのpublickey.txt)をホームディレクトリにコピーします。

$ cp /mnt/c/Users/Windowsのユーザ名/Desktop/publickey.txt ~

コピーした公開鍵をSSHの認証ファイルに追加する

ここもWSLでの作業です。

先ほどコピーしたテキストファイル(publickey.txt)を、ホームディレクトリの.ssh/authorized_keyファイルに追記します。

なお、.sshディレクトリのがないときは、自分で作成する必要がありますが、パーミッションは「700」とする必要がある点に注意してください。

同様にautholized_keysファイルのパーミッションは「600」とする必要があります。

$ mkdir .ssh
$ chmod 700 .ssh
$ cat publickey.txt > .ssh/authorized_keys
$ chmod 600 .ssh/authorized_keys

PuTTYで公開鍵認証を使う設定を行う

またWindows10での作業に戻ります。

PuTTYjpを起動して接続の設定画面で、左側のカテゴリで「接続→データ」を選択して「自動ログインのユーザ名」にWSLでのアカウント名を入力します。

ログインアカウントの設定

つづいて左側のカテゴリで「接続→SSH→認証」と選択して、「認証のためのプライベートキーファイル」に先ほど保存した秘密鍵(private.ppk)を設定します。

秘密鍵ファイルの設定

最後に左側で「セッション」を選んで接続するホスト名を「127.0.0.1」として「開く」を選択します。

接続先の設定

これでPuTTYのウィンドウが開き、自動的に設定したアカウントでログインできずはずです。

これでパスワードの入力などは不要でログインできることが確認できました。

PuTTYの設定の調整

パスワード無しでSSH接続できることを確認したら使いやすく設定していきましょう。

PuTTYは接続先の情報をセッション情報として保存してあとで呼び出すことができます。

まずセッション情報を作成します。ホスト名を「127.0.0.1」と入力した上で、セッション名を入力して「保存」を選択します。

セッション名は単なる目印なので「WSL」でもしておけば良いと思います。

接続先とセッションの保存

基本的にはデフォルトの設定でも使えるのですが、PuTTYの設定を微調整していきます。

まず左側で「端末」→「ベル」を選んで、ベルのスタイルの設定で「なし (ベルは無効)」を選択しておきます。これはビーブ音がうるさいからです。

ベルの無効化

左側で「端末」→「高度な設定」を選んで、「アプリケーションキーパッドモードを無効にする」を選択します。これは、vi等のアプリケーションでテンキーを使えるようにするためです。

アプリケーションキーパッドモードの無効化

次に見た目を設定していきます。

左側で「ウィンドウ」を選択して、「桁」と「行」を変更します。昔はUnixのターミナル画面といえば横80文字というのが普通でしたが、ディスプレイの高解像度化が進んだ最近では狭すぎるので120ぐらいにすると良いでしょう。

ウィンドウサイズの設定

「ウィンドウ」→「外観」ではフォントを設定しておきます。自分の好みに応じてフォントやフォントサイズを変更しましょう。

フォントの設定

私は文字を見分けやすいMiguフォントを使っています。

「ウィンドウ」→「変換」では、リモートの文字セットで「UTF-8」を選択します。

文字コードの設定

つづいて接続に関する設定をしていきます。

「接続」→「データ」では、「自動ログインのユーザ名」にはWSLでのユーザ名を設定し、「端末タイプを表す文字列」には「putty-256color」を設定します。

ログインユーザと端末タイプの設定

あとは「接続」→「SSH」→「認証」で「認証のためのプライベートキーファイル」を設定してきます。

秘密鍵ファイルの設定

全ての設定が終わったら「セッション」に戻り、保存をします。

設定したセッションの保存

これで次回からはセッション一覧から、保存したWSLセッションをダブルクリックすればWSLのSSHサーバにつながるようになります。

もちろん鍵認証でログインは自動になります。

タスクバーのPuTTYを右クリックして作成したセッションをピン留めしておけば、さらに簡単にWSLにSSH接続することができます。

注意点

SSH接続でログインすると、ログイン時に「.bashrc」ではなく「.bash_profile」を実行します。

「.bash_profile」に「.bashrc」を読み込むように記載しておいた方が良いかもしれません。

source .bashrc

またよくわからないのですが、環境変数のLANGUAGEとLC_ALLが不適切になる場合がありました。

これらの環境変数は.bashrcで次のように明示的に設定した方が良いでしょう。

export LANG=ja_JP.UTF-8
export LANGUAGE=ja_JP.UTF-8
export LC_ALL=ja_JP.UTF-8

WSLへのSSH接続の課題

SSH接続をすることでWSLで使い慣れたターミナルソフトPuTTYを使うことができます。

しかし最大の課題はWSLのSSLサーバ(OpenSSH)は手動で起動することがある、ということです。

SSH接続する前に、別途WSLを起動して

$ sudo service ssh start

をしなければ行けません。

もちろん、SSH接続しているときにこのWSLのターミナルを閉じるとSSHサーバが停止してしまうため、SSH接続も切れてしまいます。

噂によると2018年4月のWindows10の大型アップデートではバックグランドでWSLのプログラムを動かせるという話もあります。

もしこれが本当ならバックグランドでSSHサーバを動かして、いつでもSSHで接続できるようになるかもしれません。

まとめ

今回はWindows Subsystem for Linux上のDebianにSSHサーバを導入して、SSHで接続できるようにしました。

これで使い慣れたターミナルソフトPuTTYを使ってWSLを操作できるようになります。ただ、事前に手動でSSHサーバをWLSで起動しておかなければ行けません。

早くバックグランドでWSLが動作するようになってほしいものです。

次回はWSL上のDebian GNU/LinuxとLinuxファイルサーバ間でのファイル共有について検討します。