SSH 証明書ログイン

SSHはサーバーログインツールであり、一般的にはパスワードログインまたはキーログインが使用されます。

ただし、SSH には、証明書ログインという 3 番目のログイン方法があります。場合によっては、より合理的で安全なログイン方法であるため、この記事ではこのログイン方法を紹介します。

非証明書ログインの欠点

パスワード ログインとキー ログインにはそれぞれ欠点があります。

パスワードログインはサーバーのパスワードを入力する必要があり、非常に面倒かつ安全ではなく、総当たりで解読される危険性があります。

キーログインでは、サーバーがユーザーの公開キーを保存し、ユーザーがサーバーの公開キーのフィンガープリントを保存する必要があります。これは、複数のユーザーと複数のサーバーを備えた大規模な組織にとって、従業員が退職した場合、各サーバーからその公開キーを削除する必要があるため、非常に不便です。

証明書ログインとは何ですか?

証明書ログインは、上記の欠点を解決するように設計されています。これにより、信頼できるサーバーにサーバー証明書を発行し、信頼できるユーザーにユーザー証明書を発行する認証局 (CA) が導入されます。

ログインする際、ユーザーとサーバーは事前に互いの公開鍵を知る必要はなく、それぞれの証明書を交換し、それらが信頼できるかどうかを確認するだけで済みます。

証明書ログインには 2 つの主な利点があります。 (1) ユーザーとサーバーは公開キーを交換する必要がないため、管理が容易になり、スケーラビリティが向上します。 (2) 証明書には有効期限を設定できますが、公開鍵には有効期限がありません。さまざまな状況に応じて、証明書の有効期間を短く設定して、セキュリティをさらに向上させることができます。

証明書のログインプロセス

SSH 証明書を使用してログインする前に、証明書をまだ持っていない場合は生成する必要があります。具体的な方法は次のとおりです。(1) ユーザーとサーバーの両方が公開キーを CA に送信します。(2) CA はサーバーの公開キーを使用してサーバー証明書を生成し、それをサーバーに送信します。ユーザーの証明書を生成するためのユーザーの公開キーがユーザーに発行されます。

証明書を取得すると、ユーザーはサーバーにログインできるようになります。プロセス全体は、ユーザーが意識することなく SSH によって自動的に処理されます。

最初のステップでは、ユーザーがサーバーにログインすると、SSH はユーザー証明書をサーバーに自動的に送信します。

2 番目のステップでは、サーバーはユーザー証明書が有効かどうか、および信頼された CA によって発行されたかどうかを確認します。検証後、ユーザーは信頼できると判断されます。

3 番目のステップでは、SSH がサーバー証明書をユーザーに自動的に送信します。

4 番目のステップでは、ユーザーはサーバー証明書が有効かどうか、および信頼された CA によって発行されたかどうかを確認します。検証後、サーバーは信頼できると判断されます。

ステップ 5: 両者は接続を確立し、サーバーはユーザーのログインを許可します。

CA キーを生成する

証明書ログインの前提条件は CA が存在することです。CA は基本的にキーのペアであり、CA はこのキーのペアを使用して証明書を発行します。

CA は同じキーのペアを使用してユーザー証明書とサーバー証明書を発行できますが、セキュリティと柔軟性を考慮すると、異なるキーを使用して別々に発行することが最善です。したがって、CA には少なくとも 2 つのキーのペアが必要です。1 つのペアはuser_caと呼ばれるユーザー証明書を発行するためのキーであり、もう 1 つのペアはhost_caと呼ばれるサーバー証明書を発行するためのキーです。

次のコマンドを使用してuser_caを生成します。

# CA がユーザー証明書を発行するためのキーを生成する
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user_ca -C user_ca

上記のコマンドは、~/.ssh ディレクトリにキーのペア、user_ca (秘密鍵) と user_ca.pub (公開鍵) を生成します。

このコマンドの各パラメータの意味は以下のとおりです。

  • -t rsa: 鍵アルゴリズム RSA を指定します。
  • -b 4096: 指定されたキーのビット数は 4096 ビットです。セキュリティ要件が高くない状況では、この値は小さくてもかまいませんが、1024 未満であってはなりません。
  • -f ~/.ssh/user_ca: 生成されるキーの場所とファイル名を指定します。
  • -C user_ca: キーの識別文字列を指定します。コメントに相当し、任意に設定できます。

次のコマンドを使用してhost_caを生成します。

# CA がサーバー証明書を発行するためのキーを生成する
$ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca

上記のコマンドは、~/.ssh ディレクトリにキーのペア、host_ca (秘密鍵) と host_ca.pub (公開鍵) を生成します。

~/.ssh ディレクトリには少なくとも 4 つのキーが含まれているはずです。

  • ~/.ssh/user_ca
  • ~/.ssh/user_ca.pub
  • ~/.ssh/host_ca
  • ~/.ssh/host_ca.pub

CA がサーバー証明書を発行します

CA を取得したら、サーバー証明書を発行できます。

証明書を発行するには、CA のキーに加えて、サーバーの公開キーも必要です。一般に、SSH サーバー (通常は sshd) がインストールされると、キー /etc/ssh/ssh_host_rsa_key が生成されます。そうでない場合は、次のコマンドを使用して生成できます。

$ sudo ssh-keygen -f /etc/ssh/ssh_host_rsa_key -b 4096 -t rsa

上記のコマンドは、/etc/ssh ディレクトリに ssh_host_rsa_key (秘密鍵) と ssh_host_rsa_key.pub (公開鍵) を生成します。次に、サーバー公開キーssh_host_rsa_key.pubを CA が配置されているサーバーにコピーまたはアップロードする必要があります。

アップロード後、CA はキーhost_caを使用して、サーバーの公開キーssh_host_rsa_key.pubのサーバー証明書を発行できます。

$ ssh-keygen -s host_ca -I host.example.com -h -n host.example.com -V +52w ssh_host_rsa_key.pub

上記のコマンドは、サーバー証明書 ssh_host_rsa_key-cert.pub (サーバーの公開キー名にサフィックス -cert を加えたもの) を生成します。このコマンドの各パラメータの意味は以下のとおりです。

  • -s: CA が証明書を発行するために使用するキーを指定します。
  • -I: 任意に設定できる ID 文字列。証明書の識別を容易にするためのコメントに相当します。この文字列は、将来証明書を取り消すために使用できます。
  • -h: 証明書がユーザー証明書ではなくサーバー証明書であることを指定します。
  • -n host.example.com: サーバーのドメイン名を指定し、証明書がこのドメイン名に対してのみ有効であることを示します。複数のドメイン名がある場合は、カンマで区切ってください。ユーザーがドメイン ネーム サーバーにログインすると、SSH は証明書の値を使用して、サーバーの信頼性を証明するためにどの証明書をユーザーに発行するかを決定します。
  • -V +52w: 証明書の有効期間を指定します。ここでは 52 週間 (1 年) です。デフォルトでは、証明書は永久に有効です。このパラメータを使用して有効期間を指定することをお勧めします。有効期間は 52 週間以内に短くする必要があります。
  • ssh_host_rsa_key.pub: サーバーの公開鍵。

証明書を生成した後、次のコマンドを使用して証明書の詳細を表示できます。

$ ssh-keygen -L -f ssh_host_rsa_key-cert.pub

最後に、証明書の権限を設定します。

$ chmod 600 ssh_host_rsa_key-cert.pub

CA がユーザー証明書を発行します

次に、CA を使用してユーザー証明書を発行します。現時点では、ユーザーの公開キーが必要です。そうでない場合、クライアントは次のコマンドを使用してキーのペアを生成できます。

$ ssh-keygen -f ~/.ssh/user_key -b 4096 -t rsa

上記のコマンドは、user_key (秘密鍵) と user_key.pub (公開鍵) を ~/.ssh ディレクトリに生成します。

次に、ユーザー公開キーuser_key.pubを CA サーバーにアップロードまたはコピーします。次に、CA のキー user_ca を使用して、ユーザーの公開キー user_key.pub のユーザー証明書を発行できます。

$ ssh-keygen -s user_ca -I user@example.com -n user -V +1d user_key.pub

上記のコマンドは、ユーザー証明書 user_key-cert.pub (ユーザー公開キー名とサフィックス -cert) を生成します。このコマンドの各パラメータの意味は以下のとおりです。

  • -s: CA が証明書を発行するために使用するキーを指定します。
  • -I: 任意に設定できる ID 文字列。証明書の識別を容易にするためのコメントに相当します。この文字列は、将来証明書を取り消すために使用できます。
  • -n user: ユーザー名を指定し、証明書がこのユーザー名に対してのみ有効であることを示します。ユーザー名が複数ある場合は、カンマで区切ってください。ユーザーがこのユーザー名でサーバーにログインすると、SSH はこの値を使用して、ユーザーの身元を証明するためにどの証明書を使用するかを決定し、それをサーバーに送信します。
  • -V +1d: 証明書の有効期間を指定します。ここでは 1 日で、セキュリティを向上させるためにユーザーは毎日証明書を申請する必要があります。デフォルトでは、証明書は永久に有効です。
  • user_key.pub: ユーザーの公開鍵。

証明書を生成した後、次のコマンドを使用して証明書の詳細を表示できます。

$ ssh-keygen -L -f user_key-cert.pub

最後に、証明書の権限を設定します。

$ chmod 600 user_key-cert.pub

サーバーインストール証明書

CA はサーバー証明書 ssh_host_rsa_key-cert.pub を生成した後、証明書をサーバーに送り返す必要があります。次の scp コマンドを使用して証明書をコピーできます。

$ scp ~/.ssh/ssh_host_rsa_key-cert.pub root@host.example.com:/etc/ssh/

次に、サーバー設定ファイル /etc/ssh/sshd_config に次の行を追加します。

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

上記のコードは、サーバー証明書がどのファイルであるかを sshd に伝えます。

sshdを再起動します。

$ sudo systemctl restart sshd.service
# または
$ sudo service sshd restart

サーバーインストール CA 公開キー

サーバーがユーザー証明書を信頼するには、CA が発行したユーザー証明書の公開キー user_ca.pub をサーバーにコピーする必要があります。

$ scp ~/.ssh/user_ca.pub root@host.example.com:/etc/ssh/

上記のコマンドは、CA が発行したユーザー証明書の公開キー user_ca.pub を SSH サーバーの /etc/ssh ディレクトリにコピーします。

次に、サーバー設定ファイル /etc/ssh/sshd_config に次の行を追加します。

TrustedUserCAKeys /etc/ssh/user_ca.pub

上記のアプローチは、user_ca.pub/etc/ssh/sshd_config に追加することです。これはグローバルな効果をもたらします。つまり、サーバー上のすべてのアカウントが、user_ca によって発行されたすべてのユーザー証明書を信頼するようになります。

もう 1 つの方法は、サーバー上のアカウントの ~/.ssh/authorized_keys ファイルに user_ca.pub を追加して、そのアカウントのみが user_ca によって発行されたユーザー証明書を信頼できるようにすることです。具体的な方法は、~/.ssh/authorized_keys を開き、@cert-authority printers="..." で始まる行を追加してから、user_ca.pub のコンテンツを追加することです。続く。

@cert-authority プリンシパル = "ユーザー" ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上記のコードでは、principals="user" でユーザーがログインするためのサーバー アカウント名を指定します。これは通常、authorized_keys ファイルが配置されているアカウントです。

sshdを再起動します。

$ sudo systemctl restart sshd.service
# または
$ sudo service sshd restart

この時点で、SSH サーバーはuser_caによって署名された証明書を信頼するように構成されています。

クライアントインストール証明書

クライアントへのユーザー証明書のインストールは非常に簡単です。ユーザー証明書 user_key-cert.pub を CA からクライアントにコピーし、それをユーザーのキー user_key と同じディレクトリに保存するだけです。

クライアントは CA 公開キーをインストールします

クライアントがサーバー証明書を信頼するには、CA によって発行されたサーバー証明書の公開キー host_ca.pub をクライアントの /etc/ssh/ssh_known_hosts ファイル (グローバル レベル) または ~/ .ssh/known_hosts ファイル (ユーザー レベル)。

具体的な方法は、ssh_known_hosts または known_hosts ファイルを開き、@cert-authority *.example.com で始まる行を追加して、host_ca.pub ファイルの内容 (つまり、パブリックkey) その後ろには、おそらくこんな感じです。

@cert-authority *.example.com ssh-rsa AAAAB3Nz...XNRM1EX2gQ==

上記のコードでは、*.example.comはドメイン名のパターン一致です。これは、サーバーがパターンのドメイン名と一致し、サーバー証明書を発行した CA が指定された公開鍵と一致する限りを意味します。後で、それは信頼できるようになります。ドメイン名の制限がない場合は、ここに*を記述できます。複数のドメイン名パターンがある場合は、カンマを使用して区切ることができます。サーバーにドメイン名がない場合は、ホスト名 (host1、host2、host3など) または IP アドレス (11.12など) を使用できます。 .13.14、21.22.23.24`)。

その後、証明書を使用してリモート サーバーにログインできるようになります。

$ ssh -i ~/.ssh/user_key user@host.example.com

上記のコマンドの -i パラメータは、ユーザーのキーを指定するために使用されます。証明書がキ​​ーと同じディレクトリにある場合、サーバーへの接続時に証明書が自動的に使用されます。

##証明書を取り消す

証明書の失効操作は、ユーザー証明書の失効とサーバー証明書の失効の 2 種類に分かれます。

サーバー証明書を取り消すには、ユーザーはknown_hostsファイル内の@cert-authorityコマンドの対応する行を変更または削除する必要があります。

ユーザー証明書を取り消すには、サーバー上に新しい /etc/ssh/revoked_keys ファイルを作成し、次の内容を含む行を構成ファイル sshd_config に追加する必要があります。

RevokedKeys /etc/ssh/revoked_keys

revoked_keysファイルには、信頼されなくなったユーザーの公開鍵が保持されており、次のコマンドによって生成されます。

$ ssh-keygen -kf /etc/ssh/revoked_keys -z 1 ~/.ssh/user1_key.pub

上記のコマンドでは、-zパラメータを使用して、ユーザーの公開鍵がrevoked_keysファイルのどの行に保存されるかを指定します。この例では、行 1 に保存されます。

後で他のユーザーの公開キーを取り消す必要がある場合は、次のコマンドを使用して 2 行目に保存できます。

$ ssh-keygen -ukf /etc/ssh/revoked_keys -z 2 ~/.ssh/user2_key.pub

参考リンク


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0