これは「コードを書いていて困ったときに、suinがチャットで質問に答えたり相談に乗るsuinのプログラミング相談室(仮)」で頂いた質問と僕の回答の要約です。
質問
管理するサーバ数が増えてきて、SSH秘密鍵の管理も大変になってきています。suinさんは、SSH鍵の管理をどうやっていますか?
suinの回答
サーバって何台くらいになりますか?僕はせいぜい20台〜30台くらいがマックスなので、参考にならないかもしれませんが、戦略として次の2つをやっています。
- 使う鍵を減らす
- ログイン情報をモジュール化する
鍵を減らす
鍵を減らすのは同じ公開鍵を使い回す方法です。僕はできるだけこれをしてますね。セキュリティと利便性のトレードオフでバランスを取る戦略です。サーバの運用ルールや、与えられた鍵でしかアクセスできないなどで、できないこともあります。
ログイン情報をモジュール化する
ログイン情報をモジュール化するのは、Include
を使ってます。~/.ssh/configにInclude */config
と書いておいて、プロジェクトごとにディレクトリを作って管理してます。こうしておくことの利点は、次のものがあります。
- プロジェクトが終了したり、担当から外れたときはディレクトリを削除すればスッキリする。
- プロジェクトのチームメイトにSSH接続情報を共有するとき~/.ssh/project_hoge/configを送ればいい。
Includeについては以前ブログに書いてます。待望の.ssh/configファイル分割がSSH 7.3から出来るようになったようです
ブログにはディレクトリ構成について詳しく書いてなかったので、実際どうやっているか具体的に説明します。
まず~/.ssh/config
はこの数行にしています。
Host *
UseKeychain yes
Include */config
次に、プロジェクトごとにディレクトリを作り、SSHログイン情報をまとめています。
├── config ... すべてのサーバに共通した設定を書くのと、*/configをIncludeする場所
├── id_ecdsa ... 使いまわす鍵
├── id_ecdsa.pub ... 使いまわす鍵
├── known_hosts
├── github ... プロジェクトごとにディレクトリを作り
│ ├── config ... プロジェクトごとにconfigファイルを置く
│ ├── id_ecdsa
│ └── id_ecdsa.pub
├── bitbucket
│ ├── config
│ ├── id_ecdsa
│ └── id_ecdsa.pub
├── projhoge
│ ├── config
│ └── id_rsa
├── projfuga
│ ├── config
│ └── id_rsa
...
たとえば、githubの接続情報だとこうなっています。
Host github github.com
HostName github.com
User git
IdentityFile ~/.ssh/github/id_ecdsa
開発プロジェクトの接続情報はこんな感じにまとめています。
Host example.*
IdentityFile ~/.ssh/projhoge/id_rsa
User alice
Port 2222
Host example.staging
HostName ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
Host example.production
HostName ec2-YY-YY-YY-YY.ap-northeast-1.compute.amazonaws.com
# SequelProでRDSにつなぐための踏み台サーバ
Host example.rdsgateway
HostName XX.XX.XX.XX
User ubuntu
Port 2233
# VPNサーバ
Host example.vpn
HostName ec2-XX-XX-XX-XX.ap-northeast-1.compute.amazonaws.com
User ubuntu
Port 2244
回答に対しての反応
ありがとうございます!僕の場合は公開鍵を使いまわす方法で管理する鍵を減らせそうです。Includeはプロジェクトごとに管理できるので、処分するときに一括で消せる点が魅力だと感じました。