1.はじめに
SSHプロトコルを使用すると、『盗聴』『なりすまし』に対する防御力を高めることができます。データを暗号化することで『盗聴』に対してデータを守り、クライアント側での認証機構を設けることで、なりすましの防衛にも役立つようになります。本稿ではインターネットセキュリティを考える上で重宝するOpenSSHの解説をしていきます。
2. 盗聴となりすまし
●盗聴
TelnetやFTP、POPなど、多くのプロトコルでは入力した文字などは平文でネットワークを流れています。これはネットワークを使用してあるホストからあるホストにパケットを流した場合、その経路になるネットワーク上であれば、どこでもそのデータを容易に盗聴できることを意味します。特にEthernetの仕組み上、スイッチングハブではなくリピータハブを利用している場合、あるホストから発信されたデータはネットワーク上の全てのホストまでデータが送られます。そのとき、通常は宛先として指定されているホストだけが受信したデータに対する処理を行います。この時点でわかるようにデータの盗聴は極めて簡単です。自分が宛先として指定されていないパケットを拾い上げて、読めばいいだけです。そのため、経路上のネットワークに侵入された場合、ユーザのアカウントやパスワードを盗聴される可能性があります。また、盗聴は他の攻撃方法とは違って受動的な手法であるために、検出するのが非常に難しいこともセキュリティ上大きな脅威といえます。
● なりすまし
telnetやFTPの場合、アクセスしてきたユーザの認証をします。つまり、サーバ側がクライアント側の正当性を確認しています。しかし、クライアント側がサーバが本物であるかどうかは確認していません。この場合、『なりすまし』攻撃に対しての全く防御能力を持たないことになります。例えば、通信を行うHostAとHostBの2点間の経路上にあるパケット中継ホストに手を加えれば、HostAに対してはHostBになりすまし、HostBに対してはHostAになりすますことによって、送受信されるデータの中身を盗聴することはもちろん、実際には送られていないデータを実際に通信しているホストに送りつけたりすることもできてしまいます。
3.SSHプロトコル
SSH プロトコルは従来のrlogin, rsh, rcp に代わる『安全な』プロトコルとして1995年フィンランドのTatu
Ylonen氏によって開発されました。初期のSSHはライセンスフリーで配布されていましたが、バージョンアップに従って、ライセンスが厳しくなり、だんだんとオープンソースの範疇からかけ離れたものになってしまいました。しかし、1999年に
Bjorn Gronvall 氏がsshの初期のリリースを元にフリーな実装のOSSHの開発を始めます。さらにその後、OpenBSD開発チームによって完全にフリーなOpenSSHが開発され、多くのOS用に移植され、いまではほとんどのLinuxディストリビューションで採用されています。
ここではSSHプロトコルを支えるいろいろな暗号化技術について簡単に説明しておきます。
●共通鍵暗号化方式(図1)
データを暗号化するときと復号化するときに使用する鍵が同一である暗号化方式です。処理が比較的高速に行えるため、通信データを暗号化する際に使用されます。
代表的なものとしてDES、3DES、Blowfishなどが広く使用されています。

【図1】共通鍵暗号化方式
●公開鍵暗号方式(図2)
公開鍵暗号方式は、『公開鍵』という誰にでも公開してかまわない鍵と『秘密鍵』という誰にも見せないように厳重に保管しておく鍵のペアを使用してデータの暗号化/復号化をします。公開鍵を使用して暗号化して暗号化したデータは秘密鍵によってしか復号化できないような仕組みになっていて、また、公開鍵からは秘密鍵を求めることはほぼ不可能という性質を持っています。共通鍵暗号化方式と比較して安全性は高いのですが、複雑なアルゴリズムを使用するため、暗号化/復号化に比較的多くの時間を要するので、ユーザ認証やホスト認証などの特に重要な部分で使用されます。SSH1をはじめとする多くの暗号化通信では通信データを暗号化するための共通鍵を、公開鍵暗号化方式を使用して受け渡すことで、安全性と実用的な通信速度を実現しています。
公開鍵暗号化方式として代表的なものにRSA、DSAなどが存在します。
 【図2】公開鍵暗号化方式
●一方向ハッシュ関数(図3)
ハッシュ関数とは不定長の入力から固定長のデータを出力する関数で、出力から入力のデータは推測できない、同じ出力を持つ入力データを容易に作成できないような特徴を持ち、ハッシュ関数はあるデータが同じものであるのかを検証する場合によく使用されます。
多くのLinuxでユーザのパスワードを保存しておくために使用されているMD5やSHA-1が代表的なものとして挙げられます。
【図3】一方向ハッシュ関数
●鍵交換(図4)
データ通信を行う際には共通鍵を共有する技術の一つです。通信の開始時に通信をする両ホストで公開鍵/秘密鍵ペアを作成し、まずは公開鍵を交換します。そして、受け取った相手の公開鍵と自身の秘密鍵をもとに特殊な計算をおこなうと、双方で同一の鍵を得ることができる仕組みになっています。この方式は公開鍵を利用して共通鍵を交換するよりもさらに安全性が高いとされています。代表的なものとしてDiffie-Hellman方式があり、SSH2での『共通鍵』の交換で利用されています。

【図4】鍵交換
4.OpenSSHの仕組み
SSHを利用してデータを送受信する場合、全てのデータは暗号化されて送られます。ここでは暗号化のためにどのような手順を踏んでいくのかを説明します。
●通信路の暗号化
OpenSSHでコネクションを確立する場合にはデータを暗号化するため、サーバとクライアントで同じ共通鍵をもつ必要があります。この共通鍵を受け渡すための動作はSSHプロトコルのバージョンによって異なりますが、具体的には以下のような手順で共通鍵が交換されます。
|
(1) SSHのバージョン情報をクライアントからサーバへ送る。
(2) あらかじめ作成しておいたホスト公開鍵をサーバからクライアントに送る。
(3) 乱数によって生成されるサーバ公開鍵をサーバからクライアントへ送る。
(4) 初めて接続するサーバであれば、ホスト公開鍵を保存する。2回目以降の接続であれば、登録済みの鍵と照合し、サーバのなりすましが行われていないかを確認する。
(5) 乱数によって共通鍵を生成し、ホスト公開鍵とサーバ公開鍵で暗号化し、サーバへ送る。
(6) ホスト秘密鍵、サーバ秘密鍵によって受信したデータを複合化し、共通鍵を得る。
SSHプロトコル バージョン2の場合、(1)(2)まではバージョン1と同様ですが、(3)以降は異なる振る舞いをします。
(3)' クライアント・サーバ双方で公開鍵・秘密鍵を作成する。
(4)' 互いに公開鍵を送りあう。
(5)' 相手の公開鍵と自分の秘密鍵を利用して同一の秘密鍵を得る。
(6)' 共通鍵を作成し、(5)'で得た秘密鍵で暗号化し、送信することで暗号化のための共通鍵を共有する。
|

【図5】SSHバージョン1での通信路の暗号化
●ユーザの認証
OpenSSHを利用する場合には当然ですが、ユーザの認証が必要です。OpenSSHでは様々な認証方法がサポートされています。また、PAMを利用することでより多くの認証方法を利用できるのですが、ここでは『パスワード認証』、『公開鍵認証』の2つについて説明します。
『パスワード認証』は普通のLinuxで使用されるユーザ認証を指します。この認証方法を利用する場合、クライアントはユーザ名とパスワードをサーバに送る必要がありますが、前述の方法によって既に暗号化された通信路にパスワードは流されます。
『公開鍵認証』は公開鍵暗号方式を利用した認証方法です。SSHバージョン1ではRSA暗号方式を、SSHバージョン2ではRSA暗号方式とDSA暗号方式を利用することが可能です。どのバージョン、どの暗号化方式を使用する場合でも手順は同様です。まずは前準備として以下のことを済ませておく必要があります。
(1) 公開鍵/秘密鍵のペアを作成する。(秘密鍵は鍵自体を暗号化した上で保存されます。秘密鍵を利用するにはパスフレーズを与える必要があります。)
(2) 作成した公開鍵をサーバに登録しておく。
(3) 秘密鍵はクライアント側で厳重に保管しておく。
準備完了後、実際にユーザを認証する場合、鍵は以下のような手順で使用されます。
(1) アクセスするユーザ名をサーバに送る。
(2) 乱数を生成する。
(3) 登録されているユーザの公開鍵で乱数を暗号化する。
(4) 暗号化した乱数をクライアントへ送信。
(5) パスフレーズの入力によって秘密鍵を復号化する。
(6) 受信したデータを秘密鍵で復号化する。
(7) 復号化したデータのハッシュ値を算出
(8) 算出したハッシュ値をサーバへ送信
(9) 元の乱数のハッシュ値と受信したハッシュ値を照合し、認証の可否を決定する。 |

5.OpenSSHのインストール
● RPMからのインストール
執筆時点でのRPM版OpenSSHの最新はRedHatLinux9に付属するopenssh-3.5ですので、ここでは付属のopenssh-3.5を使うものとします。
必要になるのはopenssh-3.5p1-6.i386.rpm, openssh-clients-3.5p1-6.i386.rpm,
openssh-server-3.5p1-6.i386.rpm です。(opensshはopensslを必要としますが、RedHatLinuxの場合、特殊な操作をしない限り、デフォルトでインストールされています。)
なお、今後リリースされる最新版に関しては、http://www.openssh.org/ja/ より辿ってアーカイブファイルをダウンロードしてインストールして下さい。他のディストリビューションでも同様の手順でインストールすることが可能だと思います。
#
rpm -ihv openssh-3.5p1-6.i386.rpm \
openssh-clients-3.5p1-6.i386.rpm \
openssh-server-3.5p1-6.i386.rpm |
●ソースからのインストール
特に理由がない限り、RPMからインストールすることをお勧めしますが、ソースからインストールする場合はopenssh-3.6.1p2.tar.gzを入手し、以下を実行すると、/usr/local
以下にOpenSSHがインストールされます。
#
./configure
# make
# make install |
configureスクリプトを実行する際には必要に応じて、 --with-tcp-wrappers --with-pam
--with-md5-passwords --without-shadowなどのオプションを指定してください。
ソースからインストールした場合とRPMでインストールした場合で、ファイルの配置が違いますが、この後の説明はRPMからインストールしたことを仮定して進めます。
6.OpenSSHサーバの設定
サーバの設定は/etc/ssh/sshd_config で行います。様々な設定項目が存在しますが、ほとんどの設定についてはデフォルト設定を変える必要はないと思いますが、ここではセキュリティに関する設定項目を3点説明します。
●Unixパスワード認証の禁止
前述したように、OpenSSHは各種の認証方式に対応します。デフォルト状態では公開鍵暗号化方式による認証を使用せずに、Unixパスワードでのログインが可能になっています。より安全度の高い公開鍵暗号化方式だけをユーザ認証に使用したい場合にはPasswordAuthenticationをnoに設定します。
| PasswordAuthentication
no |
● Rootloginの禁止
SSHではデフォルトでrootユーザが直接ログインすることを認めています。これを禁止し、root権限を得るためには2回システムから認証を受けるようにするにはPermitRootLogin
を no に設定します。但し、一般ユーザでSSHログインした後、rootにsuした場合は暗号化されているとはいえ、ネットワーク上にrootのパスワードが流れることになります。公開鍵暗号化方式によってのみユーザ認証を行うのであれば、ネットワーク上にパスワードが流れることはないので、この項目をyesにし、rootユーザで直接ログインしたほうが安全だという考えもあります。
● ユーザの制限
AllowUsers/DenyUsersによってSSH接続できるユーザを制限することができます。
例えば、asano と ogawa というユーザだけにSSHの利用を認めるのであれば以下のように設定します。
>>次のページへ
|