今さら人に聞けないSSHのセキュリティ対策

# SSHのセキュリティ対策
SSH(Secure SHell)は、ネットワーク経由でコンピュータを操作するためのもっとも基本的な接続方法です。
大変便利である一方で、不正ログインなどセキュリティ上の大きなリスクともなりえます。そこでSSHにはセキュリティを高めるための仕組みが備えられています。
そのなかで代表的なものが「SSH公開鍵認証」と「SSHポート番号変更」です。

# SSH公開鍵認証とは
SSH公開鍵認証とはSSH接続のユーザー認証に公開鍵認証を用いることで不正ログインを防ぐ手法です。
## キーペアの生成
まずは公開鍵認証のために必要なキーペアを生成します。キーペアの生成にはssh-keygenコマンドを使用します。暗号化アルゴリズムは様々なものから選べますが、現在の主流はED25519です。
ssh-keygenコマンドの主なオプションは以下のようになります。
```shell-session
$ ssh-keygen -t <鍵タイプ> -C <コメント> -f <鍵ファイル名>
```
例）
```shell-session
$ ssh-keygen -t ed25519 -C "My Private Key" -f my_private_key
```
このコマンドを実行するとカレントディレクトリに、my_private_keyとmy_private_key.pubというキーペアが生成されます。my_private_keyが秘密鍵でmy_private_key.pubが公開鍵です。ちなみに-Cオプションで指定したコメントはmy_private_key.pubファイルの末尾に付与されます。
## 鍵ファイルの設置
まず、秘密鍵をホームディレクトリ配下の.sshディレクトリに移動します。
```shell-session
$ mv my_private_key ~/.ssh
```
つぎに、公開鍵をサーバーに登録します。公開鍵の登録には、ssh-copy-idコマンドを使います。
```shell-session
$ ssh-copy-id -i <鍵ファイル名> <ユーザー名>@<サーバーのホスト名>
```
例）
```shell-session
$ ssh-copy-id -i my_private_key user@host
```
これで、鍵ファイルの設置は完了となります。
## 公開鍵認証を使ったログイン
公開鍵認証を使ってログインするときは、sshコマンドに-iオプションで鍵ファイルを指定します。
例）
```shell-session
$ ssh -i ~/.ssh/my_private_key user@host
```
## パスワード認証を無効化する
公開鍵認証でログインできるようになったので、パスワード認証は無効化します。サーバーにログインして、サーバー側のSSHdの設定を変更します。
```shell:/etc/ssh/sshd_config
#PasswordAuthentication yes
PasswordAuthentication no
```
変更を反映するためSSHdを再起動します。
```shell-session
$ sudo systemctl restart sshd
```
これで鍵ファイルなしにはログインできなくなりました。

:::note alert
鍵ファイルは「絶対に」なくさないように気をつけてください！！
なくしてしまうとリモートログインが不可能になり、ローカルログインして設定を解除しなければならなくなります。
:::
# SSHポート番号の変更
SSHは標準で22番ポートを使うことが決まっています。そのため、標準の状態のまま使用すると22番ポートを決め打ちにしたブルートフォースアタックがリスクとなります。そこで、SSHで利用するポートを独自のものに変更します。
## ファイアウォールのポート開放
まず、ファイアウォールを設定してSSHで新たに使用したいポートをあらかじめ解放しておきます。
ここでは5432番ポートを解放します。Firewalldの場合、次のようにします。
```shell-session
$ sudo firewall-cmd --zone=public --add-port=5432 --permanent
$ sudo firewall-cmd --reload
```
## SSHdの設定変更
つぎに、サーバーにログインしてSSHdの設定を変更します。
```shell:/etc/ssh/sshd_config
#Port 22
Port 5432
```
ここでは、さきにポート開放したのと同じ5432番ポートを、SSHで用いるように設定を変更しています。
設定を反映するためにSSHdを再起動します。
```shell-session
$ sudo systemctl restart sshd
```
これで、5432番ポートを使ってSSH通信を行うようになりました。
## ログイン
ポート番号を指定してSSH接続するにはsshコマンドに-pオプションを使います。
```shell-session
$ ssh -p 5432 user@host
```
SSH公開鍵認証をすでに設定している場合は、-iオプションで鍵認証も付け加えてください。（下記「合わせ技」を参照）
## 22番ポートの閉鎖
最後に、使用しなくなった22番ポートをファイアウォールで閉鎖します。
```shell-session
$ sudo firewall-cmd --zone=public --remove-service=ssh --permanent
$ sudo firewall-cmd --reload
```
:::note info
ここで--remove-service=sshとなっていますが、実際にしていることは22番ポートを閉じているだけですので安心してください。
:::

# 合わせ技
SSH公開鍵認証とSSHポート番号変更は併用することができます。
例）
```shell-session
$ ssh -i ~/.ssh/my_private_key -p 5432 user@host
```
これによりSSH接続がぐっと安全なものになります。

# configファイルの活用
ここまで読んで、「いちいち-iオプションと-pオプション指定するの面倒くさい」と思った方も多いと思います。そこで登場するのがconfigファイルです。ホームディレクトリ配下の.sshディレクトリ内にconfigというファイルを用意します。
configファイルの書式は以下のとおりです。
```shell:~/.ssh/config
Host <登録名>
  User <ユーザー名>
  HostName <ホスト名>
  IdentityFile <鍵ファイル名>
  Port <ポート番号>
```
例）
```shell:~/.ssh/config
Host myhost
  User user
  HostName host
  IdentityFile ~/.ssh/my_private_key
  Port 5432
```
このようなファイルを用意しておくと、SSH接続するとき
```shell-session
$ ssh myhost
```
と入力するだけでサーバーと接続できるようになり非常に操作が楽になります。

# まとめ
今回は、SSHを安全に使うための設定として、「SSH公開鍵認証」と「SSHポート番号変更」の2つを紹介しました。この2つを組み合わせることにより、SSH接続の安全性は大きく向上します。サーバーを不正ログインから守るため、この記事が少しでもお役に立てば幸いです。
それでは、よいSSHライフを。