authorized_keysファイルをチェックするツールを作った話


はじめに

背景

SSHと言えば公開鍵暗号を使った公開鍵認証 ( 参考: SSHの公開鍵ってなに? ) ですが、「鍵をサーバに登録したのにログインできない…」といったトラブルが後を絶ちません。

ということで、ふと次のようなことを思いました。

ということで、標題のようにチェックツールを作ってみたので、記事にすることにしました。

前提

今回、CentOS用のパッケージに手を入れる形でツールを作成しました。
CentOS 8.1.1911 + OpenSSH 8.0p1 ( openssh-8.0p1-4.el8_1 )

パッチファイルは以下のgithubリポジトリに置いています。
https://github.com/angel-p57/qiita-sample/tree/master/ssh-list-id

ツールについて

ツールの名称は"ssh-list-id" としました。
サーバの立場でauthorized_keysファイルに登録された鍵をリストアップする ( まずいことがあれば報告する ) ということで、openssh-serverパッケージに追加しています。

例えば、次のようにフィンガープリントが確認できるような鍵があったとして、

手元の鍵の確認例
$ ssh-keygen -l -f ~/.ssh/id_ed25519.pub 
256 SHA256:yD3nJEK03pb5kurpxt+Wy35sQifd8vPCF3PTSFx1nfQ angel@cent8 (ED25519)
$ ssh-keygen -l -f ~/.ssh/id_rsa.pub 
4096 SHA256:ryZbBuLbavSaEVEIEbAEuL2dgG/GnIiPyvtcMiXCtwk angel@cent8 (RSA)

それをサーバ上の authorized_keys に登録していれば、次のように一覧が出力されます。

ssh-list-idによる登録されている鍵のリストアップ
$ ssh-list-id
# authorized_keys file /home/angel/.ssh/authorized_keys:
line 1: SHA256:yD3nJEK03pb5kurpxt+Wy35sQifd8vPCF3PTSFx1nfQ
line 2: SHA256:ryZbBuLbavSaEVEIEbAEuL2dgG/GnIiPyvtcMiXCtwk

これにより、意図した通りに鍵が登録されているか、サーバ上で確認でき、実際にログインしてみないと分からないという不安定な状況を改善できるのではないか、ということです。

なお、ユーザに鍵登録を任せず管理者が行うような場面でも、rootユーザであれば、ユーザ名を指定して実行することができるようになっています。

ユーザ名指定実行
# ssh-list-id -u angel
# authorized_keys file /home/angel/.ssh/authorized_keys:
line 1: SHA256:yD3nJEK03pb5kurpxt+Wy35sQifd8vPCF3PTSFx1nfQ
line 2: SHA256:ryZbBuLbavSaEVEIEbAEuL2dgG/GnIiPyvtcMiXCtwk

そしてサーバの立場でという通り、sshdと同じロジックで、鍵のパーミッションのチェックも行ってくれます。例えば、次のようにファイル自身のパーミッションがまずければ、警告を出してくれます。
ログイン時に原因が分かりづらい鍵登録時の不備を事前にチェックできるということです。

パーミッション不備時
$ ls -l ~/.ssh/authorized_keys   # グループのw権が過剰→パーミッション不備
-rw-rw-r--. 1 angel angel 830  5月  7 23:10 /home/angel/.ssh/authorized_keys
$ ssh-list-id
# authorized_keys file /home/angel/.ssh/authorized_keys:
Authentication refused: bad ownership or modes for file /home/angel/.ssh/authorized_keys
some problems occurred to open file /home/angel/.ssh/authorized_keys

その他、サーバの立場でということから、実は内部的にサーバ設定ファイル ( デフォルトで /etc/ssh/sshd_config ) を読み込んで解釈してたりします。もしデフォルト以外の場合、-fで指定することも可能です。
※以下、undocumentedながら、用意しているオプションの一覧です。

Usage
$ ssh-list-id -h
unknown option -- h
usage: ssh-list-id [-v] [-V] [-B|-E md5|-E sha256] [-u user] [-f sshd_config]
                   [-a authorized_keys] [-C connection_spec]

パッケージ生成

パッケージ生成は、既存のソースRPMファイルにパッチをあてて行うようになっています。
詳しくは HOWTO.txtをご覧ください。

※念のためですが、作成したパッケージをご利用される場合、くれぐれも自己責任でお願いします。

おわりに

必要な機能は、既にOpenSSHのソースに一式揃っているので、いかに組み合わせて作るかに集中すれば良く、( ビルドを調整するために気を使う場面はあったものの ) 比較的楽に作ることができたと思います。
OpenSSHが登場してから随分と時間が経っているので、本ツールの機能には今更感もあるのですが、本家でもこういうの作らないのかな? とは思います。