【メモ】オレオレ式サーバーSSH接続設定手順書

# はじめに
この記事はLANで接続するPCやVPSやIaaSのサーバなど契約したてほやほやのサーバくんを手軽にSSHできるマシンにするまでの手順を主に私の知人に共有するためにメモ書き程度に書き残しておきます．

# 接続手順書
## SSH環境の導入
外部契約しているサーバーなどは既にSSHできる環境から操作するためこの手順はいらないです．接続先のPC上でこの手順を行ってください．

```bash:接続先
$ sudo apt update
$ sudo apt install openssh-server
$ sudo systemctl status sshd
# ここでsshのサービスがちゃんと動いているか確認
```
接続元のPCでSSHが行えるかテストしてみましょう．

```bash:接続元
$ ssh user@127.0.0.1 # <ユーザー名>@<サーバのIPまたはドメイン>
```
初回接続時はIPを信用するか確認されるので`yes`と打って続けてください(yなどで省略はできないのでちゃんと打ちましょう)．
パスワードを入力し，接続先のターミナルが返ってきたらSSH成功です．

## 公開鍵・秘密鍵の作成
接続元のPC上で鍵を生成します．方式は最近流行りでモダンでかっこよくて最強でイケメンで短くて速い`ed25519`を採用します．ちなみにここで使用する`ssh-keygen`コマンドはPowerShellでも使用できます．やるやん．

```bash:接続元
$ mkdir -p $HOME/.ssh
$ cd $HOME/.ssh
$ ssh-keygen -t ed25519 
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/hato_yashiki/.ssh/id_ed25519): <鍵の名前を入力>
Enter passphrase (empty for no passphrase): <鍵をしようするパスフレーズ．必要なければそのままEnter>
Enter same passphrase again: <上と同じ値を入力>

Your identification has been saved in test
Your public key has been saved in test.pub
The key fingerprint is:
SHA256:NmNCdYYF/d0pFgRm3e/P4AsHq8PSpokrDKbtHLwwuHg hato_yashiki@TATSUTAAGE
The key's randomart image is:
+--[ED25519 256]--+
|                 |
|                 |
|    ここに        |
|                 |
|                 |
|      なんかでる  |
|                 |
|                 |
|                 |
+----[SHA256]-----+
```
これでSSHに使用する公開鍵と秘密鍵が完成しました．

## 設定ファイルの作成
まだまだ接続元のPCで作業します．鍵を作成した`~/.ssh`内に`config`(拡張子とかはない)というファイルを作成します．今後何度かvimコマンドが登場しますが，エディタは好みのものを使ってください．vimでも．VSCodeでも．メモ帳でも．nanoでも．

```bash:接続元
$ vim config
```
```ssh:vim
# configの編集
Host tsukune                       # サーバーを指す好きな名前(自由)
    HostName 127.0.0.1             # サーバのIPアドレスかドメイン
    User user                      # 接続先のユーザー名
    Port 22
    IdentityFile ~/.ssh/id_ed25519 # 先程設定した鍵の名前
```
## 接続先側での公開鍵の設定
接続先のPCの設定に移ります．接続元で作った公開鍵`<設定した鍵名>.pub`をcatで表示してコピーしたりして上手いこと持ってきてください．後で使います．

```bash:接続先
$ mkdir -p $HOME/.ssh
$ vim $HOME/.ssh/authorized_keys
```
```bash:vim
# authorized_keysの編集
# ここにコピーしてきた<設定した鍵名>.pubの中身を貼り付ける
```
```bash:接続先
$ cat $HOME/.ssh/authorized_keys
# ここで先程コピーしたものと同じものが表示されていればOK
```
## 接続テスト
これで公開鍵と秘密鍵のペアでのSSH接続ができるので一度試してみます．

```bash:接続元
$ ssh tsukune # configで設定した名前
```
初回接続時はIPを信用するか確認されるので`yes`と打って続けてください(yなどで省略はできないのでちゃんと打ちましょう)．
パスワードの入力を要求されず，接続先のターミナルが返ってきたらSSH成功です．

## SSHサーバーの設定の強化
SSHが成功して嬉しい所申し訳ないのですが，22番ポートでのSSHは非常に危険なのです．22番ポートでSSH通信するのがメジャーすぎてパスワード総当りなどでログインを破られてしまう可能性があるのです．そのためにも早急に
* ポートを22から変更する
* パスワードでのログインを禁止する

必要があるわけです．サクッと行っちゃいましょう．

### ポート開放の設定
サーバ側でポート開放を設定する際に`iptables`を使用してもよいのですが，初心者にはとっつきにくいと思うので，今回は`iptables`のラッパーコマンドである`ufw`を使用していきたいと思います．

```bash:接続先
$ sudo apt update
$ sudo apt install ufw
```
ここで予めSSHで使用するポート番号を開けておきます．このタイミングでなくても(もう少し後でも)良いかもしれませんが一応この手順で触れなくなることはないと思います…多分…

```bash:接続先
$ sudo ufw allow 10022 # SSHで使用するポート番号
```
### sshd_configの編集
ここでポートの変更とパスワードログインの禁止を行います．最低限の強化のみ今回行いますので，もっと堅牢にしたい！という方は`sshd_config`の良い設定方法をいい感じに調べていい感じに取り入れてみてください．
変更箇所はCtrl+Fであったり，vimの`/`コマンドであったりでいい感じに探してください．

```bash:接続先
$ vim /etc/ssh/sshd_config
```

```bash:vim
# sshd_configの編集

Port 10022 # コメントアウトしてあれば外し，22から自分が使用するポート番号に変更

PasswordAuthentication no # コメントアウトしてあれば外し，noでなければnoに変更
```
### sshdの再起動
configを読むためサービスを再起動します．

```bash:接続先
$ sudo systemctl restart sshd
$ sudo systemctl status sshd
```

### 接続元の設定変更
これで接続先の設定は終わったのですが，ポート番号の変更は接続先だけの問題ではありません．`~/.ssh/config`も変更しておきましょう．好みのエディタで開き，`Port`のパラメータを先程自分で設定したポート番号に変更しておきましょう．この`config`ファイルは再読み込みの必要は無いのでこれで終わりです．

### 接続テスト
```bash:接続元
$ ssh tsukune
```
これでパスワードを入力することなくログインできれば成功．環境の完成です．お疲れさまでした．

## さいごに
ちなみに，接続元の`~/.ssh/config`に正しく設定を記述すると，接続元のVSCodeで`Remote - SSH`の拡張機能で接続できます．これで外で普通にVSCode開くだけで，SSH設定を行った外部PCのスペックでVSCodeで作業できちゃいます．なんて嬉しいのだろう．(Windowsの方はWSLではなくPowerShell側に設定を作成してください．)
途中でも述べていたとおり，安全強化は最低限のものだけ設定したので今回行った設定を元にじゃんじゃんカスタマイズして使いやすいサーバーにしてみましょう．