SSH 接続で遠隔操作をするための OpenSSH の設定方法（公開鍵暗号方式）

※参考にしたサイトは下記のとおりです
Arch Linux における OpenSSH の設定
https://qiita.com/tacbooon/items/02fcff8ae35c318776a0

SSH サーバのインストール，設定（Ubuntu 上）
https://www.kkaneko.jp/tools/server/pubkey.html

ArchLinux公式wiki OpenSSH
https://wiki.archlinux.jp/index.php/OpenSSH

ArchLinux公式wiki SSH 鍵
https://wiki.archlinux.jp/index.php/SSH_%E9%8D%B5

※作業をする環境
接続元（ 接続をしたい側の PC 等 クライアント）
    ->    Windows11 PC
接続先（ 接続を受け入れる側の PC 等 SSHサーバー）
    ->    ArchLinux PC / Raspberry Pi

※ iptables によるファイアウォールの設定は終わっているものとします
<br>


◆ インストール、サービス起動・有効化（ 接続先 ArchLinux での作業 ） 

```
$ sudo pacman -S openssh
$ systemctl start sshd.service
$ systemctl enable sshd.service
```

◆ Systemd サービスの有効化
※ IP アドレスの代わりにホスト名で SSH 接続するために必要
```
$ systemctl start systemd-networkd.service
$ systemctl enable systemd-networkd.service
$ systemctl start systemd-resolved.service
$ systemctl enable systemd-resolved.service
```

◆ SSH サービスの設定ファイルに変更を加える（ 接続先 ArchLinux での作業 ） 
```
$ sudo nano /etc/ssh/sshd_config

１．使用するポート 先頭の # を外す
Port 22

２．使用する鍵の種類 先頭の # を外す
HostKey /etc/ssh/ssh_host_ed25519_key

３．root によるログインを拒否
#PermitRootLogin prohibit-password の直下に追記
PermitRootLogin no

４．ログインの試行回数（任意）
#MaxAuthTries 6    ->    MaxAuthTries 4

５．ログインに鍵を使用する 先頭の # を外す
PubkeyAuthentication yes

６．空のパスワードによるログインを拒否
PermitEmptyPasswords no
```
※これ以外にも設定項目がありますが、最後の最後で行います


◆ ファイアウォール iptables.rules で SSH で使用するポートを許可（ 接続先 ArchLinux での作業 ）
```
方法１
$ sudo nano /etc/iptables/iptables.rules

-A TCP -p tcp --dport 22 -j ACCEPT
※ COMMIT の真上に追記します

方法２ ※ >> で追記となります    > は上書きになるので使ってはダメ！
# iptables -A TCP -p tcp --dport 22 -j ACCEPT
# iptables-save >> /etc/iptables/iptables.rules
```

◆ 鍵の作成（ 接続元 Windows11 での作業 ） 
Windows アイコンを右クリックして、ターミナル（管理者）の項目を選択
以下、ターミナルによる作業

```
１．秘密鍵・公開鍵を作成
PS C:\Users\username> ssh-keygen -t ed25519 -m PEM -C 'コメント欄'

※コメント欄は入れなくても OK ですが、自分に分かりやすい何かを書いていた方がいいかも（通常見ることはありませんが、読み進めていくと登場します）
例）hpc-win-11

２．鍵の作成場所（デフォで行くのでエンターキー押下）
Generating public/private ed25519 key pair.
Enter file in which to save the key (C:\Users\username/.ssh/id_ed25519): 

３．鍵のパスワード入力（計２回入力）
Enter passphrase (empty for no passphrase):
Enter same passphrase again:

４．以下の表示がされたら成功です
Your identification has been saved in C:\Users\username/.ssh/id_ed25519
Your public key has been saved in C:\Users\username/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:8rRfxa7gxHsOzlPxGWIHMtap5oYtp4bjCd01z9yvvBI hpc-win-11
The key's randomart image is:
+--[ED25519 256]--+
|           ..*o .|
|            =..= |
|             ..++|
|          . ..+o+|
|      . S. .=.  =|
|       o =.+ *...|
|        o.. =++o |
|         +.=.GE..|
|        ..+ o.KB.|
+-----[SHA256]----+

５．作成された鍵を見る（ 接続元 Windows11 での作業 ）
cd /Users/username
cd .ssh
dir    または    ls
```

◆ サーバに接続
接続先のユーザー名：raspi5
接続先のホスト名：pihost5
接続先の IP アドレス：192.168.10.7
とします
以下、接続方法の書式
『 ssh raspi5@192.168.10.7 』を『 ssh raspi5@pihost5 』と読み替えることが出来ます
```
１．接続先の IP アドレスの確認方法（ 接続先 ArchLinux での作業 ）
$ ip a

２．作成した鍵の場所に移動（ 接続元 Windows11 での作業 ）
PS C:\Users\username> cd .ssh

３．鍵を渡す（ 接続元 Windows11 での作業 ）
・接続先に .ssh ディレクトリがある場合
PS C:\Users\username> type id_ed25519.pub | ssh raspi5@192.168.10.7 "cat >> /home/raspi5/.ssh/authorized_keys"

・接続先に .ssh ディレクトリが無い場合
PS C:\Users\username> type id_ed25519.pub | ssh raspi5@192.168.10.7 "mkdir /home/raspi5/.ssh; cat >> /home/username/.ssh/authorized_keys"

４．初めて接続する場合は、下記の文言が表示されます
Are you sure you want to continue connecting (yes/no/[fingerprint])?

 yes と入力してリターンキーを押します
なお、 y では通りません

その後でパスワードを聞かれますので、入力してリターンキーを押します
※ この時点では鍵のやり取りはしてませんので**接続先ユーザーのパスワード**です

５．エラーが出てなければ、試しにログインしてみます（ 接続元 Windows11 での作業 ）
PS C:\Users\username> ssh raspi5@192.168.10.7

※ 成功していれば
Enter passphrase for key 'C:\Users\username/.ssh/id_ed25519':

と表記が変わります
ここで入力するのは**鍵の作成時に設定したパスワード**です

接続に成功すれば
[raspi5@raspi5hpc ~]$

と表示されます

６．本当に鍵が登録されたか確認します
$ cd .ssh
$ ls
authorized_keys
$ nano authorized_keys
ssh-ed25519 ~中略~ hpc-win-11

authorized_keys に自分が設定したコメントの箇所がありました
これで登録されたことが確認出来ました

Ctrl＋ｘ で保存せずに終了します
```
**まだ、終了ではありません！**
次に進みます


◆ 鍵以外ではログインできないようにします （ どちらで作業しても OK ）
※ これを設定しないと、最終的に普通のパスワードでのログインが出来てしまいます
```
$ sudo nano /etc/ssh/sshd_config

以下の場所の下に、追記をします
#PasswordAuthentication yes
PasswordAuthentication no

これで、ユーザーパスワードでのログインが出来なくなります
保存終了します
```
◆ sshd のサービスを再起動させます（ どちらで作業しても OK ）
```
$ su
Password: root パスワード

# systemctl restart sshd.service
```

◆ 番外編 ポート番号を 4444 に変えてみる（ どちらで作業しても OK ）
※ tacbooon さんのサイトによると https://qiita.com/tacbooon/items/02fcff8ae35c318776a0 によると、1024-32767 の範囲内に設定とありますので、それに合わせたほうがいいでしょう

```
１．root で作業します
$ su
Password: root パスワード

２．iptables.rules の設定の変更
# nano /etc/iptables/iptables.rules
-A TCP -p tcp --dport 22 -j ACCEPT 

上記の箇所の 22 を 4444 に変更して保存終了するだけ

３．iptables サービスの再起動
# systemctl restart iptables.service
# systemctl status iptables.service

４．sshd_config の設定の変更
# nano /etc/ssh/sshd_config
#Port 22
Port 4444

上記のように編集して保存終了

５．sshd サービスの再起動
# systemctl restart sshd.service
# systemctl status sshd.service

６．ログアウトします
# exit
$ exit

７．通常の ssh 接続をしてみます（ 接続元 Windows11 での作業 ）
PS C:\Users\username> ssh raspi5@192.168.10.7

※入れなくなっているはずです

８．ポート番号 4444 でログインする方法
PS C:\Users\username> ssh -p 4444 raspi5@192.168.10.7
```
これでエラーが表示されずに入れたら OK です
基本的に自分の家の中だけで接続する場合は必要ないと思いますが、外部から接続する場合は変えておいた方がいいかも知れません
なお、当然外部から接続するためにはルーターでポートの開放が必要になりますが、ここでは説明しません