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
参考リンク
- SSH Emergency Access, Carl Tashian
- Using OpenSSH Certificate Authentication, Red Hat Enterprise Linux Deployment Guide
- How to SSH Properly, Gus Luxton
作者: wangdoc
アドレス: https://wangdoc.com/
ライセンス: クリエイティブ・コモンズ 3.0