連載
» 2003年06月28日 00時00分 UPDATE

止められないUNIXサーバのセキュリティ対策(2):ソフトウェアの現状確認とアップグレード (1/2)

[木村靖,三井物産GTI]
※ご注意
本稿の内容を検証する場合は、必ず影響を及ぼさない限られた環境下で行って下さい。また、本稿を利用した行為による問題に関しましては、筆者および株式会社アットマーク・アイティは一切責任を負いかねます。ご了承ください。

利用サービスのセキュリティ強化

 「第1回 不要なサービスの停止こそ管理の第一歩」で説明した不要なサービス(待機ポート)の停止によって、対象サーバへの侵入の可能性を少しでも減らすことができた。しかし、それだけでは十分に対策したとはいえない。なぜなら、いくら不要なサービスを停止したからといって、実際に利用しているサービス自身に侵入可能なセキュリティ上の欠陥(セキュリティホール)があったとしたら元も子もないからだ。

 そこで今回は、実際に利用しているサービス自身のセキュリティの向上と維持のために欠かせない、ソフトウェアのアップグレードについて説明する。

アップグレードの前に

 ソフトウェアのアップグレードを行うとなると、一時的ではあるがサービスを停止してしまうことになる。また、アップグレードすることにより、関連するサービスが突然動かなくなる可能性もある。

 それらを踏まえると、サービスを止めることができない、あるいは長時間止めることのできない基幹サーバなどでは、おいそれとアップグレードを行うことができないのが現状だ。いざ行うにしても、事前に計画を練り十分に検証をしてから実施するのが通常だろう。

 だが、そういった事情に関係なく、セキュリティホールというのは突然やってくる。そのため侵入などの被害を未然に防ぐために、簡単には停止できない基幹サーバでさえも緊急対策を余儀なくされる場合がある。そのような事態に備え、迅速かつ的確な対策が行えるように、あらかじめ以下の内容を想定または確認しておくとよい。

●緊急対策、アップグレードに備えて

 緊急対策またはソフトウェアのアップグレードを迅速かつ的確に行うためにも、現状のソフトウェア(特に利用中のサービス)のバージョンやファイル構成(特に設定ファイル)は、事前にしっかりと把握する必要がある。

  利用サービスの現状の確認方法については後述する。

●セキュリティホールの内容確認

 セキュリティホールが発見された時点で、即座に次の内容を確認し、緊急対策が必要かどうかを判断する。

  • 管理するサーバが影響を受けるかどうか
  • 外部からの攻撃が可能か (攻撃の脅威を外部からのみとした場合)
  • 対策版のバージョン、パッチ(修正プログラム)は提供されているか

 利用中のOSやソフトウェアが対象外、あるいは内部からのみ攻撃の影響を受ける脆弱性の場合は緊急対策を行う必要はないだろう*1。それ以外、つまり何らかの対策が必要な場合は、次に示す暫定的な対策を検討する必要がある。

*1
最初に報告された時点では対象外だったが、その後の調査結果で実は脆弱性が含まれていたというケースがまれにある。そのため万全を期すのであれば対策を行った方がよいだろう。

●暫定的な対策

 アップグレードを行う前、あるいは現状としてアップグレードによる対策が行えない場合は、次に示す暫定的な対策で一時的に回避できるかどうかを判断する。

  • サービスを停止する
  • 設定による回避

 前者はサービスが完全に止まってしまうことから、そのほかの対策方法が存在しない場合に行う最終手段といえる。

 後者は実際に行えるかどうかが限られてくる。多くのソフトウェアは、設定を反映させる場合に再起動を必要としないため*2、既存の通信(サービス)に影響を与えずに、対策を行うことができる。もちろん中には再起動を必要とする設定や設定内容に記述ミスがあった場合は、サービス本体に影響が及んでしまうので慎重に行う必要がある。

*2
最近の多くのソフトウェアは、HUPシグナルを受け取ることで設定内容を再読み込みする。なお、ソフトウェアにHUPシグナルを送る場合は、killコマンドなどを利用する。
# kill -HUP ソフトウェアのプロセスID

現状を確認する

 ソフトウェアのアップグレードを迅速かつ的確に行うためには、普段から利用するサービスの構成を十分に把握しておく必要がある。ここでは、各種OSで利用されるパッケージシステムを用いた、基本的な確認方法をいくつか紹介する。

●RPMコマンドでファイル構成を確認

 RPM(Red Hat Package Manager)でソフトウェアを管理している場合、rpmコマンドを使用して該当するパッケージ名のバージョンやファイル構成を確認する。

  • インストール済のすべてのRPMパッケージをリスト表示する
$ rpm -qa

-q:問い合わせ

-a:インストール済のすべてのパッケージを表示


  • 情報表示とインストール先の確認

指定したパッケージ名のバージョン情報や説明、インストール先、依存するパッケージを確認する。

$ rpm -qilR パッケージ名

-q:問い合わせ

-i:パッケージ情報の表示

-l:ファイルの一覧表示

-R:必要となるパッケージを表示


例:パッケージ名apacheの情報およびインストール先を表示

$ rpm -qilR apache
Name : apache Relocations: (not relocateable)
Version : 1.3.23 Vendor: Red Hat, Inc.
Release : 11 Build Date: Wed Apr 10 03:57:08 2002
Install date: Tue Sep 24 08:39:53 2002 Build Host: stripples.devel.redhat.com
Group : System Environment/Daemons Source RPM: apache-1.3.23-11.src.rpm
Size : 1248566 License: Apache Software License
Packager : Red Hat, Inc. <http://bugzilla.redhat.com/bugzilla>
Summary : The most widely used Web server on the Internet.
Description :
Apache is a powerful, full-featured, efficient, and freely-available
Web server. Apache is also the most popular Web server on the
Internet.
/etc/httpd
/etc/httpd/conf
/etc/httpd/conf/access.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/httpd/conf/srm.conf
……省略……

なお、パッケージファイル名から確認したい場合は、-pオプションを付加すればよい。

  • 検証

パッケージデータベース内から、指定したパッケージ名に含まれるすべてのファイルを検証し、インストール時と情報が異なるファイルを表示する。

$ rpm -V パッケージ名

出力内容は以下の形式で出力される。

SM5DLUGT c ファイル名
文字 出力条件
S ファイルサイズが異なる場合
M パーミッションが異なる
5 MD5チェックサムが異なる
D デバイスが異なる
L シンボリックリンクのパスが異なる
U ユーザー所有者が異なる
G グループ所有者が異なる
T 更新日時が異なる
. 検査にパスした場合
? ファイルを読み込めなかった場合
c 設定ファイルである

例:パッケージ名apacheの検証を行う

$ rpm -qa | grep apache
apache-1.3.23-11
apache-devel-1.3.23-11
$ rpm -V apacheS.5....T c /etc/httpd/conf/httpd.conf
........T c /etc/rc.d/init.d/httpd
...?..... /usr/sbin/suexec

パッケージ名apacheに含まれるすべてのファイルの中から、上記3つのファイルがインストール時とは異なる(手が加えられた)ことが分かる。

なお、rpm -Vを改ざんを検知する目的で利用する場合、rpmコマンドは CD-ROMなど安全なメディアに格納されたスタティックバイナリのものを使う必要がある。また、RPMデータベース自身が改ざんされている可能性も念頭におく必要がある。

●Solarisパッケージ(pkginfo、pkgchk)

 Solarisバイナリパッケージとしてインストールされたソフトウェアは、pkginfoまたはpkgchkコマンドを使用することで該当するパッケージ名のバージョンやファイル構成の確認が行える。

  • インストール済のSolarisパッケージを表示する
% pkginfo
  • 指定パッケージの詳細表示
% pkginfo -l パッケージ名

-l:詳細表示


例:インストール済みパッケージの詳細表示

% pkginfo -l GNUgcc
   PKGINST:  GNUgcc
      NAME:  GNU gcc 2.95.2 SPARC 32bit Solaris 8
  CATEGORY:  utility
      ARCH:  sparc
   VERSION:  2.95.2
    VENDOR:  GNU
……以下省略……

なお、「パッケージ名」を省略するとインストール済のすべてのパッケージの詳細が表示される。

  • 特定ファイルからパッケージ名を得る
% pkgchk -lp ファイルのパス

-l:指定したファイルのパッケージ情報を表示

-p:ファイルの絶対パスを指定


例:ファイル/usr/local/bin/gccからパッケージ名(GNUgcc)を得る

% pkgchk -lp /usr/local/bin/gcc
Pathname: /usr/local/bin/gcc
Type: regular file
Expected mode: 0755
Expected owner: root
Expected group: root
Expected file size (bytes): 251728
Expected sum(1) of contents: 15648
Expected last modification: Mar 22 06:00:27 2000
Referenced by the following packages:
        GNUgcc
Current status: installed
  • 検証

レジストリに登録されている情報と初期状態のパッケージ情報を比較し、ファイルのサイズ、所有者、グループ権限、チェックサムをチェックする。異なる場合にその内容を出力する。

% pkgchk -m 初期状態のパッケージディレクトリ/pkgmap

-m:pkgmap ファイルと照合


照合した結果、情報が異なる場合にその内容が出力される。

例:パッケージGNUgccを検証する

% compress -d < GNUgcc.2.95.2.SPARC.32bit.Solaris.8.pkg.tar.Z | tar xvf -
% pkgchk -m GNUgcc/pkgmap
ERROR: /usr/local/bin/gcc
    group name  expected  actual
    file size <251728> expected <4> actual
    file cksum <15648> expected <311> actual

上記の例では、グループ名、ファイルサイズ、チェックサムが初期状態とは異 なる(手が加えられている)と示している。

なお、pkgchk -mを改ざんの検知として利用する場合、pkgchk はCD-ROMなどの安全なメディアに格納されているスタティックバイナリのものを使うようにすること。また、Solarisパッケージのレジストリは単なるテキストファイル (/var/sadm/install/contens)であることから、pkgchk -mで検証する際はリジストリが改ざんされている可能性を念頭に置きながら行うこと。

コラム セキュリティパッチの適用状況を確認する(Patch Check)

 Solarisを運用管理する読者ならSun Microsystems提供のPatch Checkというツールを耳にしたことがあるかもしれない。このPatch Checkを使うことで、Solarisのセキュリティパッチの適用状況を確認することができる(参照http://jp.sunsolve.sun.com/pub-cgi/show.pl?target=patchk)。

 このツールは、Solaris 2.3以上、Perl 5、および必要とするファイル*3さえ揃っていれば、Solaris以外のOS上でも実行することができる。

*3 Patch Check で必要となるファイル

(1)パッチ適用参照ファイル(patchdiag.xref)

ftp://sunsolve.sun.com/pub/patches/patchdiag.xref

(2)パッチ適用情報(対象サーバ上のshowrevコマンドの出力結果)

% showrev -a > showrev-a.txt

(3)パッケージ情報(対象サーバ上のpkginfoコマンドの出力結果)

% pkginfo -l > pkginfo-l.txt

例:Solaris 8(SPARC)の場合

% cd patchcheck_1.2
% perl patchk.pl -x ./patchdiag.xref -p ./pkginfo-l.txt ./showrev-a.txt 
5.8 sparc atmarkit > result.txt

pkginfo-l.txt:pkginfo -lの出力結果ファイルを指定

showrev-a.txt:showrev -aの出力結果ファイルを指定*4

atmarkit:ホスト名を指定


*4
マニュアルによればshowrev -pだが、プログラム自体Patch:で始まる行のみ取得するようになっているので、-aでも問題ない。むしろ、-aだとホスト名、OSバージョン、アーキテクチャなど、Patch Check実行時に必要な情報が記録されているので都合がよい。

 以下を実行すると reuslt.txt に結果が出力される。その中で“UNINSTALLED SECURITY PATCHES” に未適用のセキュリティパッチが出力される。

% perl patchk.pl ... > result.txt
% less result.txt
……途中省略……
UNINSTALLED SECURITY PATCHES
NOTE: This list includes the Security patches that are also Recommended
Patch  Ins Lat Age  Require    Incomp  Synopsis
  ID   Rev Rev        ID         ID
------ --- --- --- --------- --------- -----------------------------------------
108528 N/A  19 117 111111-03 109079-01(or newer)SunOS 5.8: kernel update patch
                   108987-09
                   111293-01
                   111310-01
108652 N/A  65 114                     X11 6.4.1: Xsun patch
108773 N/A  17 154                     SunOS 5.8: IIIM and X Input & Output Method patch
108827 N/A  40 131 108528-13 109079-01 (or newer)SunOS 5.8: /usr/lib/libthread.so.1 patch
                   108989-01
108835 N/A  04 132 108827-30           CDE 1.4: dtcm patch 
拡大

 なお、patchk.plの詳細は、-hオプションを指定するか、ドキュメントuserguideを参照のこと。


*BSDパッケージ(packages、ports、pkgsrc)

 *BSDで利用されるバイナリパッケージ、ports、pkgsrcでインストールされたソフトウェアは、pkg_infoコマンドを使用することで該当するパッケージ名のバージョンやファイル構成の確認が行える。

  • インストール済のパッケージを表示
% pkg_info
  • 情報表示とインストール先の確認

指定したパッケージ名のバージョン情報、説明、依存関係にあるパッケージ、インストール先を確認する。

% pkg_info -cndL パッケージ名(NetBSDの場合)
% pkg_info -cRdL パッケージ名((FreeBSDの場合)

-c:パッケージの簡易説明(Comment:)

-n|-R:必要となるほかのパッケージ(Requires:, Required by:)

-d:パッケージの詳細詳細(Description:)

-L:ファイルの一覧表示(Files:)

-g:チェックサムの確認(FreeBSDのみ)


例:パッケージ名apacheの場合

% pkg_info -a | grep apache
apache-1.3.27nb4 Apache HTTP (Web) server
% pkg_info -cndL apache 
Information for apache-1.3.27nb4: 
Comment:
Apache HTTP (Web) serverRequires:
expat>=1.95.2
libmm>=1.2.1Description:
The Apache HTTP Server Project is a collaborative software development
effort aimed at creating a robust, commercial-grade, featureful, 
and
freely-available source code implementation of an HTTP (Web) server.Homepage:
http://httpd.apache.org/Files:
/usr/pkg/lib/httpd/httpd.exp
/usr/pkg/lib/httpd/mod_define.so
/usr/pkg/lib/httpd/mod_proxy.so
……省略……

コラム パッケージの脆弱性状況を確認する(audit-packages)

 NetBSDには、audit-packagesという便利なシェルスクリプト(pkgsrc:security/audit-packages)が用意されている。これはpkgsrcでインストールしたソフトウェアのバージョンから脆弱性が含まれるかどうかを判断し、含まれる場合は表示する。

% audit-packages
Package ucd-snmp-4.1.2 has a weak-authentication vulnerability, 
see http://www.cert.org/advisories/CA-2002-03.html
Package ucd-snmp-4.1.2 has a denial-of-service vulnerability, 
see http://www.cert.org/advisories/CA-2002-03.html
Package ucd-snmp-4.1.2 has a remote-user-shell vulnerability, 
see http://www.securityfocus.com/archive/1/248141
Package rsync-2.4.6 has a remote-user-file-view vulnerability, 
see http://lists.samba.org/pipermail/rsync-announce/2002-March/000006.html
……省略……

 なお、audit-packagesの脆弱性情報は、vulnerabilitiesというファイル(デフォルト /usr/pkgsrc/distfiles/vulnerabilitiesに保存)から得ている。このファイルを常に最新に保つ場合は、ftp://ftp.netbsd.org/pub/NetBSD/packages/distfiles/vulnerabilitiesまたはミラーサイトより入手するか、以下のとおりcronを仕掛け定期的に取得すればよい。

0 3 * * * /usr/pkg/sbin/download-vulnerability-list >/dev/null 2>&1

 また、毎日audit-packagesを実行してもらいたい場合は、/etc/security.localに以下を追加する。

if [ -x /usr/pkg/sbin/audit-packages ]; then/usr/pkg/sbin/audit-packages
fi

       1|2 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

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

Focus

- PR -

RSSについて

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

メールマガジン登録

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