[Linux] ssh-agentを用いたssh接続

## この記事について
LPIC-102のセキュリティ分野における、sshの公開鍵認証の設定についてまとめる。

## 設定手順
公開鍵認証の場合、通常であれば認証のたびに秘密鍵のパスワード入力を求められる。<mark>ssh-agentによる認証では、認証におけるパスワード入力のプロセスをカットできる。</mark>

### 認証方式を公開鍵認証に設定（サーバー）
1. /etc/ssh/sshd_config をエディタで開く
```
[root@localhost ~]# vi /etc/ssh/sshd_config
```
2.以下行のコメントアウトを外し、値を「yes」にする
```
PubkeyAuthentication yes
```
3.sshdの再起動を行う
```
 [root@localhost ~]# systemctl restart sshd
```

### 鍵ペアの作成（クライアント）
1. ssh-keygenコマンドを実行し、公開鍵と秘密鍵のペアを作成する
```
   [root@localhost ~]# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Created directory '/root/.ssh'.
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:oiLCbH8bddiR+dOsgmmwT2ohL0YpbQpMWX7P1y6oVDs root@localhost.localdomain
The key's randomart image is:
+---[RSA 3072]----+
|                 |
|   .      o      |
|  +      +       |
| o . .  o o o    |
|o . o.++So.o o   |
|+o * o=+=. .o    |
|++* ++.Eo...     |
|oo.+.+*.....     |
|  ..++o.  .      |
+----[SHA256]-----+
```
:::note info
ssh-agentの設定に必要になるため、必ず任意のパスワードを設定する
:::
2.ホームディレクトリの`.ssh/`配下に公開鍵と秘密鍵のペアが作成されたことを確認する
```
[root@localhost ~]# ll ~/.ssh/
合計 8
-rw------- 1 root root 2655  4月 10 15:46 id_rsa
-rw-r--r-- 1 root root  580  4月 10 15:46 id_rsa.pub
```
### サーバーに公開鍵を配布
1. どうにかして、クライアント側で作成した公開鍵を、サーバーに配布する。
メディア経由による配布が理想のよう。
> 注意しなければならないのは、他方へ鍵を渡す際の方法です。 暗号化されていないネットワーク上をFTP やメールなどで渡すのは最も危険であり、暗号化されているSCP やSFTP の利用も望ましいものではありません。 鍵を渡す際には、ネットワークを一切経由しないメディア経由が最も安全です。 但し、鍵を渡した後にメディア（FD など）を紛失したならば意味はありませんので、メディア内の鍵を厳重に保管するなどの対策が必要です。
> 参考：[鍵配布の注意点](https://shobon.sakura.ne.jp/~campus-note/vine_linux/server_ssh/ssh_key.html#:~:text=%E2%96%A0,%E3%81%AB%E3%82%88%E3%82%8B%E8%AA%8D%E8%A8%BC%E3%81%A8%E3%81%AF%E3%83%BB%E3%83%BB%E3%83%BB&text=%E4%B8%80%E6%96%B9%E3%80%81%E9%8D%B5%E4%BA%A4%E6%8F%9B%E6%96%B9%E5%BC%8F%E3%81%AE,%E3%81%8C%E5%8F%AF%E8%83%BD%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%E3%80%82)

2.どうにかして、サーバーに配布した公開鍵を`~/.ssh/authorized_keys`としてコピーする

### ssh-agentの設定（クライアント）
1. ssh-agentを起動する
```
ssh-agent bash
```
:::note info
ssh-agentコマンドをそのまま実行すると、サービスに必要な環境変数を表示する。引数にシェルを指定することで、子シェルのスコープ内でのみ必要な環境変数が定義される。子シェルが終了すると、ssh-agentは停止し環境変数の設定も消える。
:::
2.ssh-agentの環境変数を確認する
```
 [root@localhost ~]# ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-2Eefr3kjLdQ4/agent.5739; export SSH_AUTH_SOCK;
SSH_AGENT_PID=5740; export SSH_AGENT_PID;
echo Agent pid 5740;
```
:::note info
SSH_AUTH_SOCK：ssh-agentとssh-add＆sshのプロセス間インターフェースが定義されている

SSH_AGENT_PID：ssh-agentが起動してる子シェルのプロセスID
:::
3.ssh-addコマンドでssh-agentに秘密鍵の登録を行う
鍵ペアをデフォルトパスで指定しているので、オプションは必要ない
```
[root@localhost .ssh]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (root@localhost.localdomain)
```
4.登録した秘密鍵を確認する
```
 [root@localhost .ssh]# ssh-add -l
3072 SHA256:oiLCbH8bddiR+dOsgmmwT2ohL0YpbQpMWX7P1y6oVDs root@localhost.localdomain (RSA)
```
### ssh接続
1. sshコマンドでクライアントからサーバーにssh接続を行う
   接続をするか否か問われるが、`yes`で問題ない
```
[root@localhost .ssh]# ssh root@10.2.149.12 cat ~/.ssh/authorized_keys
The authenticity of host '10.2.149.12 (10.2.149.12)' can't be established.
ECDSA key fingerprint is SHA256:HdTXkO5LG3T53IYrNLpWe5oXk2gSJDuFyyTrGMstKTc.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.2.149.12' (ECDSA) to the list of known hosts.
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCtW5Ucl1BjAi3HGgs+IJr/aq4pCDARQxN/54VKeEwL1NJaGH6Q06RKVnj+8LvfYyKeXpKjTDtX7IWUZmQ3m9rCLwcqGdpAPFQoUgef3OUdEplnAxL3Gp1zQrhkRC7bfBS3ytsDHmD4FeZSyvJq3NGTOtTHSDPsLILZM2WY3XPHNa1a8m8nGknmqMVT2eOY2dtqlQuZQzfynNml45fQh0YwVTiNTjc5Yu+WZBSUHcTbFTbBhyTklX/BKVHdV/1/+F1PRjMLyQOI5KAM1c39dQP6NOPHKWvCaNANi9m2Dttdtl9s6ctjaQuczQX8yofrFXtsrisEVfX6Zm7id6zfPmbt9gZdO4KiwEMlFMq32ZURDoCbShoHoVlRdIJdpBNoYN1BhKKPAHCgMjeFXnGFfcdaNXlegYbajvJ0jMbxnxytUUEY39kYFcPSCS0mqF11nGeL7+1XIz99F+nzGLLjPrHBqwkq6BTRKlOHD/wgz2+x2Gd/bkN72U1CQHdADvdnLrk= root@localhost.localdomain
```
:::note info
ssh接続時、sshサーバーはクライアントに自身の公開鍵を送信する。クライアントは、受け取った公開鍵と~/.ssh/known_hostsファイルに格納されているsshサーバーの公開鍵を比べることで、正しいホストかどうかを検証する。今回は初めての接続であり、~/.ssh/known_hostsファイルに接続先sshサーバーの公開鍵が格納されていなかったことが原因でwarが表示されている。
:::
> 参考：[当エラーについて](https://docs.github.com/ja/authentication/troubleshooting-ssh/error-host-key-verification-failed)

2.再接続してみる
   ssh-agentにより、秘密鍵のパスフレーズを入力せずにログインができた、以上。
```
 [root@localhost .ssh]# ssh root@10.2.149.12
Last login: Thu Apr 10 15:04:43 2025 from 10.0.15.101
```