証明書とCAユーザ認証を行うホスト認証を行うおわりに「これは2015年5月17日以前にアカウント登録されたお客様向けの記事です。導入OpenSSHはUNIX系サーバのリモートログインの手段として、幅広く使われています。ConoHaのVPSでも、起動したVPSではOpenSSHが動作していて、コントロールパネルからダウンロードした秘密鍵を使用してVPSにログインすることができます。サーバの管理をする場合、OpenSSHはほぼ必須と言っていいでしょう。今回はOpenSSHの認証方式の一つである、証明書による認証を紹介します。この方式はバージョン5.4からサポートされました。OpenSSHの認証によく使われるのはパスワード認証と公開鍵認証かと思いますが、証明書を使用した認証はまだあまり一般的ではないように思います。詳細は後ほど解説しますが、証明書による認証は、CA(認証局)の鍵を信用し、CAによって署名された証明書を持つユーザ/ホストを認証する方式です。パスワード認証や公開鍵認証のように、ユーザ/ホストを個別に認証する必要がなくなります。証明書というとSSL証明書の発行を想像される方も多いと思いますが、技術的な仕組みは非常によく似ています。よる認証ユーザ認証ユーザの公開鍵をサーバ上のauthorized_keysファイルに追加する。サーバは乱数を生成し、ユーザの公開鍵で暗号化し送信。ユーザは暗号鍵で復号し乱数のハッシュ値を計算、それをサーバに送信。サーバはハッシュ値を照合する。ユーザの公開鍵にCAが署名をする。サーバはCAの公開鍵を保持する。ユーザは接続時に署名済みの公開鍵(証明書)を送信し、サーバはそれを検証するホスト認証ユーザの接続時に、サーバは自身の公開鍵とフィンガープリントを送信する。サーバの公開鍵にCAが署名をする。ユーザはCAの公開鍵を保持しており、接続時にサーバから送信された署名済みの公開鍵(証明書)を検証する。証明書による認証は、以下のようなケースで有用な場合があります。ユーザ毎にポートフォワード(port-forwarding)やエージェント転送(agent-forwarding)の許可をしたいエントリをご覧いただくに当たり、公開鍵暗号の基礎知識や、PKI(公開鍵暗号基盤)の理解が必要です。ConoHaと同じGMOインターネットグループのGMOグローバルサインのWebサイトに解説があります。[PKI・証明書入門]https://jp.globalsign.com/service/knowledge/また、OpenSSH(ssh-keygenコマンド)のマニュアルに、証明書の項があります。こちらもご覧ください。(1)]http://www.unixuser.org/~euske/doc/openssh/jman/ssh-keygen.html#証明書ホスト認証とユーザ認証まずはおさらいです。OpenSSHの認証には、ホストを認証するものとユーザを認証するものがあります。(ホストとはVPSなどの接続先のサーバのことです)。ご存じの方は読み飛ばしてください。ユーザ認証ホストが接続してきたクライアントを認証します。クライアントがホストに接続し、ユーザ名とパスワードを送信して、ホスト側ではそれが一致するかを検証するものです。これはわかりやすいと思います。ホスト認証ユーザ認証の逆で、クライアントが接続先のホストを認証します。これは接続先ホストの正当性を確認するもので、例えば悪意のある第三者がクライアントサーバの間に中継サーバを立て、通信を傍受するなどを防ぐものです。(yes/no)?これは、接続先ホストの公開鍵がまだクライアントでは確認できていないと言うことです。OpenSSHでは、公開鍵暗号の仕組みを利用してホストを認証します。これはクライアント側の仕事です。具体的には、フィンガープリントが表示されているので、ホストの管理者に公開鍵のフィンガープリントを確認して一致することを確認します。一致するならばyesを選択し、ホストの公開鍵をknown_hostsファイルに保存します。一度公開鍵がknown_hostsに保存されれば、次回の接続時からはこのメッセージは表示されなくなります。証明書とCAそれでは本題に入っていきます。ここから、クライアント(ユーザ)、CA、ホスト(サーバ)という3者が登場します。本来この3者は別々の立場になりますが、今回は全て自分で作業することになります。一つのマシン上での作業ですが、今自分がどの立場で作業しているかを常に意識するようにしないと、混乱してしまうかもしれません。今回は解説が目的なので、CAの構築と接続先のホストを同じVPSを使います。これも本来は別であるべきです。検証環境は、ConoHaの標準OSであるCentOS6.5です。CAの鍵ペアを作成するまずは、公開鍵に署名を行い証明書を発行するCAを作りましょう。CAが使う鍵ペアを作成します。これはユーザの公開鍵や、ホストの公開鍵に署名するのに使用されます。VPS上の適当なディレクトリに移動し、ssh-keygenコマンドでキーペアを作成しましょう。今回はホームディレクトリのcaと言うディレクトリにしました。conoha-ca.keyこうすることで、caディレクトリ内にconoha-ca.keyとconoha-ca.key.pubという二つのファイルができます。前者が秘密鍵、後者が公開鍵です。CAの作成はこれで終わりです。ユーザ認証を行うそれでは証明書を使った認証を試してみましょう、まずはユーザ認証からです。ユーザは公開鍵認証を使うときと同じように鍵ペアを作成し、CAに公開鍵を提出します。CAはユーザの公開鍵に対して署名をして、証明書をユーザに返却します。ホスト側には、あらかじめCAの公開鍵を登録しておきます。クライアントはホストに接続した際、CAによって署名された公開鍵を提出します。ホスト側は提出された公開鍵がCAによって署名されていることを検証することで認証をします。ユーザ側の作業まずはユーザが使う鍵ペアを作成します。ここではUnix系OSのコマンドから作成することを想定していますが、Windwosなどの場合は各ツールの方法に従ってください。キーの作成にはssh-keygenコマンドを使用します。conoha-client.keyconoha-client.keyとconoha-client.key.pubという二つのファイルが作成されます。.pubの方が公開鍵です。次に公開鍵をCAに提出します。公開鍵をscpコマンドでVPSに転送します。root@[VPSのアドレス]:~/caここからCA側の作業になります。提出された公開鍵に署名をして、証明書を作成します。この場合は、rootユーザでログイン可能な365日間有効な証明書を作成することになります。conoha-client.key.pub見慣れないオプションが多数出てきました。それぞれの意味は以下のようになります。署名に使用する秘密鍵を指定します。今回はCAの秘密鍵ファイルを指定します。公開鍵に署名する際のSpecify(詳細)を指定します。証明書を使った認証をしたときに、ホスト側この内容がログに記録されます。Principalを指定します。ここで指定したUNIXユーザ名でのみログインができます。カンマ区切りで複数の指定が可能です。証明書の有効期限を指定します。CentOS6.5に含まれるOpenSSH-5.3p1では、-nオプションではなく-Zオプションになっています。manページの表記も間違っているので注意してください。CentOS7では修正されています。https://bugs.centos.org/view.php?id=6904すると、conoha-client.key-cert.pubと言うファイルが作成されます。-certはCertificateの略で、証明書ファイルであることを表しています。作成されているか、証明書の内容を確認してみましょう。ssh-keygenコマンドの-Lオプションを使用します。conoha-client.key-cert.pub出力は以下のようになります。0)Validが有効期間で、365日になっています。Principalsにはrootとあるので、この証明書はrootユーザでのログインが可能なことを示しています。内容に問題なければ、この証明書ファイルをクライアントに転送します。root@[VPSのアドレス]:~/ca/conoha-client.key-cert.pubクライアント側の作業は完了です。次にホスト側の作業です。ホスト側の作業ホスト側ではsshd_configにCAの公開鍵を設定します。設定したCAによって署名された証明書を持つユーザに、ログインを許可するようになります。CAの公開鍵をホストに転送します。今回は同サーバ上にあるのでコピーするだけです。/etc/sshsshd_configを編集します。/etc/ssh/sshd_config以下の行を追加します。/etc/ssh/conoha-ca.key.pub設定を変更したので、sshdをリスタートします。restartこれで準備が整いました。ログインするログインの前に、ちゃんとファイルがあるか確認してみましょう。ls以下の3つのファイルがあるはずです。conoha-client.key.pub>ではログインしてみましょう。sshコマンドの-iオプションで、最初に作成したクライアントの秘密鍵を指定します。することで自動的に証明書が使用されます。証明書が使われていることを確認するため、-vオプションでデバッグ情報を表示させています。ログインできたなら、デバッグ情報に以下のような出力があるはずです。key”となっているのがポイントです。key”となります)ホスト認証を行う次にホスト認証です。こちらはUnix系OSが前提になります。証明書でホスト認証を行うメリットは、クライアント側にCAの公開鍵を登録することで、CAが署名した証明書を持ったサーバに接続する際に、公開鍵の検証をしなくて済むことです。ホストの公開鍵に署名するOpenSSHはデーモンとして起動する際に、設定ファイルでホストの公開鍵を指定します。最近のOSの場合は、起動スクリプトなどがこれを自動的に行ってくれることが多いようです。CentOS6.5の場合、/etc/sshの内容を見てみましょう。/etc/ssh典型的には、以下のファイルがあります。sshd_configssh_host_dsa_key.pubとssh_host_rsa_key.pubがホストの公開鍵です。CAはこれらのファイルに署名を行います。ホスト認証では、IPアドレスではなくホスト名が認証の対象です。証明書にホスト名が書き込まれ、そのホスト名でのみ認証がされるからです。VPSではデフォルトで、「v123-123-123-123.z1s2.static.cnode.jp」のようなホスト名が割り当てられます。これをそのまま使ってみましょう。ssh_host_rsa_key.pubユーザ認証の時と同じようですが、-hオプションが増えています。これはホスト認証をする証明書を作成するオプションです。hostnameの部分は自動的にホスト名に置き換えられます。作成されているか、証明書の内容を確認してみましょう。ユーザ認証の時と同じ異様に、ssh-keygenコマンドの-Lオプションを使用します。出力は以下のようになります。(none)Principalsに正しくホスト名があることを確認してください。問題なければ、これらのファイルを/etc/sshに戻します。/etc/sshsshdの設定を変更する作成した証明書を使用するため、sshd_configを変更します。以下の行を追加してください。/etc/ssh/ssh_host_dsa_key-cert.pub設定ファイルを変更したので、sshdをリスタートします。restartホスト側の設定はこれで完了です。クライアント側の設定クライアント側での作業は、known_hostsファイルにCAの公開鍵を登録することです。これにより、CAによって署名された証明書を持つサーバを認証することができるようになります。CAの公開鍵を確認しておきます。ホスト上で以下のコマンドを実行することで確認できます。~/ca/conoha-ca.key.pub次にクライアント側でknown_hostsファイルを編集します。このエントリの内容を試された方は、おそらくすでにホストの公開鍵が登録されていると思われるので、known_hostsファイルをリネームして新規に作成しましょう。~/.ssh/known_hosts新規に以下の行を書き込みます。AAAAB3NzaC1....@cert-authorityという固定キーワードに続き、接続先ホスト名、CAの公開鍵、となります。これでクライアント側の設定は完了です。接続してみるでは、ホスト認証が正しく行われていることを確認してみましょう。-vオプションでデバッグ情報を表示させています。[ホスト名]のところはIPアドレスを指定すると失敗しますので注意です。root@[ホスト名]以下の出力があることを確認しましょう。correctknown_hostsの1行目の公開鍵で署名が検証できたことになります。ここで公開鍵を保存するか尋ねるメッセージが表示された場合は、何か設定が間違っています。一度確認してみてください。おわりに証明書を使った認証をご紹介しました。パスワード認証や公開鍵認証に比べると、設定などがやや煩雑な印象を受けます。ユーザやホストを個別に認証するのではなく、CAによって署名されたユーザ/ホストを認証するという大きな違いがあることもわかりました。冒頭でお話ししたとおり、大量のユーザ/ホストを運用するときの、認証の複雑さを回避するために、有効な方法の一つであると言えるでしょう。VPSだけでなくサーバ運用全般で活用できると思いますので、試してみてください。問題は解決できましたか?はいいいえご回答ありがとうございます。送信ご回答受け付けました。ご協力ありがとうございました。