パスワード認証からSSH公開鍵認証に変更する (Mac編)


リモートサーバー運用時のセキュリティ強化のため、パスワード認証からSSH公開鍵認証に変更を行なった際の備忘録です。


公開鍵認証とパスワード認証の違い、公開鍵認証のメリットについてはこちらをご覧ください。

https://qiita.com/angel_p_57/items/2e3f3f8661de32a0d432

Windows編はこちら

https://qiita.com/mikun/items/230fe2f84777eb90853d


## 環境

クライアントPC: MacOS Monterey(v12.2) 
リモートサーバー: Contabo VPS Ubuntu 20.04

## 手順 
1. クライアントPCでキーペアを作成する
2. 公開鍵をリモートサーバーに転送して登録
3. 公開鍵認証でリモートサーバーにログイン出来る事を確認
4. リモートサーバーに接続する際のパスワード認証を無効にする


## 1. クライアントPCでキーペアを作成する

キーペアの作成には、RSAよりも強固でパフォーマンスが良いとされる [ED25519](https://dnsops.jp/event/20180627/20180627-ed25519.pdf) を使用します。

##
**ED25519** は **Symbolブロックチェーン** のキーペア生成にも使われています。

https://docs.symbol.dev/ja/concepts/cryptography.html

```
ssh-keygen -t ed25519
```

/Users/[user名]/.ssh ディレクトリに以下の名前で、秘密鍵と公開鍵が作られます。

秘密鍵：id_ed25519
公開鍵：id_ed25519.pub

パスフレーズが未入力の場合は、鍵を使って接続する際にパスフレーズの入力が省略されます。


鍵の名称を変えたい場合はパスから指定します。 -f /Users/[user名]/.ssh/[鍵の名前]

「id_ed25519_test」 という名前で鍵を作成する場合

```
ssh-keygen -t ed25519 -f /Users/[user名]/.ssh/id_ed25519_test
```



```
[user名]@MacBook-Pro ~ % ssh-keygen -t ed25519 -f /Users/[user名]/.ssh/id_ed25519_test
Generating public/private ed25519 key pair.
Enter passphrase (empty for no passphrase): [パスフレーズを入力]
Enter same passphrase again: [パスフレーズを入力]
Your identification has been saved in /Users/[user名]/.ssh/id_ed25519_test
Your public key has been saved in /Users/[user名]/.ssh/id_ed25519_test.pub
The key fingerprint is:
SHA256:ojx6yvRi+□□□□□□□□□□□□□□□□jsEAWIMfUEwY [user名]@MacBook-Pro.local
The key's randomart image is:
+--[ED25519 256]--+
|**E+*+.          |
|oo.+++.          |
|  .. o.          |
| .o .            |
|=+.   . S        |
|O.o. . .         |
|*=..+            |
|*+*+..           |
|*OB=.            |
+----[SHA256]-----+
```

## 2. 公開鍵をリモートサーバーに転送して登録
ssh-copy-id を使うと登録まで自動で行なってくれます。

```
ssh-copy-id -p [ポート番号] -i ~/.ssh/id_ed25519_test.pub [User名]@[ホスト名]
```


```
[User名]@MacBook-Pro ~ % ssh-copy-id -p [ポート番号] -i ~/.ssh/id_ed25519_test.pub [User名]@[ホスト名]
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/[User名]/.ssh/id_ed25519_test.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[User名]@[ホスト名]'s password: パスワード

Number of key(s) added:        1

Now try logging into the machine, with:   "ssh -p '[ポート番号]' '[User名]@[ホスト名]'"
and check to make sure that only the key(s) you wanted were added.
```

これで公開鍵がリモートサーバー側に登録されました。

## 3. 公開鍵認証でリモートサーバーにログイン出来る事を確認
```
ssh -p [ポート番号] -i ~/.ssh/id_ed25519_test [User名]@[ホスト名]
```

-i の後ろは、秘密鍵のパスを指定

## 4. リモートサーバーに接続する際のパスワード認証を無効にする

公開鍵認証でリモートサーバーに接続できることが確認できたら、パスワード認証を無効にすることで鍵が無いとログインできないようにする。

設定はリモートサーバーで行うので、SSH接続してから以下の操作を行う。

```
sudo vi /etc/ssh/sshd_config
```
i で入力モード
先頭の # を削除し
PasswordAuthentication を yes → no にする。

```
PasswordAuthentication no
```

![スクリーンショット 2022-04-07 23.18.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/408917/4fae593c-28da-14b1-6c5a-c1343a2881ae.png)
[ESC]
:wq で保存

リモートサーバーのSSHサービスを再起動して変更を反映する
```
sudo systemctl restart ssh
```

パスワード認証でログインを試してみる
```
[User名]@MacBook-Pro ~ % ssh -p [ポート名] [User名]@[ホスト名]
[User名]@[ホスト名]: Permission denied (publickey).
```
ログインが拒否されればOKです。

## 参考記事
https://qiita.com/kazokmr/items/754169cfa996b24fcbf5