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

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

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

工作HardwareHub ロゴ画像 (Laptop端末利用時)
工作HardwareHub ロゴ画像 (Mobile端末利用時)

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

モーダルを閉じる

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

モーダルを閉じる

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

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

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

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

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

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

公開日公開日
2018/08/08
最終更新最終更新
2021/10/07
記事区分記事区分
一般公開

目次

    推しはTypeScript

    0
    ステッカーを贈るとは?

    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
    
    0
    詳細設定を開く/閉じる
    アカウント プロフィール画像 (本文下)

    推しはTypeScript

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

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

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

    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