モーダルを閉じる工作HardwareHub ロゴ画像

工作HardwareHubは、ロボット工作や電子工作に関する情報やモノが行き交うコミュニティサイトです。さらに詳しく

利用規約プライバシーポリシー に同意したうえでログインしてください。

authorized_keys/known_hosts ファイルを用いない SSH 公開鍵認証

モーダルを閉じる

ステッカーを選択してください

お支払い手続きへ
モーダルを閉じる

お支払い内容をご確認ください

購入商品
」ステッカーの表示権
メッセージ
料金
(税込)
決済方法
GooglePayマーク
決済プラットフォーム
確認事項

利用規約をご確認のうえお支払いください

※カード情報はGoogleアカウント内に保存されます。本サイトやStripeには保存されません

※記事の執筆者は購入者のユーザー名を知ることができます

※購入後のキャンセルはできません

SSH 認証においても HTTP サーバ等で利用するオレオレ (サーバ/クライアント) 証明書と同様に CA を利用できます。本ページでは CA は独自に構築します。

authorized_keys を用いないクライアント認証

SSH サーバ側の authorized_keys ファイルを更新する必要がないため管理も簡易化されます。共通の秘密鍵を複数人で使い回す必要もなくなります。

CA の構築 (サーバ側)

ssh-keygen -f ca
  • ca
  • ca.pub

秘密鍵と公開鍵の生成 (クライアント側)

ssh-keygen -f id_rsa.20180808
  • id_rsa.20180808
  • id_rsa.20180808.pub

公開鍵の署名 (サーバ側)

クライアントから渡された公開鍵を authorized_keys に書き込むのではなく CA の秘密鍵で署名します。

ssh-keygen -s ca -I my-key-id -n myuser,myuser2 -z 1 id_rsa.20180808.pub
  • id_rsa.20180808-cert.pub

-s で CA の秘密鍵を指定します。-I で署名対象の ID を決めて指定します。-z で後に失効できるように連番を付与します。-n でログイン可能なユーザを指定します。

$ ssh-keygen -Lf id_rsa.20180808-cert.pub
id_rsa.20180808-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com user certificate
        Public key: RSA-CERT SHA256:lQEUisUKgQ5O4MeGfT5qukh65/jXQppfwOEOX8p3ze0
        Signing CA: RSA SHA256:BRt1XBvnoBQuSBPltoZ+idQAVj4CDT5MlfTcc2Xf4YE
        Key ID: "my-key-id"
        Serial: 1
        Valid: forever
        Principals: 
                myuser
                myuser2
        Critical Options: (none)
        Extensions: 
                permit-X11-forwarding
                permit-agent-forwarding
                permit-port-forwarding
                permit-pty
                permit-user-rc

CA で署名された公開鍵を持つクライアントからの接続を許可するように設定 (サーバ側)

AuthorizedKeysFile での認証ができないように /dev/null に向けています。

sudo su -l
echo 'TrustedUserCAKeys /etc/ssh/ca.pub' >> /etc/ssh/sshd_config
echo 'AuthorizedKeysFile /dev/null' >> /etc/ssh/sshd_config
systemctl restart sshd.service
tailf /var/log/auth.log

サーバへの接続 (クライアント側)

どの鍵で認証できたかは以下のようなコマンドで確認できます。

ssh -v -i id_rsa.20180808 myuser@vagrant "echo" 2>&1 | egrep '(Trying private key|Authentication succeeded)'
  • 秘密鍵だけでなく署名された証明書が同じディレクトリに必要であることと id_rsa.20180808 id_rsa.20180808-cert.pub
  • 署名された証明書で許可されている Principals ユーザにのみログインできることに注意します。

known_hosts を用いないサーバ認証

初回接続であってもなりすましを防ぐことができます。

CA の構築 (サーバ側)

HTTP サーバの場合と同様に CA はクライアント認証の際に利用したものと同一である必要はありません。以下のように新規に CA を構築しても問題ありません。

ssh-keygen -f ca2
  • ca2
  • ca2.pub

秘密鍵と公開鍵の生成 (サーバ側)

HTTP サーバの場合と同様にインストール時に秘密鍵と公開鍵は生成されています。これを流用してみます。

$ ls /etc/ssh/*.pub
/etc/ssh/ssh_host_ecdsa_key.pub  /etc/ssh/ssh_host_ed25519_key.pub  /etc/ssh/ssh_host_rsa_key.pub

公開鍵の署名 (サーバ側)

$ sudo ssh-keygen -s ca2 -I vagrant-rsa -n `hostname`,127.0.0.1 -h /etc/ssh/ssh_host_rsa_key.pub
$ ssh-keygen -Lf /etc/ssh/ssh_host_rsa_key-cert.pub 
/etc/ssh/ssh_host_rsa_key-cert.pub:
        Type: ssh-rsa-cert-v01@openssh.com host certificate
        Public key: RSA-CERT SHA256:U465PTIllSzt4rUVr37wtGuEWWKTp0l94RHzuVkFB1E
        Signing CA: RSA SHA256:ymP0AS7hPKJ9raz3tS14e5YQeb52pMgLjInZFK2KBxg
        Key ID: "vagrant-rsa"
        Serial: 0
        Valid: forever
        Principals: 
                stretch
                127.0.0.1
        Critical Options: (none)
        Extensions: (none)

署名した証明書と秘密鍵の設定 (サーバ側)

sudo su -l
echo 'HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub' >>  /etc/ssh/sshd_config
echo 'HostKey /etc/ssh/ssh_host_rsa_key' >>  /etc/ssh/sshd_config
systemctl restart sshd.service
tailf /var/log/auth.log

CA を信頼させる (クライアント側)

echo "@cert-authority * `cat 'ca2.pub'`" >> ~/.ssh/known_hosts

接続確認 (クライアント側)

ssh -v -o "UserKnownHostsFile ~/.ssh/known_hosts" -o "StrictHostKeyChecking ask" vagrant

初回接続であっても yes/no を尋ねられることなく、以下のような出力が確認できれば成功です。

debug1: Found CA key in /Users/username/.ssh/known_hosts:12
debug1: ssh_rsa_verify: signature correct
Likeボタン(off)0
詳細設定を開く/閉じる

記事の執筆者にステッカーを贈る

有益な情報に対するお礼として、またはコメント欄における質問への返答に対するお礼として、 記事の読者は、執筆者に有料のステッカーを贈ることができます。

>>さらに詳しくステッカーを贈る
ステッカーを贈る コンセプト画像

Feedbacks

Feedbacks コンセプト画像

    ログインするとコメントを投稿できます。

    ログインする

    関連記事

    • 使い所が難しいマイナーな運用コマンド
      コマンドのエイリアスを登録する (update-alternatives) mybin という名前のコマンドを登録 sudo update-alternatives --install /usr/local/bin/mybin mybin /usr/bin/echo 10 sudo update-alternatives --install /usr/local/bin/mybin mybin /...
      けんちゃんけんちゃん12/1/2022に更新
      いいねアイコン画像0
    • ipコマンドの基本的な使い方
      ネットワーク関連のコマンドはたくさんあります。しかしながら、その一部は ip コマンドに集約できます。 基本形 ("man ip" より抜粋) $ ip OBJECT COMMAND OBJECT: link, neigh, addr, route (等) COMMAND: show, add, delete (等) データリンク層のネットワークデバイス情報 (ifconfigコマンドの代用) M...
      こもれびさんこもれびさん3/8/2017に更新
      いいねアイコン画像0
    • プロセス関連のコマンド
      サムネイル画像-7b5901f600
      プロセスID関連 (ps, pgrep, pkill) 全プロセスを表示するためには $ ps ax とすればよく、その表示を見やすくするためには "u" と "w" を追加して $ ps auxw とすればよいです。表示件数自体は同じです。そのうち特定のコマンドのプロセスIDだけを表示したい場合は $ ps ax | grep 'my_script' | grep -v grep | awk '...
      kenken12/27/2021に更新
      いいねアイコン画像0
    • rpmとyumのチートシート
      サムネイル画像-f69c6665b8
      rpm (RedHat Package Manager または RPM Package Manager) はRedHat系のパッケージ管理ツールで、yum (Yellowdog Updater Modified) は内部的にrpmを実行するメタパッケージ管理ツールです。rpmには柔軟性がありyumには利便性があります。 rpmは "rpmパッケージファイル" があれば何でもインストールできますが、...
      まるたんまるたん3/2/2022に更新
      いいねアイコン画像0
    • メモリおよびディスクリソースを調査するために便利なコマンドおよび周辺知識
      メモリ使用量を表示 (free) 既定ではキロバイト単位で表示されます。オプション "-b", "-k", "-m", "-g" を付与して実行するとそれぞれバイト、キロ、メガ、ギガで表示されます。 $ free total used free shared buffers cached Mem: 510824 ...
      しおまめしおまめ9/30/2017に更新
      いいねアイコン画像0