共通テーマ: OpenSSH キー (鍵) の管理: 第 1 回

RSA/DSA 認証を理解する

このシリーズでは、RSA認証およびDSA認証の仕組みについて、また、パスワードレス認証(パスワードを必要としない認証)の正しい設定方法について学びます。このシリーズ第1回目では、Daniel Robbins氏がRSA/DSA認証プロトコルについて紹介し、さらにネットワーク上におけるそれらの使用方法について説明します。

Daniel Robbins (drobbins@gentoo.org), President/CEO, Gentoo Technologies, Inc. (Courtesy Intel Corporation)

ニューメキシコ州のアルバカーキーに住む Daniel Robbins は、Gentoo プロジェクトのチーフ・アーキテクトであり、かつ Gentoo Technologies, Inc. の CEO であり、かつ Linux Advanced Multimedia Project (LAMP) のよき助言者です。彼は、マクミラン・ブックCaldera OpenLinux Unleashed、SuSE Linux Unleashed、およびSamba Unleashed の著者です。Daniel は、小学校 2 年生のころから曲がりなりにもコンピューターにのめり込み、当時彼は、危険性を潜めたパック・マンのほか、Logo プログラム言語にも初めて出会いました。これで、彼がなぜ、それ以来 SONY Electronic Publishing/Psygnosis のリード・グラフィック・アーティストを務めているかが分かるでしょう。Daniel は、奥さんの Mary(今度の春に出産の予定です)と一緒に時間を過ごすのが楽しいそうです。彼の電子メール・アドレスはdrobbins@gentoo.org です。



2001年 7月 01日

私たちの多くが、OpenSSH(この記事末尾の参考文献 を参照)を使用しています。OpenSSHは、旧来のtelnetコマンドやrshコマンドに代わる、セキュアで優れた暗号化技術です。OpenSSHのきわめて魅力的な特徴の1つは、1対の相補的な数値キー(鍵)をベースとしたRSA/DSA認証プロトコルによってユーザーの認証を行う点です。RSA/DSA認証には、リモート・システムとの接続をパスワードの入力なしで確立することができるという特長があります。これは魅力的な特長です。しかし、OpenSSHに慣れていないユーザーの場合、RSA/DSAの構成を簡単に行ってしまうことにより、たしかにパスワードなしでのログインができるようになるのですが、その過程で大きなセキュリティー・ホールを生み出してしまうということが少なくありません。

RSA/DSA認証とは

SSH、特にOpenSSH(完全にフリーのSSH)はきわめて優れたツールです。telnetrshと同様に、sshクライアントを使用したリモート・マシンへのログインが可能です。このとき必要とされるのは、リモート・マシン側でのsshサーバー・プロセスsshdの実行のみです。telnetと違って、sshプロトコルはきわめてセキュアであり、このプロトコルは、特殊なアルゴリズムによってデータ・ストリームを暗号化してその保全性を確保し、安全確実な認証を行います。

このようにsshの優れている点が確かである一方で、sshの中には、とかく見逃されたり、危険なまでに誤用されたり、あるいは単に誤解されたりする傾向のある機能があります。その機能とは、OpenSSHが用いるRSA/DSA鍵認証方式です。これは、標準的なセキュア・パスワード認証方式に代わるものであり、OpenSSHがデフォルトで使用している方式です。

OpenSSHのRSA/DSA認証プロトコルは、私有鍵と公開鍵と呼ばれる特別に生成される1対の暗号鍵をベースとしています。多くの場合、このような鍵ベースの認証方式を採用することにより、パスワードを入力せずにセキュアな接続を確立できるというメリットが生まれます。

鍵ベースの認証プロトコルは比較的セキュアな方法です。しかし、ユーザーがその利便性を追求するあまり、セキュリティーへの影響を充分に考慮せずに必要なプロセスを省いてしまったりすると、それがさまざまな問題の原因となります。この記事では、不要なセキュリティー上のリスクを招くことなくRSA/DSA認証プロトコルを正しく使用する方法について詳しく見ていきます。また、次回の記事では、暗号化の解除された私有鍵をssh-agentを使用してキャッシュする方法、また、セキュリティーを犠牲にせずにさまざまなメリットを提供するkeychain(ssh-agentのフロントエンド)について紹介します。OpenSSHのより高度な認証機能について知りたいと望んでいる方は、次回以降の記事も是非、続けてお読みください。


RSA/DSA鍵の仕組み

RSA/DSA鍵の仕組みについて、その概要を簡単に説明しましょう。では、次のような状況を想定してみましょう。ISPに置かれたマシンremoteboxのリモート・シェルを、ローカルのLinuxワークステーション(localbox)から開きたいとします。sshクライアントを使用してremoteboxに接続を試みると、以下のプロンプトが表示されます。

%ssh drobbins@remotebox
drobbins@remotebox's password:

まず、sshのデフォルトによる認証の例を示します。remoteboxのアカウントdrobbinsのパスワードの入力が要求されます。remoteboxに対するパスワードをユーザーが入力すると、sshはそのパスワードを確認するために、セキュア・パスワード認証プロトコルによってパスワードをremoteboxに送信します。ただし、telnetの場合とは違い、パスワードが暗号化されているため、送信されるデータの傍受/解読はできません。remoteboxは、入力されたパスワードをパスワード・データベースと照合して認証を行い、その認証が成功するとログオンが許可され、remoteboxシェル・プロンプトが表示されます。このsshのデフォルトによる認証もきわめてセキュアな方法です。しかし、RSA/DSA認証は、さらに新たな可能性をもたらします。

sshのセキュア・パスワード認証とは異なり、RSA認証にはいくつかの初期構成が必要です。この初期構成は1回だけ行えばよく、この初期構成によって、localbox/remotebox間のそれ以降のRSA認証は、きわめて簡単に行えるようになります。RSA認証を設定するには、まず私有鍵/公開鍵のキー・ペアの生成が必要です。これら2つの鍵には非常におもしろい特性があります。公開鍵は、メッセージの暗号化のために用いられ、その公開鍵に対応する私有鍵を持つ者のみがそのメッセージの暗号化を解除できます。公開鍵は暗号化のみを行うことができ、また、私有鍵は対応する公開鍵で符号化されたメッセージの暗号化の解除のみに用いられます。RSA(およびDSA)認証プロトコルは、このキー・ペア特有の特性を利用することによって、ネットワーク上で機密情報のやり取りを行うことなく、セキュアな認証を実現します。

RSA/DSA認証では、1つの構成手順を1回だけ行う必要があります。公開鍵(この公開鍵は、メッセージの暗号化にしか使用できないため、悪意のある人物の手に渡ることをそれほど恐れる必要がなく、公開可能であることから「公開」鍵と呼ばれます)をremoteboxにコピーし、そのコピーを、remoteboxのsshdによる検知が可能なように専用ファイル(~/.ssh/authorized_keys)に置きます。これによって、RSA認証を使用してremoteboxにログオンすることができるようになります。

ログオンは、いつも通り、localboxのコンソールにssh drobbins@remoteboxと入力するだけでできます。ただしこの場合、RSA認証プロトコルを使用するという知らせがsshによってremoteboxのsshdに送られます。ここから先がかなりおもしろいところです。Remoteboxのsshdは乱数を生成し、先にコピーしておいた公開鍵を使用してそれを暗号化します。次いで、この暗号化した乱数をlocalboxで実行されているsshに送り返します。それを受けてsshは、私有鍵を使用してこの乱数の暗号化を解除してそれをremoteboxに送り返します。これは要するに「ほら、対応する私有鍵を間違いなく持っていますよ。メッセージの暗号化を解除できましたよ。」と言っていることになります。最終的にsshdは、このsshが対応する私有鍵を所有していることから、ログインを許可してよいと判断します。このように、対応する私有鍵を所有していることによってremoteboxへのアクセスが許可されます。


2つの特徴

RSA/DSA認証に関する重要な点は次の2点です。まず1つは、生成するキー・ペアが1つだけでよいという点です。公開鍵はその生成後、アクセスしたいリモート・マシンにコピーすることができ、リモート・マシンは1つの私有鍵に対して認証を行うことができます。つまり、アクセスしたいすべてのシステムに対してそれぞれのキー・ペアを生成する必要はなく、たった1つのペアでよいということです。

もう1つの重要な点は、不正を働くであろう人物に私有鍵を渡してはいけないという点です。私有鍵によってリモート・システムへのアクセス権限が得られるため、私有鍵を手にすれば誰でも正規の所有者とまったく同じ権限を得ることができます。これは、見ず知らずの他人に家の鍵を渡してはならないのと同じことで、私有鍵の不正使用は防止しなければなりません。これはすなわち「私有鍵の不正な読み取りやコピーを防止する必要がある」ということです。

もちろん、sshの開発者は私有鍵の重要性を認識しており、私有鍵が不正使用されないようにするための保護手段をsshおよびssh-keygenに組み込んでいます。まず第1に、鍵によって正規所有者以外の者によるファイルの読み取りが許可される際、sshでは警告メッセージが出力されます。第2に、ssh-keygenによって公開鍵/私有鍵のキー・ペアを生成する際、パスフレーズの入力が要求されます。私有鍵はこのパスフレーズによって暗号化されるため、たとえ私有鍵が盗まれたとしてもこのパスフレーズを知らない者には解読することができない仕組みになっています。以上のことを踏まえて、RSA/DSA認証プロトコルを使用する場合のsshの構成方法を見てみましょう。


ssh-keygenの具体的な使い方

RSA認証を設定するために最初に行うことは、公開鍵/私有鍵のキー・ペアの生成です。現在利用できる最新バージョン(この記事の執筆時ではopenssh-2.9_p2)のOpenSSHをインストールすることを私はお勧めします。しかし、RSA認証はssh本来の鍵認証形式であるため、どのバージョンのOpenSSHであっても動作するはずです。RSAキー・ペアの生成は、以下のようにして行います。

%ssh-keygen
Generating public/private rsa1 key pair.
Enter file in which to save the key (/home/drobbins/.ssh/identity):(hit enter)
Enter passphrase (empty for no passphrase):(enter a passphrase)
Enter same passphrase again:(enter it again)
Your identification has been saved in /home/drobbins/.ssh/identity.
Your public key has been saved in /home/drobbins/.ssh/identity.pub.
The key fingerprint is:
a4:e7:f2:39:a7:eb:fd:f8:39:f1:f1:7b:fe:48:a1:09 drobbins@localbox

ssh-keygenを実行すると、鍵の格納場所に関して確認が要求されますので、Enterキーを押してデフォルトの/home/drobbins/.ssh/identityを承認します。私有鍵はこのパスに、また、公開鍵は同列のidentity.pubというファイルに格納されます。
また、ssh-keygenを実行するとパスフレーズの入力が要求されますので、適切なパスフレーズ(7文字以上の推測しにくい文字列)を入力します。このパスフレーズを使用して私有鍵(~/.ssh/identity)の暗号化が行われ、パスフレーズを知らなければ私有鍵を使用できないようになります。


安易な妥協

ssh-keygenを実行し、パスフレーズを指定することによって私有鍵の悪用を防止することができますが、それに伴って若干、不便な点が生じます。この状態では、ユーザーがsshを使用してアカウントdrobbins@remoteboxに接続しようとする度に、私有鍵の暗号化を解除してRSA認証を行うためのパスフレーズの入力をsshは要求します。そのため、ユーザーはremoteboxのアカウントdrobbinsのパスワードを入力するのではなく、私有鍵の暗号化をローカルで解除するために必要なパスフレーズを再び入力することになります。私有鍵の暗号化が解除されれば、残りの処理はsshクライアントが行います。リモート・パスワードとRSAパスフレーズはその使い方がまったく異なりますが、RSAの場合もsshに対する「秘密フレーズ」の入力が要求されます。

#ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':(enter passphrase)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org 
Welcome to remotebox!
%

ここに、多くの人を「安易な妥協」に駆り立てる落とし穴があります。暗号化されていない私有鍵を生成して、パスワードを入力しなくても済むようにしてしまうケースが多くあります。そうすることによって、sshコマンドを入力するだけでRSA(またはDSA)によって直ちに認証を受け、ログインできるようにしてしまうのです。

#ssh drobbins@remotebox
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org 
Welcome to remotebox!
%

しかし、いくら便利であるといっても、セキュリティー上の影響を十分に考慮することなくこのような方法を採るべきではありません。私有鍵が暗号化されていなければ、localboxに対するハッキングによって、remoteboxおよび対応する公開鍵によって構成された他のシステムへのアクセスをそのハッカーに許してしまうことになるからです。

「パスワードレス認証には若干の危険が伴うが、とても魅力的である」と皆さんは思われることでしょう。私もその点はまったく同じ意見です。しかし、もっとよい方法があります。私有鍵のセキュリティーを犠牲にすることなく、パスワードレス認証を使う方法があるのです。そのような高度なssh-agentの使用方法(セキュアなパスワードレス認証を行う方法)については、次回の記事で説明する予定です。それではまず、RSA/DSA認証を設定し、ssh-agentを使用するための環境を整えましょう。以下、順を追って手順を示します。


RSAキー・ペアの生成

RSA認証を設定するために、公開鍵/私有鍵のキー・ペアの生成(構成手順の実行は1回のみ)を行います。以下のコマンドを入力します。

%ssh-keygen

鍵の格納場所を指定するよう指示されますので、デフォルトを承認して(公開鍵の格納場所は通常~/.ssh/identityおよび~/.ssh/identity.pub)、ssh-keygenに対してセキュアなパスフレーズを入力します。ssh-keygenが終了すると、公開鍵ならびにパスフレーズによって暗号化された私有鍵が得られます。


RSA公開鍵のインストール

次に、sshdを実行しているリモート・システムに対して、RSA公開鍵による認証を行えるように構成を行います。通常、この構成は、以下のように公開鍵をリモート・システムにコピーすることによって行います。

%scp ~/.ssh/identity.pub drobbins@remotebox:

まだRSA認証が完全には設定されていないため、remoteboxに対するパスワードの入力が要求されます。パスワードを入力してremoteboxにログインします。そして、以下のように公開鍵を~/.ssh/authorized_keysファイルに追加します。

%ssh drobbins@remotebox
drobbins@remotebox's password:(enter password)
Last login: Thu Jun 28 20:28:47 2001 from localbox.gentoo.org 
Welcome to remotebox!
%cat identity.pub >> ~/.ssh/authorized_keys
%exit

RSA認証の構成が完了したため、sshによってremoteboxへの接続を試みると、パスワードではなくRSAパスフレーズの入力が要求されます。

%ssh drobbins@remotebox
Enter passphrase for key '/home/drobbins/.ssh/identity':

おめでとうございます。これでRSA認証の構成は完了です。パスフレーズの入力が要求されない場合、以下のことを行ってみてください。まず、ssh -1 drobbins@remoteboxと入力してログインしてください。これは、sshプロトコルのバージョン1のみを使用するようsshに指示するためのもので、何らかの理由によってリモート・システムのデフォルトがDSA認証になっている場合に必要となります。それでもうまくいかない場合には、/etc/ssh/ssh_configにRSAAuthentication noという行がないかどうか確認してください。その行があった場合には、その行の先頭に"#"を付けてコメント化してください。そのような行がない場合には、remotebox側のRSA認証が有効になっているかどうか、また、/etc/ssh/sshd_configの設定が適切であるかどうかをremoteboxのシステム管理者に確認してください。


DSA鍵の生成

sshプロトコルのバージョン1ではRSA鍵が使われますが、sshプロトコルの最新バージョンであるプロトコル・レベル2ではDSA鍵が使われます。OpenSSHの最近のバージョンであれば、RSA鍵とDSA鍵のどちらでも使用できるはずです。OpenSSHのssh-keygenによるDSA鍵の生成は、RSAと同様に以下のようにして行うことができます。

%ssh-keygen -t dsa

DSAの場合もパスフレーズの入力を要求されますので、セキュアなパスフレーズを入力します。また、DSA鍵の格納場所の入力も要求されます。通常は、デフォルト(通常は~/.ssh/id_dsaおよび~/.ssh/id_dsa.pub)で構いません。DSA鍵の生成(構成手順は1回)の後、DSA公開鍵をリモート・システムにインストールします。


DSA公開鍵のインストール

DSA公開鍵のインストールはRSAの場合とほぼ同じです。DSAの場合、~/.ssh/id_dsa.pubファイルをremoteboxにコピーして、それをremotebox側の~/.ssh/authorized_keys2に追加します。このファイルはRSA authorized_keysファイルとファイル名が異なる点に注意してください。構成が完了すると、remoteboxのパスワードではなくDSA私有鍵のパスフレーズを入力してremoteboxにログインできるようになります。


次回の予告

これでRSA認証およびDSA認証が使えるようになりました。しかし依然として、接続を行うたびにパスフレーズの入力は必要です。次回は、ssh-agentを使ってパスワードを入力せずに接続を行い、さらにまた、暗号化された私有鍵をディスク上に格納する方法について学びます。また、keychainについても紹介します。keychainは、ssh-agentをより安全で使いやすく楽しいものとするssh-agentのフロントエンドです。では、次回お会いするまでのしばらくの間、以下の参考文献を利用して是非、最新情報をチェックしておいてください。

参考文献

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=228566
ArticleTitle=共通テーマ: OpenSSH キー (鍵) の管理: 第 1 回
publish-date=07012001