はじめに
ここでは、サーバ間で通信を行うための鍵設定を行う。
あるサーバからあるサーバへ通信を行うのは基本である。
最も基本的な通信は、相手サーバの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ユーザでログインするための鍵登録も行いたい。