私のSSH設定に使用する証明書ファイルをどのように生成しますか?

私のSSH設定に使用する証明書ファイルをどのように生成しますか?

私の~/.ssh/configファイルの設定は次のとおりです。

Host xxx
    HostName 127.0.0.1
    Port 2222
    User gigi
    ServerAliveInterval 30
    IdentityFile ~/blablabla
    # CertificateFile ~/blablabla-cert.pub

CertificateFileこれはうまく機能しますが、実際に使用したい場合はどのように生成するのか疑問に思います。たとえば、RSAキーなどを使用してすでに秘密鍵と公開鍵を生成しているとしますopenssl req -newkey rsa:2048 -x509 [...]

ベストアンサー1

SSHが使用する認証用の証明書モデルは、公開鍵認証方式の変形です。証明書を使用すると、各ユーザー(またはホスト)の公開鍵は認証局(CA)と呼ばれる別の鍵で署名されます。同じCAを使用して複数のユーザーまたはホストキーに署名できます。これにより、ユーザーまたはホストは、個々のユーザー/ホストキーを信頼するのではなく、単一のCAを信頼できます。これは認証モデルに対する変更であるため、証明書を実装するにはクライアント側とサーバー側の両方で変更が必要です。

また、SSLで使用される証明書(で生成された証明書openssl)は、SSHで使用される証明書とは異なります。 Security SEのQAでは、次のトピックについて説明します。SSLとSSHの違いは何ですか?OpenSSLとOpenSSH間のキー変換

次に、クライアントがSSH証明書を使用してサーバーにどのように接続するかが問題なので、その方法を見てみましょう。これマニュアルページssh-keygenいくつかの関連情報があります。

ssh-keygenユーザーまたはホスト認証に使用できる証明書を生成するためにキー署名がサポートされています。証明書は、公開鍵、一部のID情報、ゼロ個以上のサブジェクト(ユーザーまたはホスト)名、認証局(CA)キーで署名されたオプションのセットで構成されています。これにより、クライアントまたはサーバーは多くのユーザー/ホストキーを信頼するのではなく、CAキーのみを信頼し、証明書の署名を確認できます。 OpenSSH証明書は、ssl(8)で使用されているX.509証明書とは形式が異なりますが、形式がはるかに単純であることに注意してください。

ssh-keygenユーザーとホストの2種類の証明書がサポートされています。ユーザー証明書はサーバーに対してユーザーの識別情報を認証し、ホスト証明書はサーバーホストの識別情報に対してユーザーを認証します。ユーザー証明書の生成:

$ ssh-keygen -s /path/to/ca_key -I key_id /path/to/user_key.pub

生成された証明書はに配置されます /path/to/user_key-cert.pub

ホスト証明書には-h次のオプションが必要です。

$ ssh-keygen -s /path/to/ca_key -I key_id -h /path/to/host_key.pub

ホスト証明書がとして出力されます/path/to/host_key-cert.pub

ここで最初に必要なのはCAキーです。 CAキーは通常の秘密鍵と公開鍵のペアなので、通常どおりに生成します。

ssh-keygen -t rsa -f ca

この-f caオプションは、単に出力ファイル名を「ca」と指定します。これにより、ca(プライベートキー)とca.pub(公開キー)という2つのファイルが作成されます。

次に、CAの秘密鍵を使用してユーザー鍵に署名します(マニュアルの例を参照)。

ssh-keygen -s path/to/ca -I myuser@myhost -n myuser ~/.ssh/id_rsa.pub

~/.ssh/id_rsa-cert.pubこれにより、SSH証明書を含む新しいファイルが作成されます。この-sオプションはCAの秘密鍵へのパスを指定し、この-Iオプションはサーバー側に書き込まれる識別子を指定し、この-nオプションはサブジェクト(ユーザー名)を指定します。証明書の内容はを実行して確認できますssh-keygen -L -f ~/.ssh/id_rsa-cert.pub

この時点で、設定ファイル(〜/ .ssh / config)を自由に編集し、CertificateFile新しく生成された証明書を指すディレクティブを含めることができます。マニュアルに記載されているように、対応する秘密鍵を識別するには、このIdentityFileディレクティブも一緒に指定する必要があります。

最後にすべきことは、サーバーにCA証明書を信頼するように指示することです。 CA証明書の公開鍵をターゲットサーバーにコピーする必要があります。これは/etc/ssh/sshd_configファイルを編集してディレクティブを指定することによってTrustedUserCAKeys行われます。

TrustedUserCAKeys /path/to/ca.pub

完了すると、サーバーはSSHデーモンを再起動します。私のCentOSシステムでは、を実行してこれを実行したsystemctl restart sshd後、資格情報を使用してシステムにログインできます。ssh詳細フラグ()を使用して接続を追跡すると、-vサーバーに提供されている証明書とそれを受け入れたサーバーが表示されます。

ここで最後に注意すべき点は、同じCAキーで署名されたすべてのユーザーキーがターゲットサーバーで信頼されていることです。 CAキーへのアクセスは実際のシナリオで制御する必要があります。AuthorizedPrincipalsFileたとえば、サーバー側のアクセスを制限するために使用できるディレクティブもあります。よりsshd_config マニュアル詳細については。クライアント側では、より厳格な仕様で証明書を生成することもできます。よりSSH-keygen マニュアルこれらの詳細については。

おすすめ記事