SSH公開鍵認証で接続するまで

# 目的

1. クライアントで作成したキーペアでSSH接続する
2. パスワード認証方式を無効にする

構築した仮想環境に公開鍵認証でSSH接続するケースが多くなってきたので、まとめておく。
SSHの基礎は[ココ][link1]を参照すると良い。

# 1. クライアントで、キーペアを作成してSSHでリモートに接続するまで

鍵を作成して、リモートへ接続するまでの簡単な手順。鍵はデフォルトの `~/.ssh/id_rsa`を作成して使った場合。

```
# クライアントPCで鍵を作る
ssh-keygen -t rsa -b 4096

# リモートへ公開鍵を転送する
ssh-copy-id -i ~/.ssh/id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]

# リモートにSSHで接続する
ssh -i id_rsa [リモートユーザー]@[リモートサーバーのホスト名]
```

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

```
ssh-keygen -t rsa -b 4096 {-f <鍵の名前>}
```

2020.06.05 補足
以前は `ssh-rsa` としてましたが、[こちらのブログの内容][link5]で、 `ssh-rsa` が将来的に非推奨となるとの話もあるので、これらも参考にした上で、最適だと考える鍵形式や鍵長で作成すると良い。
上記では、鍵形式はRSA、鍵長を4096bitにした場合。

#### 鍵の名称と保存先

-f は鍵の名称を変えたい場合にパスから指定する。 `-f /home/[user名]/.ssh/[鍵の名前]`
指定しない場合は、 /home/[user名]/.ssh ディレクトリに以下の名前で、秘密鍵と公開鍵が作られる。
秘密鍵：id_rsa
公開鍵：id_rsa.pub

#### パスフレーズ

未入力だと"無し"となり、鍵を使って接続する際にパスフレーズの入力が省略される。

#### GitHubで使うSSH鍵は Ed25519がおすすめ

Ed25519の方がRSAよりパフォーマンスが良く、[公式サイト](https://docs.github.com/ja/github/authenticating-to-github/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent)のサンプルコマンドもEd25519で鍵を作成しています。

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

この場合、秘密鍵と公開鍵のデフォルト名称はそれぞれ、 `id_ed25519` `id_ed25519.pub` となります。

## クライアントPCからリモートサーバーへ公開鍵を転送して登録する

```
ssh-copy-id -i ~/.ssh/id_rsa.pub [リモートユーザー]@[リモートサーバーのホスト名]
```
上のコマンドをクライアントPCから実行することで、リモートサーバーに公開鍵を転送と公開鍵登録が実行されます。 (@vox_magnus さん、ありがとうございます。)
[Copy the key to a server][link6]

## クライアントPCから公開鍵認証でリモートにSSH接続できることを確認する

```
ssh -i id_rsa [リモートユーザー]@[リモートサーバーのホスト名]
```

`-i id_rsa` には秘密鍵のパスを指定する。 なおデフォルトでは、 /home/[User名]/.ssh ディレクトリを参照する。保管先が別ならパスで指定すること

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

公開鍵認証でリモートに接続できることが確認できたら、パスワード認証を無効にすることで鍵が無いとログインできないようにする。
設定はリモートサーバーで行うので、SSH接続してから以下の操作を行う。

/etc/ssh/sshd_configを開き以下を入力する

```/etc/ssh/sshd_config
PasswordAuthentication no
```

リモートサーバーをSSHサービスを再起動する

```
# systemctl restart sshd
```

# 3. その他

## ssh接続で秘密鍵や接続先リモートを省略する方法

クライアントの .sshディレクトリのconfigファイルにエイリアスを定義することで、リモート接続時のコマンドを省略できる。

```/home/[user名]/.ssh/config
Host [エイリアス１]
  HostName リモートのホスト名
  User リモートユーザー
  IdentityFile /home/[user名]/.ssh/[秘密鍵]

Host [エイリアス2]
  ...
```

エイリアス1に接続したい場合は以下で接続できるようになる

```
ssh エイリアス１
```

（あまり用途は無いかもしれないが、）同じリモートに異なる鍵でアクセスしたい場合は、エイリアスを分ければ良い。


## rootユーザーでのssh接続を無効にする

/etc/ssh/sshd_configを開き、`PermitRootLogin`の値を`no`にするかコメントアウトする

``` /etc/ssh/sshd_config
PermitRootLogin no
```

その後、再起動すると反映される

## 公開鍵認証でssh接続しているのにログインパスワードを聞かれる場合

ログインユーザーのホームディレクトリの.sshディレクトリと登録済みの公開鍵のアクセス権を確認する

```
ls -al ~/.ssh

# .sshディレクトリは、700であること
drwx------. 2 <user> <group> xx MM DD hh:mm .ssh

# .sshディレクトリ配下の公開鍵や認証情報は、600であること
-rw-------. 1 <user> <group> xx MM DD hh:mm authorized_keys
-rw-------. 1 <user> <group> xx MM DD hh:mm id_rsa.pub
```

# 参考
[インフラエンジニアじゃなくても押さえておきたいSSHの基礎知識][link1]
[sshのパスワード認証方式を無効にする][link2]
[ssh公開鍵認証設定まとめ][link3]
[OpenSSH 公式による scp 非推奨宣言を受け, scp, sftp, rsync を比較してみた][link4]
[ssh-rsa，非推奨のお知らせ][link5]
[ssh.com Ssh-copy-id][link6]

[link1]:https://qiita.com/tag1216/items/5d06bad7468f731f590e#fn2
[link2]:http://park1.wakwak.com/~ima/centos4_sshtips002.html
[link3]:https://qiita.com/ir-yk/items/af8550fea92b5c5f7fca
[link4]:https://www.kangetsu121.work/entry/2019/11/04/233742
[link5]:https://orumin.blogspot.com/2020/05/ssh-rsa.html
[link6]:https://www.ssh.com/ssh/copy-id#copy-the-key-to-a-server