ssh-agentのすゝめ

# ssh-agentのすゝめ

ssh-agentは大体のsshクライアントに付属されている鍵管理ツールです。結構昔からある気がしますが、時代とともに忘れ去れてる気がするのでまとめておきます。
Bastion(踏み台)経由の多段SSHが楽になるし、proxyCommandを~/.ssh/configを書きなぐらなくてよくなります。
焦ってBastionに鍵を置いちゃうなんていう手抜きをしなくて済みますよ。

# TL;DR

3OSでのopensshインストール方法とそのあとの設定方法を記載しています。


# インストール

一番末端のクライアントに入れます。（ふつうは自端末かな？）

## Windowsの場合

1. OpenSSHクライアントを有効にします。
2. サービスの`OpenSSH Authentication Agent`を自動起動にする。

これの通りで問題なし。
https://qiita.com/akiakishitai/items/9e661a126b9c6ae24a56

## Macの場合

最近のMacOSの場合以下の手順で設定する.

- `~/.ssh/config` に `UseKeychain yes`,`AddKeysToAgent yes` を設定する。
- `ssh-add -K`
  - デフォルトは `/Users/${username}/.ssh/id_rsa` をKeyChain Accessに登録する
  - デフォルト以外を使う場合は引数に追加する `ssh-add -K [/path/to/id]`

https://qiita.com/satoruk/items/de24deaa10e9c8241e48#%E8%A8%AD%E5%AE%9A

## Linux(WSL)の場合

opensshのクライアントが入っていればOKです。（ふつうはデフォルトで入ってる）

# 設定手順

1. 自端末で鍵を作ります。すでにある人はそれで。
2. Bastionとターゲットの `~/.ssh/authorized_keys` に登録します。(別ユーザーsshしてやる)
3. 自端末でssh-agentを起動させます。``` eval `ssh-agent` ``` Serviceの自動起動できてる人は必要なし。
4. 自端末で `ssh-add 鍵ファイル` します。（複数いけます
5. ssh -A xxx でサーバに接続します。-Aで `ssh-add -l` で出てくる鍵を上から順に試します。

-Aを入れるのがめんどくさい人は
~/.ssh/config に `ForwardAgent yes` を追加します。
Bastionのrootユーザーに悪いやつがいるとその先で乗っ取られるので、そういう環境にいる人はhost毎に設定したほうがいいと思います。（環境を何とかするんだ）

※注意事項
`ForwardAgent yes` は、下記のようにHostの下に書かないと機能しないっぽいので注意。(Hostを * とすると全体となるハズ。

```
Host xxx
  ForwardAgent yes
```


# 確認

`ssh-add -L` で利用する鍵の公開鍵一覧を見れます。-lだとフィンガープリントがでる。

```
[derori@murata ~]$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGa8KIhyYreW9GxW1Y+fzVo07Hy2ca/4ffnuJ2mrfjUr First key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDRSbSkJBU5sJujSanjbcCgcOFIr+KPI0Ed1NzOalkax 2nd key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFjRoj8NUOwadeJr23O6cB0wXF8jqufAnS5LSc1QaqsL 3rd key
```


これは中間サーバでも見ることができます。(ForwardAgent yes にした次のホストまでこうなる。)
↓の場合、192.168.0.206まで。192.168.0.203ではssh-agentは起動しない。192.168.0.33でしか`ForwardAgent yes`にしていない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/56925/e8fc1c52-494c-04c8-42a8-07e492eaad54.png)


```
[derori@192.168.0.33 ~]$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGa8KIhyYreW9GxW1Y+fzVo07Hy2ca/4ffnuJ2mrfjUr First key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDRSbSkJBU5sJujSanjbcCgcOFIr+KPI0Ed1NzOalkax 2nd key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFjRoj8NUOwadeJr23O6cB0wXF8jqufAnS5LSc1QaqsL 3rd key
[derori@192.168.0.33 ~]$ ssh deroru@192.168.0.206

Last login: Tue Nov 10 17:12:08 2020 from 192.168.0.33
[deroru@192.168.0.206 ~]$ ssh-add -L
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGa8KIhyYreW9GxW1Y+fzVo07Hy2ca/4ffnuJ2mrfjUr First key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDRSbSkJBU5sJujSanjbcCgcOFIr+KPI0Ed1NzOalkax 2nd key
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFjRoj8NUOwadeJr23O6cB0wXF8jqufAnS5LSc1QaqsL 3rd key
[deroru@192.168.0.206 ~]$ ssh deropi@192.168.0.203

Last login: Tue Nov 10 17:26:42 2020 from 192.168.0.206
[deropi@192.168.0.203 ~]$ ssh-add -L
Could not open a connection to your authentication agent.
```


# Tips

- 自端末って普通は電源を切るので、毎度ssh-addするのめんどくさいですよね。下記のように `~/.bashrc` に登録しています。

```
eval `ssh-agent`
ssh-add ~/.ssh/xxxxxxx
ssh-add ~/.ssh/xxxxxxx
```

Windowsだと大丈夫な気がする。

- BastionのsshdがAllowAgentForwarding yesとなっている必要がある。
- gitの鍵が複数ある場合にはどうにもならないので、~/.ssh/configにホストを分けて書くか `GIT_SSH_COMMAND` で渡す。https://blog.dnpp.org/git_environment
- macの場合Keychainに登録できて、それで管理できるらしい。
- 中間やターゲットでtmuxを貼っている場合、ssh-agentが渡している鍵ファイルのsymlinkと環境変数がずれておかしくなるので、~/.bashrc等で張り替えてあげる。 https://qiita.com/sonots/items/2d7950a68da0a02ba7e4
- `ssh-add -D` で全消しできます。-d で個別です。

これで、~/.ssh/config にProxyCommandを毎度毎度書く必要はなくなりますね。（書けばいいじゃん）
ちょっと雑になっちゃいましたが、鍵ファイルを散りばめてしまうリスクを減らしましょうというお話でした。