Ubuntuで秘密鍵公開鍵ペアを作成し，WindowsのPuttyと秘密鍵を共有する

# 目的
授業で，必要だから初回授業までに公開鍵をメールで先生に送ってねって言われました．どんなことをするか分からないし，とりあえずwindowsとUbuntuの両方用意しておけば完璧だよねってことでこの記事はそのやり方を書いていきます．

## この記事でやること

- Virtualbox上のUbuntuで，秘密鍵公開鍵のペアを作成する
- 秘密鍵をWindowsと共有
    - 秘密鍵をPuTTY用に変換
    - PuTTYの設定を行う
- うまくいってるか確認
    - Ubuntuの公開鍵を他のUbuntuに転送する
    - 公開鍵による認証ができる確認
- 公開鍵をメールで先生に送付

## 環境
|アプリケーション             |バージョン     |
|:---------------------------|:--------------|
| Windowsエディション         |Window 10 Pro  |
| Windows バージョン          | 1909          |
| VirtualBox                  | 6.1.6         |
| Ubuntu                     | 18.04.4 LTS    |
## 前提
- VirtualBoxがインストール済み
- 仮想マシンとしてUbuntuが入ってる（2つ)
- ホストはWindowsでPuTTYがインストールされている。

# VirtualBox上のUbuntuで，秘密鍵公開鍵のペアを作る．
  参考にしたURL
GitLab: Generating a new SSH key pair，
https://gitlab.com/help/ssh/README#generating-a-new-ssh-key-pair
（閲覧日：2020-05-14）．

今回は，楕円暗号のed25519を使用します．また，内輪で使うためパスフレーズは設定しません．Ubuntuにログインして「端末」を開いてください。
ユーザ名のところを隠すため，`/home/ユーザ名`を`/path/to`って書いてます. あと，$から始まる行がコマンド入力です．

```shell-session
$ ssh-keygen -t ed25519 -C "software development"
```

このコマンドを打つと，下のが出る．

```shell-session
Generating public/private ed25519 key pair.
Enter file in which to save the key (/path/to/.ssh/id_ed25519):
```

今回は保存先を変えないのでEnterキーのみ押す．

``` shell-session
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
```

あんまりよくないかもしれないけど，今回はVirtualBoxのみで使うし，まあいいやろってことでパスフレーズなしにしました。何も入力せずEnterを押しました。

```shell-session
Your identification has been saved in /path/to/.ssh/id_ed25519.
Your public key has been saved in /path/to/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:(文字列) software development
The key's randomart image is:
（四角い何か）
```

これで秘密鍵公開鍵のペアができました。
ファイルの存在を確認します。
下の赤枠で示した部分をクリック
![Screenshot from 2020-05-15 00-02-22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/dc592fe1-24ad-1070-0247-b0e91096500a.png)

「隠しファイルを表示する」にチェックを入れます。
![Screenshot from 2020-05-15 00-33-46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/be7a2f4b-171a-4cd6-14ed-102b3939abc3.png)

これでホームの`.ssh`のディレクトリを開くとこんな感じです。
![Screenshot from 2020-05-15 00-40-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/a46abf0e-00c3-3460-59fe-81d42ac2b316.png)

```shell
man ssh-keygen
```

をすると、
<details><summary>manの結果を見る</summary><div>
>
> FILES
>     ~/.ssh/id_dsa
>     ~/.ssh/id_ecdsa
>     ~/.ssh/id_ed25519
>     ~/.ssh/id_rsa
>             Contains the DSA, ECDSA, Ed25519 or RSA authentication identity
>             of the user.  This file should not be readable by anyone but the
>             user.  It is possible to specify a passphrase when generating the
>             key; that passphrase will be used to encrypt the private part of
>             this file using 128-bit AES.  This file is not automatically
>             accessed by ssh-keygen but it is offered as the default file for
>             the private key.  ssh(1) will read this file when a login attempt
>             is made.
>
>     ~/.ssh/id_dsa.pub
>     ~/.ssh/id_ecdsa.pub
>     ~/.ssh/id_ed25519.pub
>     ~/.ssh/id_rsa.pub
>             Contains the DSA, ECDSA, Ed25519 or RSA public key for authenti‐
>             cation.  The contents of this file should be added to
>             ~/.ssh/authorized_keys on all machines where the user wishes to
>             log in using public key authentication.  There is no need to keep
>             the contents of this file secret.
>
>     /etc/ssh/moduli
>             Contains Diffie-Hellman groups used for DH-GEX.  The file format
>             is described in moduli(5).
</div></details>

manコマンドの結果から.pubファイルが公開鍵、拡張子のないファイルが秘密鍵であることがわかります。
注意事項は、秘密鍵を持っていることが本人であることの証明なので秘密鍵はだれにも見せてはいけないんです。だれにもあげてはいけません。公開鍵を相手に渡します。今回はWindowsでも本人であることを証明するので、Windowsに秘密鍵をわたし、先生に公開鍵を送ります。

# 秘密鍵をWindowsと共有
USBに作成した秘密鍵を入れてWindowsに保存しました。
ここからは、以下のWebサイトを参考に作業を進めました。
https://bacchi.me/linux/putty-key/

## 秘密鍵をPuTTY用に変換
puttygen.exeを起動します。
![キャプチャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/415e3dd9-b3b8-f3ab-c39a-0c795d2bb6cf.png)
Loadを選択
![キャプチャ1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/85ecbc58-a71a-3732-49f8-6e432c8c3c3c.png)
秘密鍵のファイルを読み込ませると下のようなWindowが出てくるのでOKをクリック
![キャプチャ2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/a8636859-dff4-c2a6-7c67-c3a0130f5319.png)
Save private keyをクリック
![キャプチャ3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/233718a3-8fb0-97df-f680-c5f8e9fdae97.png)
またもやパスフレーズを設定しないつもりなので「はい」をクリック
授業用なのでなめてかかってます。乗っ取られても被害が出るほど、設定甘くないでしょ。ネットワークばっかりやってる先生だし。一応McAfeeも入ってるし、マルウェアとかになんかやられて、怒られたらそんときですよ。
![キャプチャ4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/7a7c0e0b-8422-1e28-9ccf-46e060f453fc.png)
このあとの画面で`id_ed25519.ppk`という名前でPuTTY専用の秘密鍵の形式で保存しました。

# うまく行っているか確認
面倒だったのでUSBメモリで鍵を別のUbuntuの仮想マシンに入れました。
このUbuntuマシンに公開鍵をインストールして設定します。
参考にしたURLは以下のとおりです。
https://qiita.com/jinnai73/items/f1822f2e4d567847e215

まずは、sshが入っていなかったのでインストール

```shell-session
$ sudo apt install ssh
```

これであの参考URLにのっていた/etc/ssh/sshd_configってファイルができます。
最初なかったから「あれ？」ってなりました。

続いて参考URLにのっていた、sshdの設定を確認します

```shell-session
$ grep Pubkey /etc/ssh/sshd_config
#PubkeyAuthentication yes
$ grep KeysFile /etc/ssh/sshd_config
#AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2

```

両方コメントアウトされていました。

sshd_configファイルの最初に以下のことが書いてあります

```shell-session
#	$OpenBSD: sshd_config,v 1.101 2017/03/14 07:19:07 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/bin:/bin:/usr/sbin:/sbin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options override the
# default value.

```

じゃあ`man sshd_config`にdefaultのことがかいてあって、コメントアウトされていればdefaultが適用されるってことですね.　やってみます。

```shell-session
$ man sshd_config
(省略）
     AuthorizedKeysFile
             Specifies the file that contains the public keys used for user
             authentication.  The format is described in the AUTHORIZED_KEYS
             FILE FORMAT section of sshd(8).  Arguments to AuthorizedKeysFile
             accept the tokens described in the TOKENS section.  After expan‐
             sion, AuthorizedKeysFile is taken to be an absolute path or one
             relative to the user's home directory.  Multiple files may be
             listed, separated by whitespace.  Alternately this option may be
             set to none to skip checking for user keys in files.  The default
             is ".ssh/authorized_keys .ssh/authorized_keys2".
（省略）
     PubkeyAuthentication
             Specifies whether public key authentication is allowed.  The
             default is yes.
(省略）
```

ということでdefaultは、公開鍵認証は利用できる。必要な公開鍵はホームディレクトリの.ssh/authorized_keysという名前か.ssh/authorized_keys2という名前で保存しておけばこのsshd_configファイルは書き換えなくて良さそうです。

初めての人は.pubだったあの鍵ファイルを`authorized_keys`という名前に変えておけば設定が完了です。

2つ目の公開鍵を設定する人は、`man sshd`を見る限り、すでにある.ssh/authorized_keysの2行目に新しい公開鍵を書き込めば良さそう。
新しく登録する公開鍵がid_ed25519.pubだった場合、

```shell-session
cat id_ed25519.pub >> authorized_keys
```
という感じかなって思ってます。（やってないです）
## PuTTYからSSHでログイン
ここからは以下のURLを参考にやります。
https://webkaru.net/linux/putty-ssh-login-public-key/

ホストオンリーでつなげました。赤枠にIPアドレスを書き込み
![キャプチャ5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/536c8b77-1877-afb9-60b9-b60e582643b3.png)
左のCategoryのSSHの左の+をクリックし、Authをクリック（＋ではない）
![キャプチャ6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/b4c6a986-968f-d0a1-f9b8-84199ce60b19.png)

そのあと、Browse...をクリックして、さっき作ったid_ed25519.ppkを選択し、Openをクリック
![キャプチャ7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/554581/b8a8fcfd-8ee4-52e5-20f5-b6a4cc62a257.png)
まあ、証明書なんてめちゃくちゃだよね。セキュリティアラートがでます。「はい」をクリック
これでユーザ名を入力すればパスワードなしでログインできます。
本当はパスフレーズがいるかもしれないんですけど、設定してないから関係ない。

動作確認完了！

## Ubuntuからログイン
以下では、このuRLを参考にすすめました。
https://qiita.com/kazokmr/items/754169cfa996b24fcbf5
最初に秘密鍵を作ったUbuntuから、公開鍵を入れたUbuntuへsshでログインしてみます.
ゲスト同士なのでNATネットワークでつなぎました。

```shell-session
$ ssh -i .ssh/id_ed25519 ユーザ名@10.0.2.4
OpenSSH_7.6p1 Ubuntu-4ubuntu0.3, OpenSSL 1.0.2n  7 Dec 2017
The authenticity of host '10.0.2.4 (10.0.2.4)' can't be established.
ECDSA key fingerprint is SHA256:6J6b0uN1UxZ73lecICtlximohs3iFZ8bcLTtbPUMAbY.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '10.0.2.4' (ECDSA) to the list of known hosts.
Authenticated to 10.0.2.4 ([10.0.2.4]:22).
Welcome to Ubuntu 18.04.4 LTS (GNU/Linux 5.3.0-51-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage


 * Canonical Livepatch is available for installation.
   - Reduce system reboots and improve kernel security. Activate at:
     https://ubuntu.com/livepatch

26 個のパッケージがアップデート可能です。
0 個のアップデートはセキュリティアップデートです。

Your Hardware Enablement Stack (HWE) is supported until April 2023.
Last login: Fri May 15 17:08:10 2020 from 10.0.2.4
$ 
```
鍵の場所は.sshである場合のみです。違う場合は.ssh/id_ed25519を変えてください。

というわけでsshログインできました．

# まとめ
Ubuntuで公開鍵秘密鍵のペアを作って，Windows上のputtyと秘密鍵を共有しました。
また、別のUbuntuに公開鍵認証を設定して、Ubuntuとputtyの両方からログインできることを確認しました。

## ハマった点
まるですべてがうまく行ったかのように書いてありますが、嘘です。ハマりました。VirtualboxのNatネットワーク初めて使ったからしょうがない

ハマったのは以下の部分です。（解決済み）

- Ubuntu同士の通信
    - Virtualboxの設定をミスったのでメモリを食い尽くしてホストOSのWindowsが落ちました。
    - NATネットワークでUbuntu同士を通信させようとした際、別にNATのNICも入れてたので、ルーティングが狂いました。`route -v`でわかりました。だけど一晩を費やしました。