ウェブサイト検索

Ubuntuを使用してホストとクライアントを検証するSSH CAを作成する方法


ステータス: 廃止された

この記事では、もはやサポートされていないUbuntuのバージョンについて説明しています。現在、Ubuntu 12.04を実行しているサーバーを運営している場合は、サポートされているバージョンのUbuntuにアップグレードまたは移行することを強くお勧めします。

  • Ubuntu 14.04にアップグレードします。
  • Ubuntu 14.04からUbuntu 16.04へのアップグレード
  • サーバーデータをサポートされているバージョンに移行する

理由: Ubuntu 12.04は2017年4月28日にサポートが終了(EOL)し、もはやセキュリティパッチやアップデートを受けることはありません。このガイドはもはや維持されていません。

代わりに見る: このガイドは参考としてまだ役立つかもしれませんが、他のUbuntuリリースでは機能しない可能性があります。もし可能であれば、使用しているUbuntuのバージョンに対して書かれたガイドを使用することを強くお勧めします。最新のバージョンを見つけるには、ページ上部の検索機能を利用できます。

紹介

多くのユーザーがいる大量のサーバーを構成する際、インフラストラクチャのSSHアクセスを整えるのは複雑になることがあります。LDAPのような中央認証機関を実装する方法はいくつかありますが、時には過剰になることもあります。

SSHは実際に、サーバーとクライアントを認証するために証明書認証局を使用する機能を持っています。これは双方向で機能します。このシステムを使用することで、クライアントに対してホストを認証し、ホストの信頼性を確認できないという混乱したメッセージを回避することができます。また、クライアントをホストに対して検証することもでき、1か所で新しいSSHキーを登録し、組織全体でアクセスを許可することが可能です。

上記で説明した2つの方法で、これらの証明書を活用する方法について話し合います。これを3つのUbuntu 12.04 VPSインスタンスでデモします。1つはホストとして、もう1つはクライアントとして、そして3つ目は証明書認証局として機能します。

ホスト証明書の設定方法

私たちは、クライアントに対してサーバーの認証を行う証明書の設定から始めます。これにより、クライアントはサーバーの信頼性を疑うことなく、サーバーに接続できるようになります。

証明書認証局として使用するマシンから始めます。この例では、これを「auth.example.com」と呼びます。

署名キーの生成

まず、署名キーとして機能するいくつかのRSAキーを生成する必要があります。任意のユーザーを使用しても構いませんが、rootユーザーが良い考えかもしれません。「server_ca」と「server_ca.pub」というキーを作成します。これらは私たちのサーバーを認証するために使用されます。

ホームディレクトリにこれらのキーを作成しましょう:

cd ~
ssh-keygen -f server_ca

パスフレーズを作成するかどうかを尋ねられます。これは、万が一キーが悪意のある手に渡った場合に、キーに追加の保護層を追加します。これが完了すると、ホームディレクトリにプライベートキーとパブリックキーがあります。

ls
server_ca   server_ca.pub

ホストキーの署名

キーが手に入ったので、ホストキーの署名を始めることができます。

私たちは、証明書認証機関自体のホストキーに署名することから始めるべきです。これは、以下の構文を使用して行うことができます:

 ssh-keygen -s signing_key -I key_identifier -h -n host_name -V +52w host_rsa_key 

これが全て何を意味するのか一緒に見ていきましょう。

  • -s: これは私たちが作成した秘密鍵で、他のすべての鍵に署名するために使用します。
  • -I: これは証明書を識別するために使用される名前です。これは、証明書が認証に使用される際のログ目的で使用されます。
  • -h: これは、結果として得られる証明書をクライアントキーではなくホストキーとしてマークします。
  • -n: これは、この証明書に関連付けられた名前(ユーザーまたはホスト)を識別するために使用されます。
  • -V: これは証明書が有効な期間を指定します。この場合、証明書は1年後(52週間後)に期限切れになることを指定します。

その後、署名したいキーを指定します。

私たちの場合、独自のホストRSAキーに署名するために、次のような行を使用します。このサーバーを「host_auth_server」として識別します。署名キーを作成するときに使用したパスフレーズの入力を求められます。

ssh-keygen -s server_ca -I host_auth_server -h -n auth.example.com -V +52w /etc/ssh/ssh_host_rsa_key.pub
Signed host key /etc/ssh/ssh_host_rsa_key-cert.pub: id "host_auth_server" serial 0 for auth.example.com valid from 2014-03-20T12:25:00 to 2015-03-19T12:26:05

出力からわかるように、私たちの証明書は1年間有効です。それはサーバーホストキー(/etc/ssh/)と同じディレクトリに作成されており、名前は「ssh_host_rsa_key-cert.pub」です。

私たちが証明書機関そのものにホストキーに署名したので、クライアントに認証しようとしている別のSSHサーバーのホストキーに署名することができます。

SSHサーバーからホストキーをコピーします。このマシンを「sshserver.example.com」と呼びます。これをscpを使用して行うことができます。

cd ~
scp root@sshserver.example.com:/etc/ssh/ssh_host_rsa_key.pub .

さて、このファイルから証明書を上で使ったのと同じ方法で作成できます。新しいホストに署名するために、一部の値を変更する必要があります。

ssh-keygen -s server_ca -I host_sshserver -h -n sshserver.example.com -V +52w ssh_host_rsa_key.pub
Signed host key ssh_host_rsa_key-cert.pub: id "host_sshserver" serial 0 for sshserver.example.com valid from 2014-03-20T12:40:00 to 2015-03-19T12:41:48

さて、生成された証明書ファイルをホストにコピーする必要があります。再び、これにはscpを使用できます:

scp ssh_host_rsa_key-cert.pub root@sshserver.example.com:/etc/ssh/

その後、SSHサーバーの公開鍵と認証サーバーから証明書の両方を削除できます。

rm ssh_host_rsa_key.pub ssh_host_rsa_key-cert.pub

署名された証明書はすでに準備が整いましたので、これを使用するためにコンポーネントを設定するだけです。

ホスト証明書を使用するためのコンポーネントの設定

まず、私たちは作成した証明書ファイルを認識させるために、両方のサーバー(auth.example.com と sshserver.example.com)を継続する必要があります。

この2つのマシンの両方で、主要なSSHデーモンの設定ファイルを編集する必要があります。ssh_configファイルではなく、必ずsshd_configファイルを編集していることを確認してください:

sudo nano /etc/ssh/sshd_config

もし HostCertificate 行を見つけることができれば、それを修正してください。見つからない場合は、ファイルの下部にこれを追加してください。ホスト証明書ファイルへのパスを設定する必要があります:

HostCertificate /etc/ssh/ssh_host_rsa_key-cert.pub

作業が完了したら、ファイルを保存して閉じてください。

さて、これらの変更を反映させるためにSSHデーモンを再起動します:

sudo service ssh restart

設定しているホスト証明書のすべてのサーバーでこれを行ってください。

現在、私たちのサーバーは証明書を使用するように設定されていますが、クライアントはサーバーが提示する証明書を確認する方法を知りません。

クライアントマシン(以下「client.example.com」と呼ぶ)で、“~/.ssh/known_hosts” ファイルを開くか作成します:

nano ~/.ssh/known_hosts

サーバーの証明書エントリの設定に関係するエントリはすべて削除する必要があります。すべてを削除するのが最善かもしれません。

その後、ログイン中にホストが提供する証明書を確認するために使用する公開鍵を指定する特別なエントリを追加する必要があります。これを@cert-authorityで始めます。その後、適用されるドメインの制限を含めることができ、続いて、私たちがすべてに署名してきた公開証明書機関の鍵が続きます。

証明書認証局のマシンで、次のように入力することで公開証明書署名鍵を取得できます:

cat ~/server_ca.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

この情報を使用すると、あなたの~/.ssh/known_hostsファイルの行は次のように見えるはずです。

@cert-authority *.example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCxC+gikReZlWEnZhKkGzhcNeRD3dKh0L1opw4/LQJcUPfRj07E3ambJfKhX/+G4gfrKZ/ju0nanbq+XViNA4cpTIJq6xVk1uVvnQVOi09p4SIyqffahO9S+GxGj8apv7GkailNyYvoMYordMbIx8UVxtcTR5AeWZMAXJM6GdIyRkKxH0/Zm1r9tsVPraaMOsKc++8isjJilwiQAhxdWVqvojPmXWE6V1R4E0wNgiHOZ+Wc72nfHh0oivZC4/i3JuZVH7kIDb+ugbsL8zFfauDevuxWeJVWn8r8SduMUVTMCzlqZKlhWb4SNCfv4j7DolKZ+KcQLbAfwybVr3Jy5dSl root@auth

作業が完了したら、ファイルを保存して閉じてください。

今、クライアントからSSHサーバーに初めてアクセスする際(完全なホスト名を使用)、リモートホストを信頼するかどうか尋ねられることはないはずです。これは、ホストが証明書機関によって署名されたホスト証明書を提示しているためです。あなたは、known_hostsファイルを確認し、その証明書が正当であることを確認しました。

ユーザーキーの設定方法

ユーザーにサーバーの認証方法を学んだので、証明書機関を設定してユーザーをサーバーに認証させることもできます。

以前と同様に、このプロセスは私たちの証明書認証局サーバーで始まります。今回はユーザー証明書に署名するための新しい鍵のセットを生成する必要があります:

ssh-keygen -f users_ca

もう一度、誰かがアクセスできた場合にあなたのキーが保護されるように、パスフレーズを選択してください。

ユーザー認証を使用してログインを受け入れるようにサーバーを構成する

完了したら、ユーザーの認証を確認する必要がある各SSHサーバーに公開鍵をコピーする必要があります。これもいつものようにscpを使用して行います:

scp users_ca.pub root@sshserver.example.com:/etc/ssh/

私たちは、SSHサーバーのSSHデーモン設定を変更して、このキーを探す必要があります。

私たちの「sshserver.example.com」ホストで、設定ファイルを開いてください。

sudo nano /etc/ssh/sshd_config

下部、私たちのHostCertificate行の下に、私たちが今コピーしたファイルを参照する別の行を追加する必要があります:

TrustedUserCAKeys /etc/ssh/users_ca.pub

再度、これらの変更を適用するためにSSHデーモンを再起動する必要があります:

sudo service ssh restart

ユーザーログインキーの署名

サーバーがusers_caキーによって署名されたキーを信頼するように構成されたので、実際にユーザーの認証キーに署名する必要があります。この仕組みが機能するためにはそれが必要です。

まず、クライアントキーを証明書認証局サーバーにscpで転送する必要があります。証明書サーバーから、以下を入力してください:

 cd ~ scp username@client.example.com:/home/username/.ssh/id_rsa.pub . 

証明書のマシンにキーがあるので、今度は私たちのusers_caキーを使ってそれに署名できます。これは、以前にserver_caキーを使ってキーに署名したのと非常に似ていますが、今回はユーザーキーなので-hパラメーターを含めません。

私たちが望むコマンドは、このようなものです。「username」値を変更して、サインインするユーザーの名前を反映させ、管理を容易にしてください。

 ssh-keygen -s users_ca -I user_username -n username -V +52w id_rsa.pub 
 署名されたユーザーキー id_rsa-cert.pub: id "user_username" シリアル 0 for username 2014-03-20T14:45:00 から 2015-03-19T14:46:52 まで有効です 

キーの作成時に設定された users_ca パスフレーズの入力を求められます。今、私たちのディレクトリにはクライアントマシンに転送する必要のある id_rsa-cert.pub ファイルがあります。

 scp id_rsa-cert.pub username@client.example.com:/home/username/.ssh/ 

今、クライアントコンピュータから sshserver.example.com にログインすると、これまでこのユーザーとしてこのサーバーにログインしたことがない場合でも、認証情報の入力を求められることはないはずです。

結論

ホストキーとユーザーキーに署名することにより、ユーザーとサーバーの検証のためのより柔軟なシステムを作成できます。これにより、インフラ全体のための中央集権的な権限を設定し、サーバーをユーザーに、ユーザーをサーバーに対して検証できるようになります。

中央集権的な認証を作成する最も強力な方法ではないかもしれませんが、設定が簡単で、時間や構成を多く必要とせずに既存のツールを活用できます。また、証明書を確認するためにCAサーバーがオンラインである必要がないという利点もあります。

ジャスティン・エリングウッドによる

関連記事: