連載
» 2002年10月23日 00時00分 UPDATE

不正侵入の手口と対策(2):攻撃者に有用な情報を与えない対策法

[木村靖,三井物産セキュアディレクション株式会社]
※ご注意
他社および他組織のWebサイトなどへのポートスキャンおよびデータの取得などの行為で得た情報を侵入などに悪用するか、または同じ目的を持つ第三者に提供した時点で違法となります。ご注意ください。
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。
また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。

 「第1回 攻撃者側から見た侵入前の事前調査(下見)」では、攻撃者が対象サーバに侵入を試みる際に、最初に行うだろう、ターゲットサーバの脆弱性の有無の調査方法を紹介した。今回は、攻撃者が利用できる情報をいかに与えないようにするかといった対策法を紹介する。

※注
実行コマンドの先頭の %は一般ユーザー権限、#は管理者権限(root)によるコマンドの実行を意味する。

攻撃者に有用な情報を与えない対策

 第1回で説明した事前調査は、サーバ内へ侵入するといったたぐいの攻撃ではない。そのため対策をしようがしまいが、事前調査によりサーバ内に侵入されてしまうことはまずない。

 しかしながら、事前調査によって攻撃者に侵入するための有用な情報(OSやソフトウェアのバージョン情報など)を与えてしまうのは事実で、管理者からすれば、そういった情報をやすやすとは与えたくないだろう。

 攻撃者に有用な情報を与えない対策として最初に挙げられるのが、バージョン情報を隠す(表示しない)方法だ。その方法を実現する手段としては、ソフトウェアの設定で行うことを推奨する。ソースコードを直接修正する対策は、運用を維持し続けることを考えるとあまり推奨できない。

 以上を踏まえ、ここでは実際に情報が検出されたApacheBINDsendmailにおける対策方法をRed

Hat Linux 7.3上で説明する。OpenSSHについては、ソフトウェア設定による対策が現行バージョンでは行えない、さらにはソースコードのバージョン変更をすると正常に機能しなくなるため、今回は対象外とした。

 なお、ここで説明する対策方法は、攻撃者に対してあくまで目くらましを行う程度のもので、攻撃者があれこれ考える人間であるからこそ有効な手段となり得る。そのため、現在も蔓延しているNimdaのように、ソフトウェアの種類に関係なく攻撃を行うものに対しては、まったくの無力であるということに十分注意してほしい。

Apacheの場合

 Apacheのバージョン情報を変更したい場合は、httpd.confにServerTokensとServerSignatureの設定を変更すればよい。

(1)ServerTokens の変更

 httpd.confにServerTokensを追加し(後述のServerSignatureの直下あたりに追加すればよい)、ProductOnlyを定義する。なお、この設定はApache 1.3.12以降から利用可能となる。

ServerTokens ProductOnly

(2)ServerSignature の変更

 httpd.confのServerSignatureの設定をOnからOffに変更して、エラーメッセージ出力時にフッタを表示しないようにする。なお、この設定はApache 1.3から利用可能となる。

ServerSignature Off

(3)確認

 telnetとWebブラウザを使用して、Apacheのバージョン情報が表示されなくなったことを確認する。

 編集保存した後、httpd.confを再読み込みする。

# /sbin/service httpd reload

% telnet 192.168.0.10 80
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is '^]'.
HEAD / HTTP/1.0


HTTP/1.1 200 OK
Date: Sun, 29 Sep 2002 11:47:53 GMT
Server: Apache
Last-Modified: Tue, 09 Apr 2002 18:56:58 GMT
ETag: "2c075-b4a-3cb3397a"
Accept-Ranges: bytes
Content-Length: 2890
Connection: close
Content-Type: text/html


Connection closed by foreign host.

画面1 Apache:ServerSignature Offの場合 画面1 Apache:ServerSignature Offの場合

BINDの場合

 BINDでは、バージョン情報の変更とゾーン転送の制限を行う。

(1) バージョン情報の変更

 BINDのバージョン情報を変更したい場合は、named.confのoptions項目にversionを指定する。ただし、versionはBIND 8.2以上から指定可能。

 例:バージョン情報をunknownに変更する

 named.confファイルのoptionsに以下を追加する。

options {
     …… 省略 ……

     version "unknown";
};

 追加後、named.confを再読み込みするためnamedプロセスにHUPシグナルを送る必要がある。

# /etc/init.d/named reload


 設定完了後、第1回に述べたdigで確認してみる。

% dig @192.168.0.10 chaos txt version.bind

; <<>> DiG 8.3 <<>> @192.168.0.10 chaos txt version.bind
; (1 server found)
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUERY SECTION:
;; version.bind, type = TXT, class = CHAOS


;; ANSWER SECTION:
version.bind. 0S CHAOS TXT "
unknown"

 ANSWER SECTIONのversion.bind.の行の末尾が“9.2.0”から“unknown”に置き換わったことが確認できた。

(2) ゾーン転送の制限

 本来ゾーン転送は、スレーブ(セカンダリ)のネームサーバに対してのみ許可するようにすればよいが、事前調査段階での設定ではすべてのホストからゾーン転送が可能となっていた。

 以下の例では、ゾーン転送を許可するスレーブネームサーバをns1.example.net(172.16.0.53)のみに、また転送を許可するドメイン空間もexample.co.jpおよび0.168.192.in-addr.arpa (逆引き)に限定した設定である。

options {
     …… 省略 ……

     allow-transfer { none; };
};


zone "example.co.jp" IN {
     …… 省略 ……
     allow-transfer { 172.16.0.53; };
};


zone "0.168.192.in-addr.arpa" IN {
     …… 省略 ……
     allow-transfer { 172.16.0.53; };
};

 optionsのallow-transfer { none; };は、デフォルトでゾーン転送を全面禁止することを意味している。

sendmailの場合

 sendmailのバージョン情報を隠す場合は、sendmail.cfファイルのO SmtpGreetingMessage、 HReceived:、そしてhelpfileファイルの一部を修正する必要がある。O SmtpGreetingMessageはSMTPのコネクション時に、HReceived:はReceived:ヘッダ、そしてhelpfileはhelpコマンド実行時にそれぞれバージョン情報が表示される。

 なお、sendmail.cfの生成(修正)はツールのM4を使用する。

(1)O SmtpGreetingMessage(M4マクロ:confSMTP_LOGIN_MSG)の変更

 /etc/mail/sendmail.mcに以下の変数を追加する。追加する場所は同じdefineの設定がある末尾あたりがよいだろう。

 例:バージョン情報をunknownに変更する

define('confSMTP_LOGIN_MSG','unknown')dnl


(2)HReceived:(M4マクロ:confRECEIVED_HEADER)の変更

 confRECEIVED_HEADERのデフォルトで適用されている($v/$Z)の個所を変更する。変更前のReceived:フォーマットを以下に説明する。

 変更前:

Received: $?sfrom $s $.$?_($?s$|from $.$_)
     $.$?{auth_type}(authenticated)
     $.by $j ($v/$Z)$?r with $r$. id $i$?u
     for $u; $|;
     $.$b

 変更後:(バージョン情報をunknownに変更する)

Received: $?sfrom $s $.$?_($?s$|from $.$_)
     $.$?{auth_type}(authenticated)
     $.by $j (unknown)$?r with $r$. id $i$?u
     for $u; $|;
     $.$b

 上記の変更後のルールを、M4マクロのconfRECEIVED_HEADERとしてsendmail.mcファイルに追加する。追加する場所は同じdefineの末尾に追加するとよい。

define('confRECEIVED_HEADER','$?sfrom $s             $.$?_($?s$|from $.$_)
     $.$?{auth_type}(authenticated)
     $.by $j (unknown)$?r with $r$. id $i$?u
     for $u; $|;
     $.$b')dnl

(3)helpfileの変更

 helpfile(/etc/mail/helpfile)のバージョン情報を出力する個所($v)を変更するかコメントアウト(先頭に#を付加)する。以下の例はsendmailに関する情報を表示しないようにする方法だ。

 変更前:

smtp This is sendmail version $v
smtp Topics:
smtp HELO EHLO MAIL RCPT DATA
smtp RSET NOOP QUIT HELP VRFY
smtp EXPN VERB ETRN DSN AUTH
smtp STARTTLS
smtp For more info use "HELP <topic>".
smtp To report bugs in the implementation send email to
smtp sendmail-bugs@sendmail.org.
smtp For local information send email to Postmaster at your site.

 変更後:

#smtp This is sendmail version $v
smtp Topics:
smtp HELO EHLO MAIL RCPT DATA
smtp RSET NOOP QUIT HELP VRFY
smtp EXPN VERB ETRN DSN AUTH
smtp STARTTLS
smtp For more info use "HELP <topic>".
#smtp To report bugs in the implementation send email to
#smtp sendmail-bugs@sendmail.org.
smtp For local information send email to Postmaster at your site.

 上記では3行コメントアウトした。なお、編集した内容は保存した時点で反映される。

(4)確認

 確認の前に、編集保存したsendmail.mcからsendmail.cfを生成する。

# m4 /etc/mail/sendmail.mc > /etc/mail/sendmail.cf.new

 新しいsendmail.cfのテスト(-bt)を行った後、現状のsendmail.cfと置き換えsendmailを再起動する。

# /sbin/service sendmail restart

 以上の設定が終了したら、telnetおよびエラーメールをもう一度送って、バージョン情報が表示されなくなったことを確認する。

% telnet 192.168.0.10 25
Trying 192.168.0.10...
Connected to 192.168.0.10.
Escape character is '^]'.
220 unknown ESMTP
help
214-2.0.0 Topics:
214-2.0.0 HELO EHLO MAIL RCPT DATA
214-2.0.0 RSET NOOP QUIT HELP VRFY
214-2.0.0 EXPN VERB ETRN DSN AUTH
214-2.0.0 STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info
quit
221 2.0.0 www.example.co.jp closing connection
Connection closed by foreign host.

 これでバージョン情報が表示されなくなった。あるいはunknownとして表示されるようになった。

Received: from ns.example.co.jp ([192.168.0.10])
     by mail.crack.invalid (Postfix) with ESMTP id 8C2C16C8AF;
     Tue, 1 Oct 2002 04:35:40 +0900 (JST)
Received: from pop.example.co.jp (pop.example.co.jp [10.0.16.2])
     by ns.example.co.jp (unknown) with ESMTP id E825B72501;
     Tue, 1 Oct 2002 04:35:39 +0900 (JST)

 Received:ヘッダに記述されている、ns.example.co.jpが使用するMTAのバージョンがunknownになっているのを確認できた。


 今回は、Apache、BIND、sendmailにおけるバージョン情報を与えないための設定などの対策方法を紹介した。次回は、今回得た情報を基に、対象サーバに対して実際の攻撃手法とその対策を紹介する。

筆者紹介

三井物産株式会社GTIプロジェクトセンタ

主に、不正アクセス監視サービス、セキュリティ検査、セキュリティポリシー策定支援などのサービス提供している。また、セキュリティに関する教育サービスも実施中。

木村 靖(きむら やすし)

セキュリティコンサルタントとして、不正アクセス監視やセキュリティ検査 などに従事している。金融機関、官公庁、大手製造業などへのセキュリティシ ステムの導入、セキュリティ検査などの実績を持つ。



Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

Focus

- PR -

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。