WindowsクライアントからOpenSSHを使ってLinuxサーバーに接続して解析する

日付;2024/10/14(月)

1.はじめに

最近、職場でトランスレーショナルスタディーっぽい解析をすることが多く、そのために比較的大きなコンピューターを買った(2年前の1.5倍から2倍くらいの性能のコンピューターを、それと同じくらいの価格で購入した。コンピューターの大きさも半分くらいしかない。)のだが、色々あって、それをちょっとしたサーバーとして使用しなくてはならない可能性がある。そこで、その購入したコンピューターをリモートホスト(サーバー。人によって色々と呼び名が異なるので、素人的に非常に混乱するところである。)として解析に使用できる環境を整えた。正直、どのファイルをどのディレクトリーに保存したらよいか覚えておく自信が無いので、その設定方法を記録しておこうと思う。先週の金曜日(2024年10月11日)にこの作業をしたのだが、約3日後、大部分を忘れてしまっていた。

やりたいこととしては、大きなメモリやCPUのパワーが必要な解析はLinux側(リモートホスト・サーバー)を使い、一般的な実験データの解析やそこまで大きくない計算などはWindows(クライアント)を使い、そして、結果などのデータのやり取りをSCP(Secure Copy Protocol)を使って行う、ということである。このために、Linux側にもWindows側の両方にSSHをインストールし、秘密鍵と公開鍵を作って、各々の公開鍵をLinux側とWindows側に各々登録する必要がある。

言うても自分はネットワークセキュリティーなどは全く専門外であるため、必要最低限を設定して、ひとまず、怯えながら職場のクローズドな環境で運用していくことにする。以下の設定ではコンピューターやネットワークを守るものはパスワードと秘密鍵だけになるはずなので、例えば、別の人が使用するアカウントを増やして運用するような場合はもっとセキュリティーをしっかりと固めなくてはならないと思う。

ここでは、PuTTYやTera Termなどは使用しない。これらは便利なのは知っている。でも、余計なソフトをWindowsに入れたくない。PowerShellか、コマンドプロンプト一択である。PowerShellやコマンドプロンプトでSSHやSCPは出来る。言うても、自分はコマンドプロンプトやPowerShellとか全然知らんのだが。

2.WindowsでOpenSSHをインストールしてSSHを実行する

LinuxとWindowsの間を行き来して解析を進めていくことになるため両者で同じような設定を行う。まずはWindowsから設定する。自分にとってはこのWindowsの設定が一番難しかった。自分はWindowsにはあまり詳しくない。Windowsでは、ImageJ 、Gnuplot、Microsoft Officeくらいしか使ってこなかったし、これまでコマンドプロンプトを本気で使ったことってないのじゃあないだろうか。大体、あのPowerShellやコマンドプロンプトはコマンドや引数がいちいち複雑で長文だし、なんか用語も特殊な気がするし、そんなんなのでまともに動いたことなんかない。Windowsなんか、こんなもんMicrosoft Office専用機である。

言うてても埒が明かないので、WindowsにOpenSSHをインストールする。PowerShellを管理者権限で開き、以下の2つを流し、OpenSSHをインストールする。参考にしたのはここ

PowerShell
# Install client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
# Install server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

次に、サービスを走らせる。

PowerShell
Start-Service sshd
Set-Service -Name sshd -StartupType 'Automatic'

3.Windows側のsshd_configを設定する

イキって全部PowerShellで設定してやろうと思ったけど、なんか構文がよくわかんないし、もう嫌になってきた。ということで、Windowsご自慢のGUIに頼ることにした。

Windowsのスタートから、「Windows管理ツール」-> 「サービス」-> 「OpenSSH SSH server」をクリックする。すでに「開始」されていると思うので、「停止」を押してから、改めて「開始」を押す。そうすると、Cドライブ直下のProgramDataというディレクトリの中にあるsshというディレクトリ(C:\ProgramData\ssh)に、色々と公開鍵や秘密鍵が生成されている。ちなみに、このProgramDataというディレクトリは隠しディレクトリなので、コントロールパネルにある「エクスプローラーのオプション」から、隠しディレクトリも全部表示するように設定する。そうすると、ProgramDataにクリックでアクセス出来るようになる。必要なのはこのsshディレクトリの中にあるsshd_configというファイルである。

「Windows管理ツール」-> 「サービス」-> 「OpenSSH SSH server」

先程開始したOpenSSH SSH serverをまた「停止」させ、このsshd_configをメモ帳か何かで開く。そうすると、以下の画像のような内容が書かれているのがわかる。

こんな感じ。

最初は大部分の設定はコメントアウトされている。それでは困るので、必要な箇所の#を消していく。自分は、以下の部分のコメントを外した(すなわち、行の頭についている#を消した。)。

SSH Config
Port 22
HostKey __PROGRAMDATA__/ssh/ssh_host_rsa_key
HostKey __PROGRAMDATA__/ssh/ssh_host_dsa_key
HostKey __PROGRAMDATA__/ssh/ssh_host_ecdsa_key
HostKey __PROGRAMDATA__/ssh/ssh_host_ed25519_key
PubkeyAuthentication yes
PasswordAuthentication yes
PermitEmptyPasswords no

次に、AuthorizedKeysFile .ssh/authorized_keysのところを変えるなり、追加する。AuthorizedKeysFileにはWindowsにログインしてくるコンピューター(ここではLinux)で作成した秘密鍵のファイル名を記載する。Windowsデフォルトではauthorized_keysが秘密鍵のファイル名として設定されているようだ。Windowsにログインしてくるコンピューターの数に応じて以下のように追加していく。後にLinux側で秘密鍵を作成する(9.Linux側で公開鍵(public key)と秘密鍵(private key)を作成する)が、以下のように入力した場合は、作成する秘密鍵のファイル名もauthorized_keys、second_keys、third_keysのどれかにする必要がある。ここではauthorized_keysを使う場合で述べていく。

SSH Config
AuthorizedKeysFile  .ssh/authorized_keys
AuthorizedKeysFile  .ssh/second_keys
AuthorizedKeysFile  .ssh/third_keys

これで、Windows側の設定はOKである。

4.LINUX側にOpenSSHをインストールしてSSHを実行する

リモートホスト側であるLINUXにWindowsを繋ぐ(LinuxにWindowsでログインする)ための設定をする。まずはLINUXにSSHをインストールし、実行する。以下のコードを順次流す。LINUXに慣れている人であれば、これは非常に簡単である。特に迷うことはない。

Bash
sudo apt install openssh-server #Install OpenSSH
sudo systemctl start ssh # Run SSH
sudo systemctl enable ssh # Start SSH at starting up the computer

5.Linux側のssh_configの設定をする

LinuxへWindowsがログインして来ることになる。ここでは、そのときの承認方法を設定する。

Ubuntuでは.sshディレクトリーは通常隠しディレクトリになっている。なので、まずはLinuxのホーム(どこでも良い)に行って、Control + Hを押す。そうすると、隠しディレクトリが表示され、.sshに行けるようになる。当然、ターミナルでも簡単に見れるので、そちらのほうが良い場合はターミナルを使えば良い。

sshの設定ファイルは以下のようにアクセスする。自分は昔からgeditを使っているので、それを使う。最近のUbuntuにはこれはデフォルトで入っていないので、自分でsudo apt install geditする必要がある。

Bash
sudo gedit /etc/ssh/ssh_config

次に、3.でWindows側(クライアント)の設定を行った(3.Windows側のsshd_configを設定する)が、それと同じことをLinux側(リモートホスト)でも行う。以下の値の頭についていたコメント(#)を消しておいた。

SSH Config
   PasswordAuthentication yes
   IdentityFile ~/.ssh/id_rsa
   IdentityFile ~/.ssh/id_dsa
   IdentityFile ~/.ssh/id_ecdsa
   port 22

このIdentityFile ~/.ssh/id_rsaのところに秘密鍵のファイル名を書く。Windowsでの設定と同様(3.Windows側のsshd_configを設定する)もし接続するコンピューターが増えて別ファイル名の公開鍵で繋ぐ必要があるときは、以下のようにこの行を追加できる。id_rsaやid_rsa1のところは、クライアント側、すなわちWindowsで作成した秘密鍵の名前である。

SSH Config
IdentityFile ~/.ssh/id_rsa
IdentityFile ~/.ssh/id_rsa1
IdentityFile ~/.ssh/id_rsa2
IdentityFile ~/.ssh/id_rsa3
IdentityFile ~/.ssh/id_rsa4

最後に、念の為に以下を流す。

Bash
service ssh restart

これを流したあとにログオフしてログインし直し、以下でSSHが開始されているか確認した(正直、正しい再起動の方法がよくわからなかったため)。これでSSHがActiveになっていればOKである。

Bash
sudo systemctl status ssh

Activeなのを確認できたら、このコマンドから抜ける。Control + Cを打てば良い。これで動いていることが確認できた。

6.Windows側で公開鍵(public key)と秘密鍵(private key)を作成する

次にWindowsに戻って公開鍵と秘密鍵を作成する。ここでも管理者権限でPowerShellを立ち上げた。コマンドプロンプトも使用できた。

PowerShell
ssh-keygen -t rsa -b 4096

秘密鍵と公開鍵のベースとなる名前の入力が求められる。秘密鍵の名前をデフォルト通りのものを使用する場合は空欄のままエンターを押せばOKで、その場合は.sshディレクトリーにid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成される。もし名前を変えたかったら、C:\Users\kats\.ssh\id_rsa2のように入れてエンターを押せば、id_rsa2(秘密鍵)とid_rsa2.pub(公開鍵)がC:\Users\kats\.sshに作成される。ちなみに自分の場合、パスの部分を入力するとどうしても「そんなディレクトリは無い」的なエラーが出てしまい、作成できなかった。その場合、id_rsa2とだけ入力すれば、C:\Users\kats\に秘密鍵と公開鍵が出力されていた。id_rsa2のように秘密鍵と公開鍵の名前を変える場合(5.Linux側のssh_configの設定をする)は、linux側のssh_configに書いてあるIdentityFileのところに、その秘密鍵のファイル名を書く必要がある。

これを流すと、パスフレーズの入力を2回求められるので、何か適当なフレーズを入れておく。これはメモしておいた方が良い。

7.Windows側で作成した公開鍵(public key)をLinuxの.sshディレクトリーに入れる

Windows側で作成した公開鍵(ここではid_rda.pub)を、Linux側のホームにある.sshの中(/home/kats/.ssh/)にコピーする。それだけ。コピーが済んだら、Windows側に戻る。

8.Windows側からLinux側にログインしてみる

Windowsの「サービス」で「OpenSSH SSH service」をクリックし、「開始」する。こうしなければSSHが動いていないわけなので、エラーが出てしまう。次に、PowerShellかコマンドプロンプトで以下を入力することで、WindowsからLinuxにログインすることが可能である。ログインするときに、Linux側で設定してあるログインパスワードを聞かれるので、それを入力すればLinuxのあのプロンプトが表示される。SCPを使ったり、bashを使う解析しか行わないので、それで十分と思う。ここでログインできなかったりしたら、SSHが起動しているのかどうか、ssh_configの中で正しく#が消されているかどうか等を確認したら良い。

PowerShell
ssh -i "C:\Users\kats\.ssh\id_rsa" kats@xx.yyy.aa.bb

9.Linux側で公開鍵(public key)と秘密鍵(private key)を作成する

次に、LinuxからWindowsにログインするために、Linux側で以下を実行し公開鍵と秘密鍵を作成する。

Bash
ssh-keygen -t rsa -b 4096

これを流すと、Enter file in which to save the key (/home/kats/.ssh/id_rsa): と表示されるが、空欄のままエンターを押すとid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成される。ここで作成される秘密鍵と公開鍵は、LinuxからWindows側にログインするために使用するものであり、Windowsのデフォルトはauthorized_keysとなっているので、/home/kats/.ssh/authorized_keysと入力する必要がある。もちろん、ここは別の名前も使用することができる。別の名前を使用する場合は、Windowsのsshd_configでAuthorizedKeysFileを.ssh/second_keysなど適切に変更もしくは追加する必要がある(3.Windows側のsshd_configを設定する)。

10.Linux側で作成した公開鍵(public key)をWindowsの.sshに保存する。

次にWIndows側に移動し、サービスからOpenSSH SSH serviceに行き、「停止」させ、次に、WindowsのCドライブ、ユーザー、ユーザー名の中にある.ssh(C:\Users\kats\.ssh)に、Linux側で作成したauthorized_keys.pubをコピーする。次に、またサービスのOpenSSH SSH serviceを「開始」させる。これで、Linux側からWindows側にログインする準備が整う。

11.Linux側からWindows側にログインしてみる。

それではいよいよ、Linux側からWindows側にログインしてみる。ここで、ユーザー名がわからないという、ちょっとした問題が起こるはずである。

普段Linuxに慣れており、かつ、Windowsはオフィスくらいしか使わない人間は、Windowsのユーザー名などがよくわからない場合があると思う。しかも、Windowsってマシン名やアカウント名など、色々と書いてあり、余計にどれがユーザー名なのかわからないはずである。

そんなときは、使用するWindows側にまた戻って、PowerShellで以下を打つと良い。

PowerShell
whoami #This is on Windows machine, not Linux machine.

出力としてはdesktop\katsみたいになると思う。この\(もしくは¥マーク)の後ろのkatsが、sshによるログインで必要な部分である。そしてIPアドレスは、以下で調べる。

PowerShell
ipconfig #This is on Windows machine, not Linux machine.

これにより出力されるIPv4アドレスのところが必要である。

そして、Linux側にまた戻り、以下を打つ。xx.yyy.aa.bbはWindowsのipconfigで調べたIPアドレス、@の前(katsに相当する部分)が、Windowsのwhoamiで調べたユーザー名である。

Bash
ssh -i "/home/kats/.ssh/authorized_keys" kats@xx.yyy.aa.bb

これを打つと、Are you sure you want to continue connecting (yes/no/[fingerpring])?と聞かれるので、それに対し「yes」と入力し、次に、Windowsで普段使っているパスワードを入力すればログインできる。もしここでログインできないときは、WIndows側のsshd_configの内容に間違いがあったり、設定が反映されていない場合があるので、その場合はもう一度「サービス」「OpenSSH SSH service」を「停止」して設定を見直し、「再開」させてからログインを試みる。上手くログインできると、Windowsのコマンドプロンプトと同じようなプロンプトが表示される。

12.Linux側からWindows側へSCP(Secure Copy Protocol)でファイルを送る

以下のコードでLinuxからWindowsにファイルを転送できる。主に解析で得られたグラフなどをwindowsに転送する目的で以下を利用することになるだろうと思う。グラフなど、かなりの数になる可能性もあるので、基本的に結果を全部保存したディレクトリをそのまま送ることになるだろうと思う。

転送先のWindowsのディレクトリに空欄場ある場合は基本ダブルクオートで括るのだが、どうしてもうまく行かなかった。また日本語のWindowsはバックスラッシュをエスケープさせなければならない。

Bash

scp -i "/home/kats/.ssh/authorized_keys" -r "/home/kats/SCP test/" kats@xx.yyy.aa.bb:C:\\Users\\kats\\

13.Windows側からLinux側へSCP(Secure Copy Protocol)でファイルを送る

WindowsからLinuxに送る場合は、非常にスムーズにファイルをコピーすることができた。

PowerShell
scp -i "C:\Users\katsu\.ssh\id_rsa" -rv "C:\Users\katsu\SCP test win" kats@xx.yyy.aa.bb:"/home/kats/SCP test/"

14.サーバーの情報が変わったら要注意

サーバーの情報が変わったりしたら、以下のような警告が出るので、これが出たらマジで要注意だなって感じである。It is possible that someone is doing something nasty!らしい。誰か何かをやりやがったという意味だろう。

15.まとめ

以上がOpenSSHを使ってWindowsとLinuxを相互に接続し、各々のコマンドを利用する方法になる。基本的にマシンスペックが高く、場所的にも移動できないコンピューター、この場合ならLinuxがリモートホスト(サーバー)に、モバイルの方、この場合ならWindowsのほうがクライアントという運用になるのだろうと想像する。これで、クライアントであるWindowsからリモートホストであるLinuxにアクセスして、Bashを使って必要なデータのダウンロードや解析を行うすることが出来る。そして、得られた結果をLinuxからWindowsにSCPでコピーする、という方法になる。

最初に書いたが、自分はあまりセキュリティーについて詳しくないので、不正なアクセスが無いようにビビりながら、ちゃんとパスワードを設定し、ログを見ながら運用することになるだろう。解析していておかしなプログラムが走っていないか、とかちゃんと見ながらだろうと想像している。