綺麗に死ぬITエンジニア

SSHの公開鍵配布を簡単にやる

2017-01-26

SSHの鍵管理とその配布、皆さんはどのようにやってますでしょうか。

これまでの経験上、SSHキーの運用方法は、各企業やユーザーの風土・文化によって異なっていました。1つのキーを全てのサーバー・ユーザーで使い回す企業もあれば、各サーバーごとにキーを用意して使い回すとこもあり、中にはずさんな管理をしているところも少なくないと思います。

ずさんな管理をしてしまう原因、それは「ちゃんとした管理・運用は面倒くさい」というイメージからだと思います。

しかし、きちんと手順さえ構築してしまえば、そんなに難しいことではないので、ここで一つ、私の普段やっている手法をまとめてみたいと思います。

最も一般的でかつ安全な運用方法

通常、SSHでは、接続したいサーバー側に公開鍵、接続するクライアント(自分のPC)に秘密鍵を配置して接続します。

秘密鍵と公開鍵のペアを作成後、公開鍵を接続したいサーバーの~/.ssh/authorized_keys(接続に利用するユーザーのホームディレクトリ)へ記述します。その状態で、その公開鍵に対応した秘密鍵を~/.ssh/id_rsaへ配置して、sshコマンドを利用することにより、接続できるようになります。

Windowsの場合はSSHクライアントで鍵を指定する必要があったり、違うパスに鍵を配置する場合は設定ファイルやオプションでパスを指定する必要があったりしますが、仕組みは同じです。

このとき、一番流出してはならないのが「秘密鍵」です。逆を言えば、「公開鍵」はその名の通り、公開されていても何も問題はありません。

なので通常は、クライアント側で秘密鍵と公開鍵のペアを作成し、サーバー側へ公開鍵だけを配置する、というのが最も安全で一般的な手法です。

秘密鍵を複数の人間で共有してやりとりをするのは、それだけ流出の恐れが増えますから、やるべきではありません。秘密鍵をインターネット上や複数のコンピューター上に流れるということは、それだけでリスクなのです。作成した秘密鍵はローカルから複製せず、触らずにいることが最も安全です。もちろん、マルウェアに感染した際は安全ではありませんので、ローカル環境の保護は必須ですが。

なので、秘密鍵と公開鍵のペアは1人1つの運用が最も効率的で安全な運用方法と言えます。つまりメンバー一人一人が、自分だけの秘密鍵と公開鍵のペアを作成しておき、接続したいサーバーへ公開鍵を配布します。

面倒な公開鍵の配布を簡素化する

このとき面倒なのが、新規にサーバーを構築した際に、~/.ssh/authorized_keysへ参加者全員の公開鍵を集めなければならないという点です。

単に全員の公開鍵を集めてどこかに配置しておくのもいいですが、少し面倒です。もしそれで、コピペで運用するようになってしまったら、ヒューマンエラーで貼り付け間違えたりして、場合によっては重大な事態を引き起こしかねません。

そこで私は「公開鍵は公開しても大丈夫」という特性を活かして、Webサーバーで公開するようにしています。

特定のWebサーバーへ公開鍵を配置し、https://keys.example.com/moriyama/id_rsa.pubなどといったURLでアクセスできるようにしておけば、接続したいサーバー上で以下のコマンドを叩くだけで接続できるようになります。

curl -sS https://keys.example.com/moriyama/id_rsa.pub >> ~/.ssh/authorized_keys

これが結構便利で、コマンド一つで設定でき、ヒューマンエラーもなくなるので、この手法は非常に重宝しています。

そしてこの手法の最も良い点は、GitHubの利用者ならば、すぐに利用できるという点です。つまり、GitHubを既に利用していて、既に自分の公開鍵をGitHubへ登録している人は、何の手間もなくこの手法を使えるのです。

GitHubでは、ユーザーページのURLの後ろに.keysをつけると、そのユーザーの公開鍵が取得できます。私の場合であれば、https://github.com/n0f.keysです。

GitHubで日頃開発している組織や、そうでなくとも社員ではない外注の人間が参画する場合等には非常に役に立つことではないかと思います。

こうしておくことで、新規にサーバーを構築する際も、そのサーバー上で、

curl -sS https://keys.example.com/sato/id_rsa.pub >> ~/.ssh/authorized_keys
curl -sS https://keys.example.com/suzuki/id_rsa.pub >> ~/.ssh/authorized_keys
curl -sS https://keys.example.com/takahashi/id_rsa.pub >> ~/.ssh/authorized_keys
curl -sS https://github.com/n0f.keys >> ~/.ssh/authorized_keys

とコマンドを打てばみんなログインできるようになりますし、秘密鍵が盗難にあったり、組織から抜ける人間がいる際も、該当行を削除するか、コマンドを打ち直すことで対応できるようになります。

まとめ

「公開鍵を公開してしまう」という方法は、何気に便利な場面が多いです。

シェルスクリプトやcronなどを使って工夫すれば、もっと応用的な鍵運用へ発展させることもできますので、ぜひこのような運用をしてみてはいかがでしょうか。

なお、注意点として、「公開鍵を公開してしまう」というのは、きちんとセキュリティ強度のある鍵だからこそなせる技です。

RSA/DSAであれば、2048bit以上の鍵長は必要です。できれば4096bitで作るのが望ましいでしょう。以下のコマンドで作成できます。

ssh-keygen -t rsa -b 4096 -C "user@example.com"

これを機に、安全で効率的な鍵運用について、検討してみてはいかがでしょうか。