Debian/GNU Linux で Webサーバ

環境

参考

目次


インストールするパッケージ

パッケージ名 sarge でのバージョン  
apache2 apache 2.0.54-4  
apache2-mpm-worker apache2-mpm-worker 2.0.54-4  
apache2-common apache2-common 2.0.54-4  
apache2-utils apache2-utils 2.0.54-4  
apache2-doc apache2-doc 2.0.54-4  

これらを aptitude, dselect, apt-get でインストールします。
doc 以外は依存関係がありますので、apache2 を選択すればインストールするように要求されます。

Debianの場合、インストールするだけで Apache は起動します。


設定

インストール後の設定では不十分なので、利用するネットワーク環境に合わせて変更します。
sarge の初期状態では、ルートも仮想サーバとして設定されています。
仮想サーバでも困ることはありませんので、この設定を基本にして変更していくことにします。

default の変更箇所

サイトに関する記述は、/etc/apache2/sites-available に置かれます。
default 設定も、ここに置かれています。 このファイルを直接編集しても構いませんが、後で仮想サーバを増やすのであれば、defailtファイルを別のファイル(例: svroot)にコピーして編集すると良いでしょう。 コピーして修正する場合は、sites-enabled/ のシンボリックリンクも修正する必要があります。

/etc/apache2/sites-enabled# ls -l
lrwxrwxrwx  1 root root 36 Jul  1 14:05 000-default -> /etc/apache2/sites-available/default
/etc/apache2/sites-enabled# rm 000-default
/etc/apache2/sites-enabled# ln -s /etc/apache2/sites-available/svroot 000-svroot
/etc/apache2/sites-enabled# ls -l
lrwxrwxrwx  1 root root 36 Jul  2 16:32 000-svroot -> /etc/apache2/sites-available/svroot
/etc/apache2/sites-enabled#

下記が、初期状態の /etc/apache2/sites-available/default の内容です。
黄色は、このサーバ用の設定です。 他では動作不良の原因となるかもしれません。

/etc/apache2/sites-available# cat default
NameVirtualHost *
<VirtualHost *>
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
                # This directive allows us to have apache2's default start page
                # in /apache2-default/, but still have / go to the right place
                RedirectMatch ^/$ /apache2-default/
        </Directory>

        ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
        <Directory "/usr/lib/cgi-bin">
                AllowOverride None
                Options ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature On

        Alias /doc/ "/usr/share/doc/"
        <Directory "/usr/share/doc/">
                Options Indexes MultiViews FollowSymLinks
                AllowOverride None
                Order deny,allow
                Deny from all
                Allow from 127.0.0.0/255.0.0.0 ::1/128
        </Directory>

</VirtualHost>
/etc/apache2/sites-available#
ServerAdmin, ServerName

もしサーバがインターネットに繋がるのであれば、ServerAdmin と ServerName が必要です。
このサーバの場合、サーバエイリアスとして www.gomimaki.inco.jp,Webサーバ管理者として webmaster というメールアドレスがありますので、各ディレクティブは

ServerAdmin webmaster@gomimaki.inco.jp
ServerName  www.gomimaki.inco.jp

となります。

RedirectMatch

Apache2をインストール直後にトップページを表示した時に、
あなたの予想に反して、このページが見えているでしょうか?
という内容が表示されたハズです。(インストール直後なので、予想に反していませんが ^^;)
これは、DocumentRoot で指定されたディレクトリ (/var/www/) の下にある apache2-default/ 以下のファイルが表示されたためです。
なぜ apache2-default ディレクトリを参照したか。 それは RedirectMatch ディレクティブがあるからです。 これをコメントアウト して設定を再ロードすれば 、/var/www ディレクトリのドキュメントを表示します。

                # in /apache2-default/, but still have / go to the right place
                #RedirectMatch ^/$ /apache2-default/
        </Directory>
ServerSignature

現時点でのApacheは、自分の設定のことを良くしゃべります。
/doc/ を表示をしてみると、ファイルやディレクトリが表示された下に、どんなモジュールがロードされているかを、これでもか!とばかりに並べてきます。 エラーの時にも同様に表示します。
あえてモジュール群を示して、攻撃しようとする者にきっかけを与えるのは、セキュリティ面でも好ましいことではありません。
通常の運用では不要でしょうから、Off にして止めてしまいましょう。

        LogLevel warn

        CustomLog /var/log/apache2/access.log combined
        ServerSignature Off

        Alias /doc/ "/usr/share/doc/"

厳密に言えば、これで完全に止まらない場合があります。
それはサーバ・サイド・インクルード (SSI) を使用している場合で、エラーメッセージ( /usr/share/apache2/error )を見ると、中でサーバの情報を表示するように記述がされています。
もっとも、これらのエラーメッセージは、自分で変えることができるので、どんどんと変えていってしまえば良いと思います。

/doc/ にアクセスできない

/doc/ が表示されなかった人は、たぶんApacheをインストールしたコンピュータ以外からアクセスしたのでしょう。
残念ですが、この時点では、Apache はローカルホスト(127.0.0.1)以外からの /doc/ に対する要求を受け付けないようになっています。
他の設定でもドキュメントを参照したいので、このアクセス制限を解除します。

まず、あなたがブラウザを起動したコンピュータのIPアドレスサブネットマスクを調べてください。 LAN内にあるProxyサーバを経由してアクセスしたのでしたら、そのIPアドレスとサブネットマスクを使います。
私のコンピュータは、192.168.0.16 で 255.255.255.0 にありますので、この情報を例に設定します。

        Alias /doc/ "/usr/share/doc/"
        <Directory "/usr/share/doc/">
                Options Indexes MultiViews FollowSymLinks
                AllowOverride None
                Order deny,allow
                Deny from all
                Allow from 192.168.0.0/255.255.255.0 127.0.0.0/255.0.0.0 ::1/128
        </Directory>

これでサブネット 129.168.0.0 のコンピュータからもアクセスできるようになりました。


apache2.conf の変更箇所

必要が無ければ、あえて変更しなくても良いところばかりです。
マシンパワーに合わせたり、エラーメッセージやログの取り方を変える程度でしょう。

HostnameLookups

"ON" でアクセスログに残すIPアドレスをホスト名に変換します。
デフォルトはDNSへの負荷や余計な遅延を低減するため、"OFF" になっています。
ログのIPアドレスからホスト名に変換する logresolve というユーティリティがありますので、"OFF" であっても問題はないでしょう。 Debian では、logresolve は /usr/sbin にあります。
"Double" は、逆引き結果を正引きします。 多くは、ここまでのチェックをする必要は無いと思われます。

AddHandler cgi-script .cgi

デフォルトではコメントアウトされています。
CGIスクリプトに付けられている拡張子を記述しますが、必要であれば /etc/apache2/sites-available/default または .htaccess に記述するのが良いと思います。

その他

SSIを有効にしてある場合に、エラーメッセージが変わります。
このエラーメッセージは各国語に対応しています。
標準のエラーメッセージを望むならば、該当する設定をコメントアウトすると良いでしょう。
mod_include.c と ErrorDocument をキーワードにファイル内を検索すると容易に探せます。

旧型コンピュータなど能力が低い機材をサーバにしている場合は、httpデーモンの初期起動数や最大起動数を減らすなどの工夫が必要になるでしょう。
これは、Server-Pool Size Regulation に記述されています。
このサーバではデフォルトでも問題なさそうなので、そのまま使用しています。

ワームなどのアクセスでログが見づらくなるのを防ぐために、LogFormat や CustomLog を修正して、ワームに関するアクセスログを分離する事が出来ます。
これについては、Virus/Worm対策にまとめます。

ユーザディレクトリに関する設定

設定ファイル userdir.conf は /etc/apache2/mods-available/ にあります。
ユーザディレクトリに public_html ディレクトリを作れば、/~ユーザ名 でアクセス可能です。
そのままではファイル一覧が表示されてしまうので、index.html ファイル(空で構いません)を作っておくと良いでしょう。
また、.htaccess ファイルへの記述で比較的自由にアクセス制御できるような設定がされているので、特に変更を加える必要は無いと思われます。


動作確認

では、設定をロードして試してみましょう。

# /etc/init.d/apache2 reload
Reloading web server config...done.

もし "done." が表示されなければ、変更した周辺に記述ミスがあるはずです。
再度確認してください。

試しに、簡単なHTMLファイルを表示してみましょう。

<html>
<head>
<title>Hello, World.</title>
</head>
<body>
<p>Hello, World.</p>
</body>
</html>

上記を index.html という名前で /var/www に保存した後、ブラウザでサーバにアクセスしてください。 他のHTMLドキュメントがあるなら、それを利用しても良いでしょう。
同様に、/doc/ にもアクセスして、各ディレクトリが表示されることを確認してください。


Virus/Worm対策

サーバを外部からアクセス可能して幾日か後にログを見ると、意図しないアクセスの記録がある場合があります。
それが(きっと)Virus や Worm でしょう。 そのほとんどがエラーになっているので気にすることはありませんが、それでもログが見づらくなるのはイヤなものです。
CodrRed や NIMDA も数は減りましたが、今でも来ますし、昨年辺りは一度のアクセスで巨大なアクセスログ(約32kB)を残す Gaobot とか言うモノも出てきました。
これら Worm に関する情報は、検索エンジンの世話になってください。
(Gaobot IIS WebDAV 辺りがキーワードになるでしょう)

先ずは、その巨大な残骸を残すヤツを何とかしましょう。
この手のアクセスは、バッファに取り込めなくてエラーになっているので、パターンマッチは効きません。
/etc/apache2/apache2.conf の LogFormat を修正して、条件付きロギングにしてしまいましょう。
LogFormat "%h %l %u %t \"%r\" 〜 の %r が「リクエストの最初の一行」なので、エラー414の時は%rを記録しないにしてしまえば良いという事にして %!414r と記述します。
注意:下記の例では、\マークになっていますが、Linux ではバックスラッシュになります。)

# vi /etc/apache2/apache.conf
    :
    :
# The following directives define some format nicknames for use with
# a CustomLog directive (see below).
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
    :
    :

ログは、こんな感じに圧縮されます。
何が来たか判別できませんが、「414=妙なアクセス」という事で、よしとしましょう。

61.80.39.130 - - [12/Aug/2005:15:51:02 +0900] "-" 414 250 "-" "-"

最近は、Error404 で巨大なログ(こちらは少々カワイくて 6.4kB)を残す WinntAutoAttack とか 言うヤツも出てきた様子。(2004年の話だって? 今でも来ているんですっ!)
こちらはオーバーフローしていないので、ログファイルを分離してしまいましょう。
そうすれば、観察しやすい上に、要らなくなれば簡単に捨てられます。(観察するか?)
(この記述を応用すると、ログに残さない事も可能です)

Wormチェックの設定ファイルは、直接 apache2.conf に記述しても良いのですが、独自の設定を見やすくするため、Debian流(?)に別ファイルに記述します。
まずは、チェック用のファイル。 /etc/apache2 にディレクトリ usrdef を作って置いています。

# vi /etc/apache2/usrdef/checkworm.conf
#
# Worm/Virus check pattern
#

# WINNTAutoAttack
SetEnvIfNoCase Request_URI "NULL\.IDA" worm

# CodeRed
SetEnvIfNoCase Request_URI "^/MSADC/" worm
SetEnvIfNoCase Request_URI "/default\.ida" worm

# NIMDA
SetEnvIfNoCase Request_URI "root\.exe" worm
SetEnvIfNoCase Request_URI "cmd\.exe" worm
SetEnvIfNoCase Request_URI "Admin\.dll" worm
SetEnvIfNoCase Request_URI "/_mem_bin/" worm
SetEnvIfNoCase Request_URI "/_vti_bin/" worm
SetEnvIfNoCase Request_URI "/c/" worm
SetEnvIfNoCase Request_URI "/d/" worm
SetEnvIfNoCase Request_URI "/msadc/" worm
SetEnvIfNoCase Request_URI "/scripts/" worm

パターンマッチのキーワードはログから拾ったので、ディレクティブは SetEnvIf でも良かったのですが、念のために大文字小文字を区別しない SetEnvIfNoCase を使いました。

この設定ファイルを取り込む Include 文を apache2.conf の末尾に記述します。

# vi /etc/apache2/apache2.conf
    :
    :
# Include other configurations
# Worm/Virus check
Include /etc/apache2/usrdef/checkworm.conf
# original configurations
Include /etc/apache2/usrdef/userdefs.conf

# Include the virtual host configurations:
Include /etc/apache2/sites-enabled/[^.#]*

また、sites-available/default 内でログを残す指示をする CustomLog も修正します。
Worm専用ログファイル worm.log も忘れずに追加します。

# vi /etc/apache2/sites-available/default
    :
    :
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined env=!worm
        CustomLog /var/log/apache2/worm.log combined env=worm
        ServerSignature On
    :
    :

これで、access.log はスッキリして、VirusやWormの痕跡は worm.log に記録されます。
設定をロードすれば完了です。

ログの結果を見ると、少々気になる振る舞いをしていますが、まぁ良いでしょう。
おいおい直して行こうと思います。