Windows標準のsshではじめてのssh-keygen、パスワードレスなログイン

# Windows標準のsshを触ってみよう

以前はssh接続といえば、PuTTYやTeraTermを使ったものがほとんどでしたが、現在はWindows PowerShellの一部としてsshが含まれ、Windows PowerShellのみで他のアプリに頼ることなくssh接続ができるようになりました。今回はssh接続に使う鍵の作り方と、パスワードなくリモートへログインする方法をご紹介します。

## 目標は "パスワードレスログイン"!!

**「パスワードを聞かれることなく、WindowsからUbuntuにログインしたい」** (下図)

![2024-11-09 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/a3bcfbdc-4139-2bf8-9f65-82be10fc492e.png)

## 作業手順

### 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](https://winscp.net/eng/docs/lang:jp) をインストールし、IPアドレス、ユーザー名、パスワードの組でログインできることを確認します。ここではユーザー名 shino でログインしてみました。

![2024-11-09 (6).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/872aba4b-e4a9-75ce-db08-5ff4d6754de2.png)

### 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
```

パーミッションについてはこちらの記事を参考にしました。

https://qiita.com/kenmaro/items/88ca644b73676047d939

### 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
```

![2024-11-09 (8).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/61f2ecf9-e32d-3a10-664a-023ccb8e512d.png)

今回紹介する簡単ログインは、ここで作成した公開鍵「id_rsa.pub」の中身をUbuntuに格納し、秘密鍵「id_rsa」を持っているクライアントからログインが来た時に認証を通す、という仕組みです。

なお、パスフレーズなしの鍵の作り方は下記の記事を参考にしました。

https://qiita.com/overflowfl/items/14a2486df85fd7efac85#23-windows%E3%81%AE%E5%A0%B4%E5%90%88powershell

### 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>
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/0e3e2812-2369-548f-874a-d2db626628a0.png)

## 実はリモート開発の下準備でした

実は、今回の記事はVisual Studio Codeを使う下準備でした。Windows標準のSSHが利用できると、Visual Studio Codeの「Remote Development」拡張機能を使ってGPUをごっそり積んだUbuntuサーバ上で動くPythonコードをリモートから開発できてしまうそうです…！楽しみですね！

![2024-11-09 (10).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3919880/983289f6-2f39-670e-2181-a0a8d0e4ac54.png)