公開鍵を用いたssh接続

#はじめに
理屈をちゃんと理解していないからよく忘れて、何度も調べるパスワードなしのssh接続。

この投稿は、過去に諸先輩方がアップしてくれた分かりやすいサイトの内容を、自分が把握しやすいように再構成しただけです。
先輩の皆様ありがとうございます。

#やりたいこと
<img width="610" alt="ssh.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531509/bfa3843b-5123-eca4-1097-a32afb50389b.png">

一台のマシンから複数台のマシン/さまざまなOSにssh接続するとき、パスワードを打ち込まないでアクセスしたい。
単純なログインの簡略化ではなく、リモートコマンドを実行することを念頭に、公開鍵を利用した接続手順をまとめる。

今回想定している構成は以下。
【接続元】

| マシン | IPアドレス |
|:--|:--|
|Linux(CentOS)   |192.168.10.100   |


【接続先】

| マシン | IPアドレス |
|:--|:--|
|Linux(CentOS)   |192.168.10.101   |
|VMware ESXi |192.168.10.200|
|Windows 10 Pro|192.168.10.201|

#1. 接続元で秘密鍵と公開鍵を生成
接続元のサーバで、秘密鍵と公開鍵のペアを作成し、公開鍵を接続先に渡す。基本はこれだけ。

なので、まず接続元のサーバにログインして鍵のペアを作る。
rootユーザで接続元Linuxにログインする。そして以下のコマンドで鍵を生成する。rsaで鍵を作る場合は特に指定は必要ない。

```bash
# 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:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx root@hostname
```
keyの保管先ファイルとパスフレーズを設定するよう求められる。
鍵のできる場所はデフォルトの/root/.ssh/id_rsaでいいので、単純にEnterキーを押す。
のちのち自動化処理に使いたいので、パスフレーズは空で。単純にEnterキーを押す。

鍵が生成されたことを確認する。

```bash
# cd .ssh
# ls
id_rsa  id_rsa.pub  known_hosts
```
`秘密鍵：id_rsa`と`公開鍵：id_rsa.pub`ができている。

#2. 接続先設定：Linux編
まず、Linux（CentOS 7)の場合の手順。接続先Linuxサーバのsshdが有効になっていることが前提。
##公開鍵の配布
接続元で作った公開鍵を接続先Linuxに渡す。
![key-scp.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531509/434230bd-da8b-be3b-7c54-40e672a3ad8d.png)

鍵の受け渡しには、scpを使った。もちろんこの段階では公開鍵を使った設定をしていないのでパスワードを入力する。

```bash:接続元で実行
# scp /root/.ssh/id_rsa.pub root@192.168.10.101:/root/
```
接続先のLinuxにrootでログインして、受け渡した公開鍵を.ssh/authorized_keysに追記する。

```bash:接続先で実行
# mkdir .ssh
# chmod 700 .ssh
# cat id_rsa.pub >> .ssh/authorized_keys
# rm id_rsa.pub
```
## sshd設定変更とサービスの再起動
接続先のsshd_configを一部修正する。

```bush:接続先で実行
# vi /etc/ssh/sshd_config
```
公開鍵認証に関する一か所だけ変更する。実際には先頭に#がついてるのを外すだけ。

```bush:接続先で実行
PubkeyAuthentication yes
```
書き換えたら、サービスを再起動する。

```bush：接続先で実行
# systemctl restart sshd
```
これで、接続元Linuxから接続先Linuxへのsshアクセスの際に、パスワードを聞かれずに接続できる。

#3. 接続先設定：VMware ESXi編
次に、VMware ESXi 6.7 update 3の場合の設定。
## ESXiのsshdサービスの有効化
ESXiのsshdサービスはデフォルトで無効化されているので、これを有効化する。

- ブラウザを開き、対象のESXiにアクセスする。
- ホスト＞管理＞サービスを開く。
- TSM-SSHを選択し、アクションをクリック。
- ポリシーを選択し、`ホストと連動して起動および停止します`を選ぶ。
- TSM-SSHを選択したままにして、`起動`ボタンをクリックする。

これでsshdサービスは立ち上がり、次回以降ESXiを再起動した際もsshdサービスが上がってくる。

## 公開鍵の配布
接続元で作った公開鍵を接続先ESXiに渡す。ここでもscpで渡す。


```bash
sh:接続元で実行
# scp /root/.ssh/id_rsa.pub root@192.168.10.200:/
```
接続先のESXiにrootでsshログインして、受け渡した公開鍵を/etc/ssh/keys-root/authorized_keysに追記する。

```bash:接続先(ESXi)で実行
~] cat id_rsa.pub >> /etc/ssh/keys-root/authorized_keys
```
ESXiはサービスの再起動は必要ない。これで終わり。

#4. 接続先設定：Windows 10 Pro
##機能の追加
Windows 10 バージョン1803以降であれば、sshdサービスを追加できる。追加方法は以下の通り。

- スタートメニューを右クリック＞`設定`をクリック。
- Windowsの設定＞`アプリ`をクリック。
- アプリと機能にある`オプション機能`をクリック。
- `機能の追加`をクリック。
- `OpenSSHサーバー`を選択し、`インストール`ボタンが表示されるのでクリック。
- 画面右上の×ボタンで閉じる。

##Windows 10 Proのsshdサービスの有効化
インストールしただけではサービスが有効化されていないので、以下の方法で有効化する。

- 検索ボックスに「サービス」と入力して検索。`サービス`画面を開く。
- サービス名：`OpenSSH SSH Server`を探し、プロパティを開く。
- スタートアップの種類：`自動`を選択し、適用ボタンとOKボタンをクリック。

##公開鍵の配布
接続元で作った公開鍵をこれまたscpを使って接続先のWindows 10に渡す。
なおWindows 10上のユーザー名はTechとする。

```bash:接続元で実行
# scp /root/.ssh/id_rsa.pub Tech@192.168.10.201:/
```
これでWindows 10に公開鍵がコピーできたので、今度はWindows 10側で操作する。
PowerShellを開き、受取った公開鍵をユーザーのホームは以下にある`.ssh/authorized_keys`に書き込む。


```powershell:接続先(Windows10)で実行
> mkdir .ssh
> cat C:\id_rsa.pub >> .ssh/authorized_keys
```
##sshdサービスの設定変更とサービスの再起動

設定ファイルは、`C:\ProgramData\ssh\sshd_conf`。最初、どこにあるか探してしまった。。。
このファイルの中で、1か所コメントを外して、2か所コメント化する。
具体的には公開鍵認証を有効化する設定と、AuthorizedKeyのファイルはローカルの配下にあるものだけを使う設定。

```bash:オリジナル
#PubkeyAuthentication yes
（省略）
Match Group administrators
       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
↓

```bash:変更後
PubkeyAuthentication yes
（省略）
#Match Group administrators
#       AuthorizedKeysFile __PROGRAMDATA__/ssh/administrators_authorized_keys
```
この後、sshdサービスを再起動する。

これでWindowsにもパスワードなしでssh接続ができるようになった。

#参考にしたサイト
https://qiita.com/Tanaaaaan/items/50c3f0ddc15c40b750d2
https://sig9.hatenablog.com/entry/2015/05/27/185218
http://ttm.jimba.ddo.jp/adiary.cgi/teraterm/0147
https://www.atmarkit.co.jp/ait/articles/1903/28/news005.html