攻撃者がターゲットとするシステムに対して侵入を試みる際,まず実施するのが情報収集である。例えば,セキュリティ・ホールが存在するソフトウエアを使用していることが知られれば,当然そこを攻撃されることになる。逆にシステムの情報を隠せば,攻撃を受けにくくなるといえる。情報を安易に公開しないことが,セキュリティ対策の一つとなるのだ。ただしパッチを適用するなどして,セキュリティ・ホールを解消することが第一である。その上で,無用の攻撃を避けるために情報を隠すのである。
セキュリティ・ホールの有無が明らかに
攻撃者が入手しようとするシステム(コンピュータ)の情報には,次のようなものが考えられる。(1)接続しているネットワークに関する情報,(2)稼働しているOSやサービス(ソフトウエア)の種類やバージョン情報,(3)ユーザー・アカウント情報――などである。今回は(2)に焦点を絞り,攻撃者はどのように情報を収集するのかについて考えてみよう。
まずは,ターゲットとするシステムでどのようなサービスが稼働しているのかを特定する。このコラムの読者には改めて説明する必要はないと思うが,サービスによって使用するポートは異なる。例えば,Webサーバーならば80番,メール・サーバーならば25番といった具合だ。このため,それぞれのポートに接続を試みることで,そのシステムで稼働しているサービスを特定することができる。これが「ポート・スキャン」と呼ばれる調査方法である。
あるポートへの接続が成功すれば,そのポートに対応したサービスが稼働していることが分かるだけではなく,多くの場合,そのサービスを提供するソフトウエアのバージョンなども知ることができる。そしてバージョンが分かれば,そのシステムに存在するセキュリティ・ホールも知ることができるのだ。
というのも,どのソフトウエアの,どのバージョンに,どのようなセキュリティ・ホールが存在するのかについての情報が,さまざまなWebサイトで公開されているからだ。本来これらの情報は,ユーザーに危険性を知らせ,バージョンアップやパッチの適用を促すために公開されている。しかし,その情報は時として攻撃者に侵入の糸口を与えてしまうのだ。
例えばポート・スキャンなどの結果,ターゲットとするシステムのOSおよび稼働しているWebサーバーがそれぞれ「FreeBSD 4.5 (x86) + Apache/1.3.23」であることが知られたとする。すると同時に,そのシステムには「チャンク形式エンコーディング機能のバグによるセキュリティ・ホール」があることも知られてしまうのだ(関連記事)。そして,存在するセキュリティ・ホールが明らかになれば,そのセキュリティ・ホールに“応じた”ツールや手法を用いて攻撃を仕掛けることが可能となってしまう。
特定のソフトウエアが稼働している場合には,自動的に攻撃を仕掛けるワームも存在する。例えば 2002年9月には,OpenSSLのセキュリティ・ホールを悪用して,Apacheが稼働するサーバーに感染する「Slapper」ワームが確認されている(関連記事)。
バージョン情報の取得は容易
ターゲットとするシステムのポートに接続できれば,そのポートで稼働するソフトウエアのバージョンを特定することは容易である。例えばApacheでは,telnetコマンドを使えば,以下のようにバージョン情報を表示させることができる。
% telnet 192.168.1.1 80
Trying 192.168.1.1...
Connected to 192.168.1.1.
Escape character is '^]'.
HEAD /index.html HTTP/1.1
Host: サーバー名(FQDN)
(上記行を入力する。ただしローカル・エコーの設定で,入力しても表示されない場合もある)
HTTP/1.1 200 OK
Date: Wed, 01 Jan 2003 00:00:02 GMT
Server: Apache/1.3.27 (Unix)
Content-Location: index.html.en
Vary: negotiate,accept-language,accept-charset
TCN: choice
Last-Modified: Wed, 01 Jan 2003 00:00:01 GMT
ETag: "*****-***-********;********"
Accept-Ranges: bytes
Content-Length: 2673
Content-Type: text/html
Content-Language: en
バージョン情報を表示するのは,何もApacheに限ったことではない。多くのソフトウエア(サービス)が,ユーザー認証などを経なくてもバージョン情報などを表示してしまう。ただし,それはデフォルト設定の場合である。後述するように,設定を変更すれば表示内容を変更することができる。代表的なソフトウエアについて,具体的な設定変更例を次に紹介する。
設定変更でバージョンを隠す
代表的なWebサーバー・ソフト「Apache」,DNSサーバー・ソフト「BIND」,FTPサーバー・ソフト「wu-ftpd」における,設定変更例を以下に示す。他のソフトウエアでも同様の設定変更は可能なので,ソフトウエアに付属するドキュメント・ファイルなどを参照して設定を変更していただきたい。
◆Apacheでの対策
Apacheでは,その設定ファイルの一つである「httpd.conf」中の「ServerTokens」の設定を変更することで,表示する文字列を変更できる。具体的には,「ProductOnly」とすれば,バージョンは表示されず「Apache」とだけ表示される(ただし,Apache1.3.12以降)。
ServerTokens ProductOnly
なお,ServerTokensには,「ProductOnly」以外に,「Minimal」,「OS」,「Full」を指定できる。例えば,OSがFreeBSDで,mod_ssl-2.8.12を使用しているApache 1.3.27の場合,ServerTokensの設定によって表示は次のように変化する。
ProductOnly | Apache |
Minimal | Apache/1.3.27 |
OS | Apache/1.3.27 (FreeBSD) |
Full | Apache/1.3.27 (FreeBSD) mod_ssl-2.8.12 OpenSSL/0.9.6g |
デフォルトでは OS が設定されており,指定がない場合には Full と解釈される。
ただし,Apacheはエラー・メッセージなどを表示した際にもバージョン情報を表示する。このため,ServerTokensの設定を変更しただけでは不十分である。バージョン情報を表示させないためには,同じくhttp.confに,次の一行を追加する必要がある(ただし,Apache 1.3以降)。
ServerSignature Off
◆BINDでの対策
BINDの設定ファイルの一つである「/etc/named.conf」の「options」ステートメントに,以下の変数を追加する。これで,バージョンとして「任意の文字列」を返すようになる。
options {
~略~
version "任意の文字列";
~略~
} ;
◆wu-ftpdでの対策
wu-ftpdの設定ファイルの一つである「/etc/ftpaccess」を編集する。ftpaccessに次の一行を書けば,バージョンとして「任意の文字列」を返す。
greeting text 任意の文字列
なお「greeting」には,text以外に「full」「brief」「terse」を指定できる。
full | ホスト名とバージョンを表示する |
brief | ホスト名を表示する |
terse | "FTP server ready" と表示する |
text 任意の文字列 | 「任意の文字列」を表示する |
セキュリティ・パッチの適用が第一
不要なサービスは稼働させないのと同様に,不要な情報は開示しないことが望ましい。攻撃を受ける可能性を減らせるからだ。しかし,勘違いをしないでいただきたい。不要な情報を開示しなければ,攻撃を受けないということではない。攻撃を受けにくくするだけである。たとえ情報を隠しても,セキュリティ・ホールが存在すれば当然攻撃を受ける恐れはある。このコラムでも何度も言っているように,セキュリティ・パッチの適用やバージョンアップを実施して,セキュリティ・ホールを解消しておくことが第一である。
また,システムによっては,バージョン情報などを隠してしまうと問題が起きることもある。例えば,インテグレータなどと保守契約を結んでいて,リモートから保守や監視をしてもらっているシステムでは,バージョンを容易に確認できるようにしておかなければいけない場合があるだろう。
不要な情報を開示しないに超したことはないが,その情報が必要な場合もある。必要に応じて,臨機応変に対応してほしい。このことは,バージョン情報の開示にかかわらず,システム管理全般に言えることだ。
阿部正道 (ABE Masamichi) masamichi.abe@lac.co.jp
株式会社ラック セキュアネットサービス事業本部
IT Proセキュリティ・サイトが提供する「今週のSecurity Check [一般編]」は,その週に起きたUNIX関連およびセキュリティ全般のニュースや動向をまとめた週刊コラムです。セキュリティ・ベンダーである「株式会社ラック」のスタッフの方を執筆陣に迎え,専門家の立場から解説していただきます。