Apacheインストール

インストール
設定ファイルの記述
自動起動用スクリプトの作成
自動起動するようにサービスとして登録
ログファイルの設定
  ・ログのローテーション設定
  ・ワームのログを分ける
セキュリティ対策
  ・エラーページにサーバのバージョン等を表示しない
  ・CGIプログラムなどをコンテンツユーザーの権限で実行するようにする
  ・PHPのセーフモードをOnにする
機能拡張
  ・Apacheをmod_perl対応にする
  ・ApacheでSSL(SNI)設定
  ・ApacheとRailsをmod_proxyで連携する


◆インストール

cd /usr/local/src
tar zxfv httpd-2.0.50.tar.gz
cd /usr/local/src/httpd-2.0.50
./configure --enable-module=so --enable-ssl --with-ssl=/usr/local/ssl
make
make install

 ※せっかくApache2にしたので mpm=worker で動かしたいが、マルチスレッド対応でないPHP関数が存在するようなのでとりあえず保留。

   [マニュアルより引用]
いくつかのオーペレーティングシステムでflock() はプロセスレベルで実装されています。
ISAPIのようなマルチスレッド型のサーバーAPIを使用している場合、同じサーバーインスタンスの並列スレッドで実行されている
他のPHPスクリプトに対してファイルを保護する際に flock()を使用することはできません!


◆設定ファイルの記述
/usr/local/apache2/conf/httpd.conf

DocumentRoot "/xxx/xxx/xxx" ・・・  必要に応じて変更
User httpd  ・・・  Apacheの実行ユーザ(事前にユーザを作成しておく)
Group httpd  ・・・   〃 実行グループ
LanguagePriority ja en ca cs da de el eo es et …  ・・・  jaを一番前に
#AddDefaultCharset ISO-8859-1  ・・・  コメントアウト
ServerTokens Prod  ・・・  クライアントに返すサーバ情報はプロダクト名のみ
ServerSignature Off  ・・・  エラーページ等にサーバ情報を表示しない

/usr/local/apache2/conf/mime.types

application/x-httpd-php php    ・・・php用の設定を追加 


◆起動スクリプトの作成

cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd  ・・・ apachectlをコピーして作成

◆起動スクリプトを編集(chkconfigからメンテできるように)
/etc/init.d/httpd

#!/bin/sh
#
# chkconfig: 345 90 10    ・・・ 起動するランレベル サービス起動する順番 サービス停止する順番
# description: Apache web server
# processname: httpd


◆自動起動するようにサービスとして登録

chkconfig --add httpd       ・・・  サービスに httpd を追加



◆ログのローテーション設定
(アクセスログが肥大化しすぎないように一定間隔でローテーションするように設定。)
/etc/logrotate.d/httpd を以下の内容で新規作成

/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log {
  weekly
  rotate 8
  create
  missingok
  sharedscripts
  postrotate
  /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid` >/dev/null 2>&1
  endscript
} 


◆ワームのログを分ける
  サーバを外部に公開して1週間たらずで不振なアクセスがあった。

218.246.33.41 - - [02/Sep/2005:08:30:39 +0900] "GET /NULL.IDA?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC%u0aeb
%ub890%u898b%u77e8%u0000%u0000%u838b%u0094%u0000%u408b%u0564%u0150%u0000%ue0ff%u9090=x&\x90\x90\x90\
x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\
x90\x90\x90\x90\xeb\t\x90\x90\x90_\xeb\b\x90\x90\x90\xe8\xf5\xff\xff\・・延々と続いて・・・・最後にcmd.exe$ HTTP/1.1"  404 206

  しかも何度か連続してアクセスしてきている。

  気になったのでCyberSyndorome*1で調べてみると中国からのアクセスらしい。
  さらにググってみると MicrosoftのWebサーバ、IIS(Internet Information Service)へワーム攻撃らしい。。(てゆーかIISちゃうし。)
  外部と接続はしてるけど検索エンジンにサイトを登録したりとか別にしてないし、する予定もないが、
  (なぜか)ログ解析はしてるのでアクセスログを汚されたくない。。ので、このログを別ファイルに分ける設定をします。

  [httpd.confを編集] ※赤字部分を追加(または変更)

・
・
<font color=red><IfModule mod_setenvif></font>
<font color=red>SetEnvIf Request_URI "default\.ida" worm</font>  こーゆーのもあるらしい
<font color=red>SetEnvIf Request_URI "null\.ida" worm</font>
<font color=red></IfModule></font>
・
・
<font color=red>CustomLog logs/access.log combined env=!worm</font>
<font color=red>CustomLog logs/worm.log combined env=worm</font>
・
・


◆セキュリティ対策


  (1) エラーページにサーバのバージョン等を表示しない。

  [httpd.config]

・
ServerSignature Off
・
ServerTokens Prod

※エラー時(403 Not Found など)にサーバのバージョン等が表示されてしまうと、
 そのバージョンにセキュリティホールなどがある場合は、攻撃対象になってしまうので非表示にしておく。

※これでクラッカーなどによる被害を防げる訳ではありません。 セキュリティーホールは必ず塞ぐ必要がある。


  (2) 共用サーバの場合は、CGIプログラムなどをApacheの実行ユーザー権限ではなく、
    それぞれのコンテンツユーザーの権限で実行するようにする。

make distclean
./configure --enable-module=so \
--enable-ssl \
--with-ssl=/usr/local/ssl \
--enable-suexec \
--with-suexec-caller=nobody \
--with-suexec-docroot=/var/www \
--with-suexec-userdir=web \
--with-suexec-uidmin=500 \
--with-suexec-gidmin=500 \
--with-suexec-safepath=/usr/local/bin:/usr/bin:/bin \
--with-suexec-bin=/usr/local/apache2/bin/suexec
make
make install

 --with-suexec-caller ・・・ httpd.conf で指定するapahcheの実行ユーザ
 --with-suexec-uidmin ・・・ CGI/SSI プログラム実行を許可するユーザ ID(グループID)の最小値。
 --with-suexec-gidmin     (システム用のアカウントを閉め出すのに有効。)

#!/usr/bin/perl print "Content-type: text/html\n\n"; print `whoami`;

こんなカンジのCGIを用意して確認。
Apacheの実行ユーザ(httpdとか)でなく、コンテンツユーザのIDが表示されればOK。

   suexec を使用するには、UserDir で行う方法と、VirtualHostで行う方法がある。

    (a)バーチャルホストで行う方法。(とりあえず)

    [httpd.config]

NameVirtualHost *:80
<VirtualHost *:80>
ServerAdmin info@example.com
DocumentRoot /home/example/www
ServerName www.example.com
ErrorLog logs/example.com-error_log
TransferLog logs/example.com-access_log
</VirtualHost>

<VirtualHost *:80>
ServerAdmin info@example2.com
DocumentRoot /home/example2/www
ServerName www.example2.com
ErrorLog logs/example2.com-error_log
TransferLog logs/example2.com-access_log
SuexecUserGroup example2 example2
UserDir disable
<Directory "/home/example2/www">
Options +ExecCGI
AddHandler cgi-script .cgi
</Directory>
</VirtualHost>

SuexecUserGroupにてCGI を実行するユーザを指定した場合のみ suexecが有効となる。
この場合、 /home/example/www 以下のcgi は、httpd.conf で指定した
Apacheの実行ユーザの権限で実行されるが、
/home/example2/www 以下のcgi は、ユーザ example2 権限で実行される。


  (3) PHPのセーフモードをOnにする。
   ※suEXECモジュールでは、phpの実行権限を変えることができないので、PHPのセーフモードをOnにする。
   ./configure --help してみると、
   --enable-safe-mode Enable safe mode by default.
   と表示されたので、どうやらデフォルトで使用可能になっているようなので、php.ini をいじって safe_mode = "1" に変えてapache再起動。

   [マニュアルより引用]
-rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php
-rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd

以下のscript.php を実行すると、
<?php
 readfile('/etc/passwd');
?>

セーフモードが有効な場合、以下のようなエラーが出力されます。
Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2

   と同じようになったので OK。

   と思ったら、「セーフモードだとファイルの新規作成ができない」という不具合に遭遇!
   調べてみると、やっぱり新規作成はできないようだ(TT)
   かなり気まずいので、セーフモードはとりあえず保留。

   [メモ]

 サイトのアイコンを変えるには、自分で作った(もしくはどっかからパクッてきた)アイコンファイルを
 favicon.icoというファイル名に変えてWEB公開しているディレクトリに置いておく。

  [アイコンを簡単に作れるサイト]
   http://www.chami.com/html-kit/services/favicon/

*1 http://www.cybersyndrome.net/

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2009-06-11 (木) 00:48:27 (5427d)