はじめに
背景
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
# 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ながら、用意しているオプションの一覧です。
$ 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が登場してから随分と時間が経っているので、本ツールの機能には今更感もあるのですが、本家でもこういうの作らないのかな? とは思います。