SSHの認証方式を、公開鍵認証方式にする。

SSHの認証方式はいくつかある。

- パスワード認証
- 公開鍵認証
- ワンタイムパスワード認証

ワンタイムパスワード認証できるの初めて知った...


で、


「ssh接続の認証方式、公開鍵認証方式に変えといて〜」って言われたので、備忘録。

ざっくり言うとこんな感じ。

- `ssh-keygen`で公開鍵と秘密鍵を生成
- 生成した公開鍵は、SSHサーバ側に登録
- 生成した秘密鍵は、SSHクライアント側に移動
- パスワード認証もさせないように、ついでに変更しておく(残ってたら無意味なので)

# SSHサーバ側：公開鍵と秘密鍵の生成〜公開鍵の設定

まず、
`ssh-keygen`コマンドで公開鍵と秘密鍵の生成をする。
コマンドを打つと以下を聞かれるので、答えていく。

- ファイル名：`Enter file in which to save the key (/root/.ssh/id_rsa):`
	- デフォルトだと「id_rsa」
	- 複数サーバで鍵生成してると被ってくるおそれがあるので、適切な名称に変えて置く事が望ましい
- パスフレーズ：`Enter passphrase (empty for no passphrase):`
	- デフォルトだと「(未設定)」
	- 利用者認証のための合言葉みたいなもので、パスワード認証のパスワードとは異なる。
	- 未設定のままでも使えるが、設定しておいた方がセキュリティレベルは上がる

次に、
公開鍵を保存しておくファイルである`authorized_keys`に公開鍵を追記する。

最後に、
パーミッションの確認および変更をして終わり。

```sh:sh
# 公開鍵と秘密鍵の生成
$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # ファイル名
Enter passphrase (empty for no passphrase): # パスフレーズ
Enter same passphrase again: # パスフレーズ(確認)
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:d/gQiLpY1DivqxMElaeGeh9LkNLU8qof6l4d019qE3k root@xxx.xxx.xxx.xxx.ZZZ
The key s randomart image is:
+---[RSA 2048]----+
| ..o             |
|. + oo . .       |
| = *+ o . .      |
|o B..+.   .o     |
|.+ ooo..So+E.    |
|. +o+oo ..=+     |
| oo=o+   =  .    |
|..o.o.  . .      |
|++oo.            |
+----[SHA256]-----+


# ファイル名を指定しなかったら`~/.ssh/`に生成される
# 指定してたら、カレントディレクトリに生成される
# 以下は、指定しなかった場合の例
$ ll ~/.ssh/
合計 8
-rw------- 1 root root    0  4月  9 09:48 authorized_keys
-rw------- 1 root root 1675  5月 15 15:20 id_rsa
-rw-r--r-- 1 root root  411  5月 15 15:20 id_rsa.pub


# `authorized_keys`に、公開鍵の中身を追記する
# 追記したら用無しなので削除する
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
$ rm ~/.ssh/id_rsa.pub


# パーミッション設定
# - `ll`コマンドなどで確認して問題なければ変更しなくてよいが、以下となっている必要がある
$ chmod 600 ~/.ssh/authorized_keys
$ chmod 700 ~/.ssh
```

#SSHクライアント側：秘密鍵の取得〜公開鍵認証での接続確認
まず、
SSHサーバから秘密鍵をもらってくる。

あとは、
`ssh`コマンドを打つ時に、`-i`オプションで秘密鍵を指定する。

```sh:sh
# scpコマンドなり何なりで、SSHサーバ上の秘密鍵を取得する
# 配置先は正直どこでもいいが、`~/.ssh/`が望ましい
$ scp root@xxx.xxx.xxx.xxx:/root/.ssh/id_rsa ~/.ssh/


# 公開鍵認証でログインできる事の確認
# - パスフレーズを設定してなければそのまま接続できるし、設定してれば入力してねって聞かれる
$ ssh -i ~/.ssh/id_rsa root@xxx.xxx.xxx.xxx
Enter passphrase for key '~/.ssh/id_rsa': 
```

ちなみに、
この時点だとまだパスワード認証できてしまう。

```sh:sh
$ ssh root@xxx.xxx.xxx.xxx
root@xxx.xxx.xxx.xxx's password:   # <=これがその証拠
```

# SSHサーバ側：パスワード認証の禁止
さっき言った通り、今の時点だとパスワード認証が出来てしまう。
そのため、**設定ファイルを書き換えて**から、**デーモンを再起動**する。

ちなみに、
SSHクライアント側の設定より前にやってしまうと、**scpコマンドでパスワード認証できなくなる**。
そのため、最低でも、秘密鍵を取得してから、これからの設定を行う。

```sh:sh
# 設定ファイルを開く
$ vim /etc/ssh/sshd_config
```

```text:/etc/ssh/sshd_config
# PasswordAuthenticationをnoに変更
PasswordAuthentication no

# PubkeyAuthenticationをyesに変更
PubkeyAuthentication yes
```

```sh:sh
# sshデーモンを再起動
$ service sshd restart
```

# SSHクライアント側：パスワード認証での接続不可確認
最後に、
クライアント側からパスワード認証で接続できない事を確認すればOK。

```sh:sh
# これでパスワード認証できなくなった
$ ssh root@xxx.xxx.xxx.xxx
root@xxx.xxx.xxx.xxx: Permission denied (publickey,gssapi-keyex,gssapi-with-mic).  # <=これがその証拠
```


# 参考
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/430dnypsswdacces.html
https://qiita.com/nnahito/items/dbe6fbfe347cd66ae7e6