XserverレンタルサーバーにSSHアクセスする

## 概要
Xserverレンタルサーバーを借りたので
1. SSHアクセスできるようにした
2. デフォルトで生成された公開鍵の暗号化アルゴリズムがイマイチ（`RSA`）だったので`Ed25519`に変更

### 動作環境
- macOS Sonoma Version 14.5
- OpenSSH 9.6p1

## Xserverのマニュアル通りに設定してみる
Xserverレンタルサーバーを借りることにしたので、何はともあれSSHアクセスできるように設定を行いました。
Xserverレンタルサーバーは、初心者にもやさしい親切マニュアルが用意されています。 ヘルプも充実していますし悩むことはあまりなさそうです。

https://www.xserver.ne.jp/manual/man_server_ssh.php

とりあえずこのマニュアルに沿ってSSH接続を行ってみます。 ポイントとなるのは
- パスワード認証はオミットされており、必ず公開鍵認証でログインする必要がある
- 接続先ポート番号はSSHデフォルトの 22 ではなく **10022**

あたりでしょうか。 まずはマニュアル通りに、
1. Xserverのサーバーパネルのメニューから、［アカウント］＞［SSH設定］と進み、［ONにする］を選択、［設定する］ボタンをクリック
2. ［公開鍵認証用鍵ペアの生成］タグから、適当なパスフレーズを入力（ログイン時も使用するので忘れないように）して、［確認画面へ進む］＞［生成する］ボタンをクリック

これでサーバ側には新たに生成された公開鍵が保存されるとともに、秘密鍵のダウンロードが始まります。（ファイル名: [サーバーID].key）

ダウンロードされた秘密鍵ファイルを確認しますと、RSAアルゴリズムにより生成されたものでした。
```test: [サーバーID].key
-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,440AF4411516...

QB3BzgNhQ3TfHUVD75pv2iMf2lYu+q96cGKKj/Nxep92lcHgZnTzt3pdOq+UrlZc
VvnaCitHmWAzijizEIODzxi//KQsPcM2t14tBR4IvbEeomlLsihl2PIk2Ofoc1fY
        :
Lnz32p+i6kmBPLzffZwBS6bUVbzru9fsvLYPYp5VnhulbAqHHX/LsgaT/5x+I/WH
-----END RSA PRIVATE KEY-----
```
ヘッダ行が `"-----BEGIN OPENSSH PRIVATE KEY-----"` ではなく `"-----BEGIN RSA PRIVATE KEY-----"` で始まっているので、OpenSSH 7.8より前の古い形式のフォーマットと思われます。

ダウンロードした秘密鍵ファイルは、お約束で `~/.ssh/` に移動し、パーミッションを（自分以外アクセス不可に）変えておきます。
```console
$ mv ~/Download/{サーバーID}.key ~/.ssh/
$ chmod 600 ~/.ssh/{サーバーID}.key
```
さっそくサーバに`ssh`ログインしてみます。 ログイン時に必要なのはユーザ名、ホスト名、そして秘密鍵に設定したパスフレーズです。
Xserverローカルルールでは[サーバーID]（[サーバー番号]とは異なる）が、実のところログインユーザ名になっています。
また、自分のサーバのホスト名はサーバーパネルの［サーバー情報］から確認できます。（Xserverでは、ホスト名 = [サーバー番号].xserver.jp となっている模様）
```console
$ ssh -p 10022 -i ~/.ssh/{サーバーID}.key {サーバーID}@{サーバー番号}.xserver.jp
The authenticity of host '[サーバー番号].xserver.jp:10022 ([IPアドレス]:10022)' can't be established.
ED25519 key fingerprint is SHA256:SIbxkY1g......Q+cSixBu.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[サーバー番号].xserver.jp:10022' (ED25519) to the list of known hosts.
Enter passphrase for key '[サーバーID].key': ********
[サーバーID@サーバー番号 ~]$
```
最初のログインなのでまだ`known_hosts`に登録されておらず、確認を求められますが `"yes"` を入力し、秘密鍵を作成した際のパスフレーズを入力すれば完了です。
無事ログインできましたので、せっかくですからサーバ側の`ssh`バージョンを確認しておきます。
```console
[サーバーID@サーバー番号 ~]$ which ssh
/usr/bin/ssh
[サーバーID@サーバー番号 ~]$ /usr/bin/ssh -V
OpenSSH_7.4p1, OpenSSL 1.0.2k-fips  26 Jan 2017
```
**7.4**、でした…

## SSHで使う公開鍵暗号は何がベストか
とりまSSHログインはできたものの、サーバ側のOpenSSHのバージョンはかなり古い上、生成された鍵もRSAという古（いにしえ）のアルゴリズムで生成されてました。
それってセキュリティ的にどうなんでしょう… 私、気になります！
### ChatGPTさんに（日本語で）訊いてみた (4.0o)
SSHの公開鍵暗号アルゴリズムは何が良いの？
> SSHの公開鍵暗号アルゴリズムにはいくつかの種類があり、それぞれセキュリティとパフォーマンスのバランスが異なります。現在広く使用されているアルゴリズムを、セキュリティとパフォーマンスの観点からおすすめ順に挙げてみます。
>
> 1. **Ed25519**
>    - **セキュリティ**: 非常に高い
>    - **パフォーマンス**: 非常に高い（鍵の生成や署名、検証が高速）
>    - **特徴**: 曲線25519を基にした楕円曲線暗号で、従来のRSAやDSAと比べて小さな鍵サイズで同等のセキュリティを提供します。現代的なアルゴリズムで、多くの用途で推奨されます。
>
> 2. **ECDSA (Elliptic Curve Digital Signature Algorithm)**
>    - **セキュリティ**: 高い（使用する曲線による）
>    - **パフォーマンス**: 高い（Ed25519よりは若干遅いがRSAより高速）
>    - **特徴**: NISTが標準化した楕円曲線暗号で、一般的にsecp256r1（P-256）などの曲線が使われます。鍵サイズが小さく、従来のアルゴリズムに比べて効率的です。
>
> 3. **RSA (Rivest-Shamir-Adleman)**
>    - **セキュリティ**: 高い（鍵サイズによる）
>    - **パフォーマンス**: 中程度（鍵サイズが大きくなると遅くなる）
>    - **特徴**: 最も広く使用されている公開鍵暗号の一つで、セキュリティは鍵サイズ（一般に2048ビット以上が推奨）に依存します。鍵生成や署名・検証の計算が重いことが欠点です。
>
> 4. **DSA (Digital Signature Algorithm)**
>    - **セキュリティ**: 中程度（現在は非推奨）
>    - **パフォーマンス**: 高い（特に署名の生成が速い）
>    - **特徴**: 古い標準で、現在は2048ビットの鍵が最低限推奨されていますが、他のアルゴリズムに比べてセキュリティが劣るため、現代ではほとんど使用されていません。
>
> ### 総評
>
> - **Ed25519**が現代的な用途に最も適しており、セキュリティとパフォーマンスのバランスが非常に良いです。
> - **ECDSA**も依然として良い選択肢であり、特に既存のシステムとの互換性が必要な場合に使われます。
> - **RSA**は依然として広く使われていますが、パフォーマンス面で劣るため、新規システムではEd25519やECDSAに置き換えることが推奨されます。
> - **DSA**はセキュリティ面で他のアルゴリズムに劣るため、使用は推奨されません。
>
> これらのアルゴリズムは、OpenSSHなどのSSH実装においてサポートされているため、具体的な環境や要件に応じて適切なものを選ぶと良いでしょう。

### Googleさんに訊いてみた
**検索文字列:** best ssh algorithm

https://goteleport.com/blog/comparing-ssh-keys/

https://www.brandonchecketts.com/archives/its-2023-you-should-be-using-an-ed25519-ssh-key-and-other-current-best-practices

検索結果上位２つの記事の結論はどちらも「（特に制限がなければ）`Ed25519`を使っとけ」ということでした。内容も含めChatGPTさんの見解と一致しています。

## Xserverの公開鍵暗号アルゴリズムを`Ed25519`に変更する
`Ed25519`はOpenSSH 6.5以降でサポートされています。
バージョン 6.5といえば10年も前にリリースされた年代モノ。 2024年の今、よほどカビの生えた残念な環境でなければ`Ed25519`は問題なく使えるでしょう。（Xserver環境もOpenSSH 7.4なのでセーフ）

という訳で先に作成したRSA暗号鍵は破棄し、ローカル環境で`ssh-keygen`コマンドを使って`Ed25519`を使った鍵ペアを新たに作成します。
```console
$ ssh-keygen -t ed25519 -f ~/.ssh/{鍵ファイル名} -C "{コメント}"
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): ********
Enter same passphrase again: ********
Your identification has been saved in ~/.ssh/[鍵ファイル名]
Your public key has been saved in ~/.ssh/[鍵ファイル名].pub
The key fingerprint is:
SHA256:O/IoKNTFHv4Ga7HkqSYW/idb2NlmB/TUpXZgeWGhtSSfo [コメント]
The key's randomart image is:
+--[ED25519 256]--+
| ...      oo. .  |
|  . .    ..+ +   |
| . . .   .. * .  |
|o+. o     .o + . |
|+oo+... S  E+ .  |
|.o+..+.. . o     |
|oo *..o.o =      |
|+ = +  ++o .     |
| o.o  .o..       |
+----[SHA256]-----+
```
コメントは省略可。 パスフレーズも無しにできますが、セキュリティ的には設定しておくほうが良いでしょう。

秘密鍵と公開鍵ができましたので、公開鍵のほうをXserverのサーバーパネルから登録します。
［アカウント］＞［SSH設定］＞［公開鍵登録・更新］タブの公開鍵入力フィールドに、新たに生成した公開鍵（拡張子`.pub`）の中身をコピペします。
![action_user_ssh_publickey.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3798847/0d17ded8-5943-fc88-d72d-9f0a036e26dc.png)
`"ssh-ed25519 ..."`から始まる`Ed25519`の公開鍵はわずか一行。 先に作成したRSA公開鍵と比べればびっくりするくらい短いですが、良いんです。 それで合っています。
公開鍵を貼り付けたら、［確認画面へ進む］＞［登録する］をクリックして、公開鍵の登録は完了です。

公開鍵が登録できたので、新しい`Ed25519`の秘密鍵を使ってログインしてみます。（指定する鍵ファイル名が新しいものに変わる以外、オプションはRSAの時と一緒です）
```console
$ ssh -p 10022 -i ~/.ssh/{鍵ファイル名} {サーバーID}@{サーバー番号}.xserver.jp
Enter passphrase for key '[鍵ファイル名]': ********
Last login: Sat May 25 20:10:34 2024 from [アクセス元]
[サーバーID@サーバー番号 ~]$
```
無事`Ed25519`の公開鍵認証でログインできました！
先にサーバーパネルから生成したRSA公開鍵は上書きされて消えていますので、古いRSA秘密鍵も不要です。 混乱しないよう消しておくのが良いでしょう。

## 参考サイト
- [SSH設定 | レンタルサーバーならエックスサーバー](https://www.xserver.ne.jp/manual/man_server_ssh.php)