公開鍵認証をしてみる

こんにちは
株式会社クラスアクト インフラストラクチャ事業部の大塚です。

今回は、タイトルの通り公開鍵認証環境を作っていきたいと思います～
※人に教える必要があり、環境を用意したのですが忘れてしまうのが嫌なので吐き出しておくって感じです。もういい歳で簡単に忘れてしまうので💦

# 公開鍵認証とは
ChatGPT君に聞いてみました

> <b>ワイ</b>
公開鍵認証とは何ですか？1行で説明してください
<b>ChatGPT君</b>
公開鍵認証とは、公開鍵と秘密鍵のペアを使用して、デジタルデータの暗号化や認証を行うセキュリティ技術です。

暗号化は以前やったこちらの話だと思います。多分。

https://qiita.com/ohtsuka-shota/items/89020a7184ecef3442d6

# 環境イメージ
今回作成した環境は以下となります。
仮想のGUI環境のUbuntu(Client)とCUI環境のUbuntu(Server)を用意します。
Client側でカギを作成して、それをServer側に移動します。
最後にカギを使ってSSH接続できるかを確認します。
![security010.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/4658090c-0a22-c29c-35b6-ab0ab46d37f0.png)


# 構築
## SSH接続用のユーザを作成する（やらないでもOK）
試験用のユーザ、ohtsukaをClient側に作成します。
作成後、一応sudoを使えるようにしておきます。
※以下はGUIで操作している図
![Pasted image 20240503173533.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/abdcbacd-4360-12bd-6392-83844cf45a53.png)
```
test@ssh-client:~$ sudo su -
[sudo] test のパスワード: 
root@ssh-client:~# adduser ohtsuka
ユーザー `ohtsuka' を追加しています...
新しいグループ `ohtsuka' (1001) を追加しています...
新しいユーザー `ohtsuka' (1001) をグループ `ohtsuka' に追加しています...
ホームディレクトリ `/home/ohtsuka' を作成しています...
`/etc/skel' からファイルをコピーしています...
新しい パスワード: 
正しくないパスワード: このパスワードは辞書チェックに失敗しました - 辞書の単語に基づいています
新しい パスワードを再入力してください: 
passwd: パスワードは正しく更新されました
ohtsuka のユーザ情報を変更中
新しい値を入力してください。標準設定値を使うならリターンを押してください
	フルネーム []: 
	部屋番号 []: 
	職場電話番号 []: 
	自宅電話番号 []: 
	その他 []: 
以上で正しいですか? [Y/n] Y
root@ssh-client:~# gpasswd -a ohtsuka sudo 
ユーザ ohtsuka をグループ sudo に追加
```

## 公開鍵/秘密鍵を生成する
ohtsukaユーザで改めてRDPし直します。
ログイン後ssh-keygenコマンドを実行してカギを作成します。
id_rsaが秘密鍵、id_rsa.pubが公開鍵となります。
```
ohtsuka@ssh-client:~$ ls -a
.             .bashrc  .local    .xorgxrdp.10.log   ダウンロード  ビデオ
..            .cache   .pcsc10   .xsession-errors   テンプレート  ピクチャ
.Xauthority   .config  .profile  snap               デスクトップ  ミュージック
.bash_logout  .gnupg   .ssh      thinclient_drives  ドキュメント  公開
ohtsuka@ssh-client:~$ cd .ssh/
ohtsuka@ssh-client:~/.ssh$ ssh-keygen -t rsa -b 2048
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ohtsuka/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/ohtsuka/.ssh/id_rsa
Your public key has been saved in /home/ohtsuka/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:DVVCqfHVERu6WxlT9Kq+jFDxMfzB64Voec7T5rppP4E ohtsuka@ssh-client
The key's randomart image is:
+---[RSA 2048]----+
|         .+o..++o|
|        ...o.o.+.|
|        .+..= * .|
|        .o.o B O |
|        S o * X .|
|         . . E + |
|        .   o = +|
|         . +  .* |
|          . +o+++|
+----[SHA256]-----+
ohtsuka@ssh-client:~/.ssh$ ls -a
.  ..  id_rsa  id_rsa.pub
```

## 生成した公開鍵をサーバにコピーする
ssh-copy-idという便利なコマンドを使ってServerに公開鍵をコピーします。
Serverに初めてアクセスするとコピーの前にホスト認証が走ります。
ホストを認証することでClientのknown_hostsにServerのFingerprintが登録されるようです。
※この時、何故か実行したコマンドをコピーすることが出来なかったので、恐縮ですがスクショで。。。
![Pasted image 20240503175057.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/af10d7c0-fde6-59ae-b104-177a5938fad0.png)

Server側のtestユーザのホームディレクトリを確認すると、.ssh隠しディレクトリの中にauthorized_keyというファイルがあるかと思います。
これをcatで確認するとSSHクライアント側のohtsukaユーザのカギを確認することが出来ます。
```
test@ssh-server:~$ ls -a
.   .bash_history  .bashrc  .profile  .sudo_as_admin_successful
..  .bash_logout   .cache   .ssh
test@ssh-server:~$ cd .ssh/
test@ssh-server:~/.ssh$ cat authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtsV33lzR2lcAJ2pjgwv82neFCaKIL/KkL1TvmCpUiTcELoAT9GcS7YIQl+/OABVvTO5LZ476D2eTyVyceLoNXTrX4sJSjV9dbqnIL1M3lYYNjlAU4TtXaegLIwOGnuE2yt1qOAMFdFzDP1ZVnpUviH4VxOOgMarDk0IrSTIr3Hjj81VpkzQNXNMZrKLnZkPUTYPaIjysvAk+dgYlSW+1pyQyugbm//ZL3sVI6iBoOQoF3JB0i88W4Wpx18xefZox8TUWprTimg02eyzFscRM7wknMk9Ynt5/slrK434cbKPxsJyl/C8OYuDsnCdPsdXa77Tv8TN2cZ7Y0mBsfwRAh ohtsuka@ssh-client
```
Client側の.pubをcatします。同じですね。
```
ohtsuka@ssh-client:~/.ssh$ cat id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDtsV33lzR2lcAJ2pjgwv82neFCaKIL/KkL1TvmCpUiTcELoAT9GcS7YIQl+/OABVvTO5LZ476D2eTyVyceLoNXTrX4sJSjV9dbqnIL1M3lYYNjlAU4TtXaegLIwOGnuE2yt1qOAMFdFzDP1ZVnpUviH4VxOOgMarDk0IrSTIr3Hjj81VpkzQNXNMZrKLnZkPUTYPaIjysvAk+dgYlSW+1pyQyugbm//ZL3sVI6iBoOQoF3JB0i88W4Wpx18xefZox8TUWprTimg02eyzFscRM7wknMk9Ynt5/slrK434cbKPxsJyl/C8OYuDsnCdPsdXa77Tv8TN2cZ7Y0mBsfwRAh ohtsuka@ssh-client
```
## 公開鍵認証でSSH接続する
最後にSSHクライアントからSSHサーバに対してSSH接続を公開鍵認証で行ってみます。
コマンドはssh -i ~/.ssh/id_rsa "接続先ユーザ名"@"接続先ホスト"となります。
以下のスクショはid_rsaがカレントディレクトリにあるため"~/.ssh/"は省いています。
![Pasted image 20240503182305.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3219385/f6cc52f1-ed5d-0047-fa30-ea49d17e5878.png)