SSHの公開鍵認証設定をする

# はじめに
[前回](https://qiita.com/jinnai73/items/f41fa6df6998d47d1f33)の続きです。サーバにログインするための一般的な方法であるSSHについて、公開鍵認証の設定方法を勉強します。なお、作業は前回の続きからです。

#環境
・CentOS7サーバ2台
・sshdインストール済
・ユーザ名jinnai73、秘密鍵でログインできる設定をする

#鍵ペアの作成
公開鍵認証ではサーバに公開鍵を置き、手元の秘密鍵でアクセスすることで鍵ペアの照合が行われてアクセスができるようになります。まずはログインに必要となる鍵ペアを作成します。作成には`ssh-keygen -t rsa`コマンドを使います。

```text:接続元サーバ
[root@sv10-centos74 ~]# ssh-keygen -t rsa
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:FzsSD47ujmNU6C9bkeatpCVxgz3aAXh1rlE3fWjRIHU root@sv10-centos74
The key's randomart image is:
+---[RSA 2048]----+
|      . o +o+=E  |
|   . . + . o+.o  |
|  . o.. + .. .   |
|   ..+.* + o     |
|   .o.% S =      |
|    oO * o .     |
|   .o.B .        |
|    +O..         |
|   .+=+          |
+----[SHA256]-----+
[root@sv10-centos74 ~]# 
```

.ssh/配下にid_rsa、id_rsa.pubという2つのファイルが作られました。前者が秘密鍵、後者が公開鍵になります。

#接続先サーバへの公開鍵設置
先ほど作成した公開鍵を、接続先サーバで利用したいアカウントの.ssh/配下に設置します。今回はscpでさくっとおいてしまいますが、通常は接続先サーバの管理者に何らかの方法で公開鍵を渡して配置してもらうことになるでしょう。

```text:公開鍵の転送
[root@sv10-centos74 ~]# scp .ssh/id_rsa.pub jinnai73@10.33.0.130:
jinnai73@10.33.0.130's password: 
id_rsa.pub                                                                                                                                      100%  400   319.3KB/s   00:00    
```

接続先サーバでファイルを移動します。この際に、ファイル名を"authorized_keys"に変更しておきます。理由は後ほど。

```text:接続先サーバでファイル移動
[jinnai73@sv11-centos74 ~]$ ls
id_rsa.pub
[jinnai73@sv11-centos74 ~]$ mkdir .ssh
[jinnai73@sv11-centos74 ~]$ mv id_rsa.pub .ssh/authorized_keys
[jinnai73@sv11-centos74 ~]$ ls .ssh/
authorized_keys
```

#公開鍵認証によるSSH接続の許可
パスワード認証の時と同じく、sshdの設定を確認します。公開鍵認証はデフォルトで有効になっているので、その確認だけです。

```text:接続先サーバ
[root@sv11-centos74 ~]# grep Pubkey /etc/ssh/sshd_config
#PubkeyAuthentication yes
[root@sv11-centos74 ~]# grep KeysFile /etc/ssh/sshd_config
AuthorizedKeysFile      .ssh/authorized_keys
```

2つ目の`AuthorizedKeysFile`で指定されているファイルが公開鍵として使用されます。

#読み取り権限の変更
この状態でログインを試しても、実はうまくいきません。

```text:接続元サーバからSSHログイン
[root@sv10-centos74 ~]# ssh jinnai73@10.33.0.130
jinnai73@10.33.0.130's password: 
```

本来ならSSH秘密鍵を復号するパスフレーズが聞かれるところですが、パスワードが聞かれてしまいます。ここで少し詰まりましたが、sshdのログファイルを確認することで理由がわかりました。

```text:sshdログ確認
[root@sv11-centos74 ~]# tail /var/log/secure
Jul  9 00:35:36 sv11-centos74 sshd[44021]: Authentication refused: bad ownership or modes for directory /home/jinnai73/.ssh
Jul  9 00:35:39 sv11-centos74 sshd[44021]: Connection closed by 10.33.0.6 port 43076 [preauth]
```

/home/jinnai73/.sshの権限が適切でないとのログが出ています。ここは権限を700にするのが正解です。

```text:権限の変更
[root@sv11-centos74 ~]# ls /home/jinnai73/ -la
drwxrwxr-x  2 jinnai73 jinnai73  29  7月  8 23:52 .ssh
[root@sv11-centos74 ~]# chmod 700 /home/jinnai73/.ssh/
[root@sv11-centos74 ~]# ls /home/jinnai73/ -la
drwx------  2 jinnai73 jinnai73  29  7月  8 23:52 .ssh
```

```text:ログイン
[root@sv10-centos74 ~]# ssh jinnai73@10.33.0.130
Enter passphrase for key '/root/.ssh/id_rsa': 
[jinnai73@sv11-centos74 ~]$ 
```

できました！

#まとめ
公開鍵認証によるsshアクセスをするためには、以下が必要です。
・アクセス先にユーザ名が設定されていること
・アクセス先のsshdでPubkeyAuthenticationがnoになっていないこと
・公開鍵がsshd_configで指定されたパスに置いてあること
・公開鍵を配置するディレクトリの権限が700になっていること