SSH鍵 を 1Password で管理する


1Password にSSH鍵の管理機能があることを最近になって知ったので，その設定手順をメモとしてまとめます。

# 設定手順
## 0. SSHエージェントを有効にする
SSHクライアントが 1Password 内の鍵を使えるようにするため，1Password のSSHエージェントを有効にします。

このSSHエージェントは 1Password 内の鍵を使用しますが，明示的に許可しない限り，鍵が外部に出ることはありません。

1Password ケバブメニュー（︙）より設定画面を開きます。`Ctrl + ,`でも開けます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/bb8233ee-1af0-423f-9f2d-b40cbbc38726.png)

`[開発者]`タブより，`[SSHエージェントを使用]`にチェックをいれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/9255fedc-9f2f-430d-8414-1fa182b42e9d.png)



また，上項目の「1Password開発者エクスペリエンスを表示する」を有効化しておくと，サイドバーに開発者タブが出現します。このメニューではSSHエージェントが管理しているSSH鍵の一覧確認などが可能になります。

## 1. SSHクライアントの設定
SSHクライアント側でも，1Password を使用するように設定を行います。

### ・Macの場合
Macの場合，`.ssh/config`ファイルに以下を追記します。
```
Host XXXXXX
    ...
    IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
    ...
```

### ・Windowsの場合
Windowsの場合，Microsoft OpenSSH が固定のパイプを使うため，SSHエージェントの場所を指定する必要はありません。


ただし，1Password SSH エージェントが動作できるように，OpenSSH Authentication Agentサービスの確認，設定をします。

1. `Win + r`を押す
1. `services.msc`と入力して[OK]
1. 「OpenSSH」を探し，スタートアップの種類が「無効」になっていることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/a0d17bdc-1af2-4b1a-a8ae-ba0ebdc66812.png)
1. 無効になっていなければ，ダブルクリックして設定を開き「無効」に設定。

## 2. SSH鍵ペアを作成する

1Passwordのアプリを開き，`[＋新規アイテム]`→`[SSHキー]`を選択。
`[＋秘密鍵を追加]`から既存の鍵，または新しい鍵を登録。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/4dfc1252-a7fc-4204-ae1e-3a1799b9efda.png)


:::note warn
デフォルトでは，SSHエージェントはPrivate Vault内の鍵のみを認識します。そのため，ほかのVaultにある鍵を使用する際は，後述する設定ファイル`agent.toml`に別途設定を記述する必要があります。
:::

以下のコマンドで，SSH エージェントが認識している鍵を確認できます。

```:Windows (PowerShell)
$env:SSH_AUTH_SOCK = "\\.\pipe\openssh-ssh-agent"; ssh-add -l
```
```:Mac/Linux
SSH_AUTH_SOCK="$HOME/Library/Group Containers/2BUA8C4S2C.com.1Password/t/agent.sock" ssh-add -l
```


```: 実行例
PS C:\Users\koin3z> $env:SSH_AUTH_SOCK = "\\.\pipe\openssh-ssh-agent"; ssh-add -l
...
256 SHA256:A8kvTUp4SsvshwTjLnEECCUwxO++R5NJc3vPo9JUrGY my-sshkey (ED25519)
...
...
```

## 3. 接続確認
sshコマンドで接続すると，1Password の認証ポップアップが立ち上がり，認証を通過すると無事接続できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/2b470595-298c-4364-a9a5-723c607b4241.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/341d0ddb-5dd1-476b-b09d-ed521d2ef1f7.png)

# 補足

## ・認証における 6 Keys Limit
SSHエージェントは認証に有効な鍵を当てるまで，管理している鍵を１つづつサーバーに提示します。
SSHサーバーでは認証試行回数（`MaxAuthTries`）が６回に設定されていることが多いため，SSHエージェントが提示する鍵が多い場合，以下のエラーではねられることがあります。

```
Received disconnect from xx.xx.xx.xx port 22:2: Too many authentication failures
```
これを回避するために，`.ssh/config`やSSHエージェント設定ファイルを使用し，どのホストに対してどのSSH鍵を使用するかを関連付けます。

`.ssh/config`の設定では，公開鍵をダウンロードしローカルに配置した後，`IdentityFile`にパスを記載し，以下のような形式にします。

```:Macの場合
Host XXXXXX
    ...
    IdentityFile <公開鍵のパス>
    IdentitiesOnly yes
    IdentityAgent "~/Library/Group Containers/2BUA8C4S2C.com.1password/t/agent.sock"
    ...
```
また，Private Vault以外に鍵をおいている場合や，管理対象の鍵範囲を指定したい場合，SSHエージェントの設定ファイル`agent.toml`を編集します（次節参照）。

## ・SSHエージェントの設定ファイル
個人のVaultだけでなく，任意のVaultやアカウントの鍵をSSHエージェントに使用させたい場合，SSHエージェントの設定ファイルを編集します。


ファイルは 1Password アプリからも鍵画面から開くことができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761799/e2ac641d-2429-4c7b-ba01-b3bc31c98edc.png)


なお，設定ファイルの位置は以下の通りです。
```:Windows
%LOCALAPPDATA%/1Password/config/ssh/agent.toml
例）C:\Users\<user>\AppData\Local\1Password\config\ssh\agent.toml
```
```:Mac（以下の順に検索）
1. $XDG_CONFIG_HOME/1Password/ssh/agent.toml
2. ~/.config/1Password/ssh/agent.toml
```

`agent.toml`ファイルはTOML構文にて，`[[ssh-keys]]`ヘッダーと，その他３つの項目のうち１つ以上の設定が必要になります。

```
[[ssh-keys]]
item = "<アイテム名>"
vault = "<Vault名>"
account = "<アカウント名>"
```
なにか設定した場合，Private Vault 内の鍵が管理外になることがあるので，最後には`ssh-add -l`で対象の鍵が認識されていることを確認しておきます。 


# 参考リンク

+ [Get started with 1Password for SSH | 1Password Developer](https://developer.1password.com/docs/ssh/get-started/)
+ [SSH agent config file | 1Password Developer](https://developer.1password.com/docs/ssh/agent/config/)
+ [Advanced use cases | 1Password Developer](https://developer.1password.com/docs/ssh/agent/advanced/)