Windows標準のsshを触ってみよう
以前はssh接続といえば、PuTTYやTeraTermを使ったものがほとんどでしたが、現在はWindows PowerShellの一部としてsshが含まれ、Windows PowerShellのみで他のアプリに頼ることなくssh接続ができるようになりました。今回はssh接続に使う鍵の作り方と、パスワードなくリモートへログインする方法をご紹介します。
目標は "パスワードレスログイン"!!
「パスワードを聞かれることなく、WindowsからUbuntuにログインしたい」 (下図)
作業手順
Ubuntuにsshdをインストールする
まず、リモートとなるUbuntuがssh接続を受けられるよう、サーバをインストールします。
### Ubuntu上での操作
$ sudo apt install openssh-server -y
... openssh-serverがインストールされます
$ sudo systemctl start sshd
... sshdのサービスを開始します
$ sudo systemctl enable sshd
... OS起動時に自動的にsshdのサービスが開始されるよう設定します
$ systemctl status sshd
... SSHDが起動していることを確認します
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enab
Active: active (running) since Sat 2024-11-09 17:39:04 JST; 51min ago
Main PID: 937 (sshd)
Tasks: 1 (limit: 4915)
CGroup: /system.slice/ssh.service
└─937 /usr/sbin/sshd -D
WindowsにWinSCPをインストールし、ssh接続を確認する
Windowsへ WinSCP をインストールし、IPアドレス、ユーザー名、パスワードの組でログインできることを確認します。ここではユーザー名 shino でログインしてみました。
Ubuntu上にsshの公開鍵を登録するファイル/ディレクトリを作る
続いてUbuntu上にsshの鍵情報を保存するディレクトリとファイルを作成します。ここでchmodによりファイルやディレクトリのアクセス権限(パーミッション)を細かく設定していますが、この手順は非常に重要です。パーミッションが違うとssh接続時に鍵情報をサーバ側が正しく読みだせず、普通のパスワードログイン画面が出てしまいます。
### Ubuntu上での操作
$ mkdir -p /home/shino/.ssh
$ touch /home/shino/.ssh/authorized_keys
$ sudo chmod 700 /home/shino/.ssh
$ sudo chmod 640 /home/shino/.ssh/authorized_keys
パーミッションについてはこちらの記事を参考にしました。
Windows上でSSHの秘密鍵/公開鍵のペアを作成する
今回はパスフレーズなしの秘密鍵/公開鍵のペアを作成します。Windows PowerShellを起動して、ホームディレクトリへ移動し、ssh-keygenコマンドを実行しましょう。この例ではユーザー"ixiv2"で作業しています。
### Windows上での操作
$ cd ~
$ mkdir .ssh
$ cd .ssh
$ pwd
C:\Users\ixiv2\.ssh
$ ssh-keygen.exe -q -t rsa -C '""' -N '""' -f id_rsa
... パスフレーズを持たない秘密鍵/公開鍵のペアを作成します
$ ls
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2024/11/09 18:53 2578 id_rsa
-a---- 2024/11/09 18:53 555 id_rsa.pub
今回紹介する簡単ログインは、ここで作成した公開鍵「id_rsa.pub」の中身をUbuntuに格納し、秘密鍵「id_rsa」を持っているクライアントからログインが来た時に認証を通す、という仕組みです。
なお、パスフレーズなしの鍵の作り方は下記の記事を参考にしました。
Windows上にsshサーバ情報ファイルを作成する
次にサーバ名を指定したときに、そのサーバがどのアドレスで、なんというユーザでログインするか、という設定を含んだ設定ファイルをWindows上に作成します。作成位置は「~/.ssh/config」です(拡張子無)。
### Windows上での操作
$ cd ~
$ cd ./.ssh
$ notepad config
... 新規ファイルを作成するか聞かれるのでYES
... 以下内容を入力する
... Ubu18サーバにshinoでログインする
... サーバのIPアドレスを指定
... サーバとの接続に使う秘密鍵を指定
Host Ubu18
HostName 192.168.10.134
User shino
IdentityFile ~/.ssh/id_rsa
Ubuntu上のauthorized_keysに公開鍵を書き込む
WinSCPでWindowsからUbuntuへログインし、authorized_keysに公開鍵を書き込みます。
### Ubuntu上での操作
$ vi /home/shino/.ssh/authorized_keys
... 公開鍵を書き込む
$ cat /home/shino/.ssh/authorized_keys
(例) ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQC916d8N7J6Sbb1jB3ifnNSqtiqiPEhxVoye5f+KiAhyxGtQPhswdsWyzs2VbeDtE6EthfhBefdN2gi1Euju5h9wKdLKXNeUfsDBa5a6l7loFsDz4fwRT4zCCrMU0Jly2pCMDCV1+YvjkE/ogglQcGAL104KuWMEZJptucoQ9hHZ2tdjY/c3wvwmeoKVRlYfPLneTb7ublAN0xIC8hsKjVUFXyLJ2Smops0/xs0fjvln28I19KrXrAp2poO0IFMSQUb0HAlsFHI7J+ApXUvmFkGQdQbJlhUINmWoxWgX0dFK2+FNa5Qq1DGTmywsySaS44zQke+CqaCUi4re+MJgcfwp7AM8zkqejc/CeEOa8oMmH/DXObWh9kf0MY+Jtgod21VMISeGZyXaa04AID6Lpq/9aWlofj9ATpO0eJCEwyuV7wqMGMDcUm6ojKmjV++njwFwaPqqkM7IRE7+AKd3Bl8D0cGfKxlVgj7843xIfvG/cuYFq5ar2yZTBDmAgbS8qE=
以上で設定完了です。
WindowsからUbuntuへログインする
最後にWindows上からSSHコマンドを実行します。初回の接続では、不明なホストに本当に接続してよいか(Are you sure you want to continue connecting (yes/no/[fingerprint])?)聞かれますので、yesと入力してください。これでパスフレーズ不要のログインは成功です。
### Windows上での操作
$ ssh Ubu18
...
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
...
Your Hardware Enablement Stack (HWE) is supported until April 2023.
Last login: Sat Nov 9 18:02:45 2024 from 192.168.10.115
shino@shino-Ubu18:~$ <<-- Ubuntu上にログインできた
shino@shino-Ubu18:~$ exit
ログアウト
Connection to 192.168.10.134 closed.
PS C:\Users\ixiv2\.ssh>
実はリモート開発の下準備でした
実は、今回の記事はVisual Studio Codeを使う下準備でした。Windows標準のSSHが利用できると、Visual Studio Codeの「Remote Development」拡張機能を使ってGPUをごっそり積んだUbuntuサーバ上で動くPythonコードをリモートから開発できてしまうそうです…!楽しみですね!