公開鍵・秘密鍵の設定

## はじめに
ここでは、サーバ間で通信を行うための鍵設定を行う。
あるサーバからあるサーバへ通信を行うのは基本である。

最も基本的な通信は、相手サーバのIPアドレスを指定してユーザ名・パスワードを以って認証を行いログインする方法である。

しかし、システムを構築した際などはパスワードレスな通信が望ましい。
なぜなら、1つ1つの通信処理でユーザ名・パスワードを聞いていると処理が煩雑になってしまうから。

そのため、今回はそんなパスワードレスでも安全性を確保した通信手段である公開鍵・秘密鍵の仕組みを使ってssh(Secure Shell)接続を確立したい。

## 前提条件
2台のUbuntuのHWのセットアップが完了している。
それぞれのサーバ名・IPアドレス・ユーザ名・パスワードがわかっている

今回は、ez770-client(192.168.56.100)というサーバからez770-node1(192.168.56.101)への通信を試みる。

## まず、鍵登録せずに通信を行う
まずは、clientからnode1サーバに対してssh通信を行ってみることにする。
こちらが正常にできない場合、鍵登録以前に接続設定等に問題がある可能性が高い。

接続設定に問題無いことがわかれば、あとは鍵登録すればよいだけなので問題も切り分けやすい。

### ClinetサーバからNode1にssh接続する

一例として、clientサーバからnode1にssh接続する。
その際、以下の準備が整っている必要がある。

- clientサーバにログインできること
- node1のIPアドレスを知っていること(hostsファイルに登録が済んでいたらサーバ名でOK)
- node1のユーザ名・パスワードを知っていること
- ufwがsshポートにてclientサーバを許可している もしくはoffになっていること

が条件となる。

今回行う接続について、node1のIPアドレスは、192.168.56.101である。(これはプライベートIPと呼ばれる。)
ユーザ名：maitne パスワード:mainte で接続を行う。

接続するためのコマンドは以下

```
[実行コマンド]
mainte@ez770-client:~$ ssh mainte@192.168.56.101

[fingerprintの作成有無を聞かれる]
The authenticity of host '192.168.56.101 (192.168.56.101)' can't be established.
ECDSA key fingerprint is SHA256:X7wdsVdgQ7RzgVdz+NAfUaqJTXuFD7qlu3hr8Oi/ce8.
Are you sure you want to continue connecting (yes/no/[fingerprint])? 

[入力内容]
yes

[結果]
Warning: Permanently added '192.168.56.101' (ECDSA) to the list of known hosts.
mainte@192.168.56.101's password: 
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-31-generic x86_64)

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

 System information as of Tue Jul 16 05:23:36 AM UTC 2024

  System load:  0.0                Processes:               287
  Usage of /:   5.3% of 193.83GB   Users logged in:         1
  Memory usage: 1%                 IPv4 address for ens160: 192.168.56.101
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Tue Jul 16 02:54:44 2024 from 192.168.56.100
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.

mainte@ez770-node1:~$ 
```

一番下の行にてホスト名がez770-node1と表示されているので、接続できることを確認できた。


## Key Setting

### Clientサーバで鍵を作成する

以下のコマンドはSSHキーの生成に使用される。
具体的には、RSAアルゴリズムを使用して4096ビットの鍵を生成し、鍵のコメントとして「id_rsa」を設定し、生成された鍵ファイルを特定のパスに保存する。

このコマンドが実行されると、公開鍵暗号方式の鍵ペア（公開鍵と秘密鍵）が生成される。

一旦/tmpに鍵を作成する。
```
[実行コマンド]
sudo ssh-keygen -t rsa -b 4096 -C "id_rsa" -f /tmp/id_rsa

[鍵に設定するパスフレーズを聞かれる]
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 

[入力内容]
(何も入力しない)

[間違えないように再度パスフレーズを聞かれる]
Enter same passphrase again: 

[入力内容]
(何も入力しない)

[結果]
Your identification has been saved in /tmp/id_rsa
Your public key has been saved in /tmp/id_rsa.pub
The key fingerprint is:
SHA256:XDQt8ijhvcvH+25kSDvhqdENBnQb6yobPrJxTJZW2ak id_rsa
The key's randomart image is:
+---[RSA 4096]----+
|       .. =.     |
|      . o=.*.    |
|     . oo=*.     |
|      o+o+*      |
|      =.E*.B     |
|     =  o.B +    |
|    . =..= +     |
|    .+.++ o .    |
|    .oo. ..=o    |
+----[SHA256]-----+
```

となり鍵が作成された。

一応、/tmpフォルダ内を参照することで作成されているか確認する。
```
ll /tmp/
total 68
drwxrwxrwt 15 root root 4096 Jul 16 09:05 ./
drwxr-xr-x 23 root root 4096 Jul 16 05:00 ../
(略)
-rw-------  1 root root 3369 Jul 16 09:05 id_rsa
-rw-r--r--  1 root root  737 Jul 16 09:05 id_rsa.pub
```
となり、id_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成されていることが分かった。
中身も確認してみる。

秘密鍵id_rsaの中身
```
[実行コマンド]
sudo cat /tmp/id_rsa

[結果]
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAACFwAAAAdzc2gtcn
NhAAAAAwEAAQAAAgEArSPp68aiU7mVyPmdOvINXkvFyE8cyNJ5EMHI9sjpDWNFU4JndJcb
```

公開鍵id_rsa.pubの中身
```
[実行コマンド]
sudo cat /tmp/id_rsa.pub 

[結果]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtI+nrxqJTuZXI+Z068g1eS8XITxzI0nkQwcj2yOkNY0VTgmd0l
...
lwf1dBYpQ== id_rsa
```

### clientからnode1にmainteユーザでログインするための鍵登録を行う

鍵を作成できたので、次はclientサーバからnode1にmainteユーザでログインできるように鍵の登録を行う。

ここでいうmainteユーザとは、node1のmainteユーザのことである。
各ノードでmainteを作ってしまったためややこしくなっているが、説明の中のユーザはどのサーバが所有しているか認識しながら進んでもらえるとより良い。

やることは、client側・node1側でそれぞれ1つずつある。

#### clientサーバに秘密鍵を登録する
まず、先ほど作成した秘密鍵を自分のホームディレクトリ/home/mainte/.ssh配下にコピーする。
.sshディレクトリはサーバ間通信を行い際の認証情報に関するファイルなどを格納する。

```
[実行コマンド]
sudo cp /tmp/id_rsa /home/mainte/.ssh/

[確認コマンド]
ll /home/mainte/.ssh/

[結果]
(略)
-rw------- 1 mainte mainte    0 Jul 16 05:10 authorized_keys
-rw------- 1 root   root   3369 Jul 18 00:49 id_rsa
-rw------- 1 mainte mainte 2098 Jul 16 05:50 known_hosts
...
```
現在の、id_rsaの所有者見てほしい。
所有者・所有グループがともにrootとなっている。
また、root以外のファイル権限が---となっている。
これは、root以外ファイルを参照もできないことを示している。

そのため、一旦root以外でもファイルを参照できるようにしておく。
```
[実行コマンド]
sudo chmod 775 /home/mainte/.ssh/id_rsa 

[確認コマンド]
mainte@ez770-client:~$ ll /home/mainte/.ssh/id_rsa

[結果]
-rwxrwxr-x 1 root root 3369 Jul 18 00:49 /home/mainte/.ssh/id_rsa*
```

これで、id_rsaをmainteユーザでもsudo権限無しで参照できるようになった。

次に、/home/mainte/.sshディレクトリ配下に「config」というファイルを作成し、接続情報と秘密鍵の参照情報を登録する。

configファイルの書き方は、以下である。
このように記載することで、サーバが接続情報と秘密鍵の場所を認識できるように設定する。
```
Host [ホスト名]
  HostName [ホスト名]
  User [ユーザ名]
  Port [ポート番(22)] 
  IdentityFile [秘密鍵の場所指定(/home/mainte/.ssh/id_rsa)]
  StrictHostKeyChecking no
```

それでは、configファイルを作成する。
```
[実行コマンド]
vi /home/mainte/.ssh/config

[入力内容]
Host ez770-node1
  HostName ez770-node1
  User mainte
  Port 22
  IdentityFile /home/mainte/.ssh/id_rsa
  StrictHostKeyChecking no
```

これで、clientサーバからnode1にmainteユーザでの接続を試みる際、/home/mainte/.ssh/id_rsaの秘密鍵が参照されるようになった。
一旦、この状態でnode1への接続を試みてみる。
まだ、node1に公開鍵を登録していないので、エラーになるはずだがエラー内容には鍵の参照ログがでるかもしれない。

```
[実行コマンド]
ssh mainte@ez770-node1

[結果]
Load key "/home/mainte/.ssh/id_rsa": Permission denied
mainte@ez770-node1's password: 
```
やはり、鍵が認証されずにパスワードが要求された。
しかし、configに登録した内容をもとに秘密鍵が参照されていることが分かった。

#### node1サーバに公開鍵を登録する

次に、node1側に公開鍵を登録する。
公開鍵は、/home/mainte/.ssh/ディレクトリ配下にある authorized_keysというファイルに登録する。
これは、clientサーバ側で作成した公開鍵の内容をそのままauthorized_keysにコピペすればいい。

```
[clientサーバ側で公開鍵情報を表示]
mainte@ez770-client:~$ less /tmp/id_rsa.pub 

[結果 内容をコピー]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtI+nrxqJTuZXI+Z068g1eS8XITxzI0nkQwcj2yOkNY0VT...

[node1サーバ側でauthorized_keysを開き、公開鍵情報をペースト]
mainte@ez770-node1:~$ vi /home/mainte/.ssh/authorized_keys 

[入力内容]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtI+nrxqJTuZXI+Z068g1eS8XITxzI0nkQwcj2yOkNY0VT...

[確認コマンド]
mainte@ez770-node1:~$ cat /home/mainte/.ssh/authorized_keys 

[結果]
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCtI+nrxqJTuZXI+Z068g1eS8XITxzI0nkQwcj2yOkNY0VT...
```

これで、node1サーバへの公開鍵登録が完了した。

それでは、clientからnode1に接続できるか確認する。

```
ssh mainte@ez770-node1
Welcome to Ubuntu 24.04 LTS (GNU/Linux 6.8.0-31-generic x86_64)

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

 System information as of Thu Jul 18 01:14:39 AM UTC 2024

  System load:  0.0                Processes:               290
  Usage of /:   5.3% of 193.83GB   Users logged in:         1
  Memory usage: 1%                 IPv4 address for ens160: 192.168.56.101
  Swap usage:   0%


Expanded Security Maintenance for Applications is not enabled.

0 updates can be applied immediately.

Enable ESM Apps to receive additional future security updates.
See https://ubuntu.com/esm or run: sudo pro status

Failed to connect to https://changelogs.ubuntu.com/meta-release-lts. Check your Internet connection or proxy settings


Last login: Thu Jul 18 01:13:03 2024 from 192.168.56.100
mainte@ez770-node1:~$ hostname
ez770-node1

```

今後は、client,node1-4まで同様の設定を行い相互にパスワードレス接続可能な状態にする。
また、clientからnode1にrootユーザでログインするための鍵登録も行いたい。