1. ports install
apache は ports でインストールします。
apache2.2 の名称は apache22 となっています。
インストール後に、以下のディレクトリやコンフィグレーションファイルが出来ているはずです。
/usr/local/etc/apache22/Includes/ ← Include ファイル用
/usr/local/etc/apache22/Includes/no-accf.conf
/usr/local/etc/apache22/envvars.d
/usr/local/etc/apache22/extra/ ← 基本設定以外のもの
/usr/local/etc/apache22/extra/httpd-autoindex.conf
/usr/local/etc/apache22/extra/httpd-dav.conf
/usr/local/etc/apache22/extra/httpd-default.conf
/usr/local/etc/apache22/extra/httpd-info.conf
/usr/local/etc/apache22/extra/httpd-languages.conf
/usr/local/etc/apache22/extra/httpd-manual.conf
/usr/local/etc/apache22/extra/httpd-mpm.conf
/usr/local/etc/apache22/extra/httpd-multilang-errordoc.conf
/usr/local/etc/apache22/extra/httpd-ssl.conf
/usr/local/etc/apache22/extra/httpd-userdir.conf
/usr/local/etc/apache22/extra/httpd-vhosts.conf
/usr/local/etc/apache22/httpd.conf ← おおもとの設定用"
/usr/local/etc/apache22/magic
/usr/local/etc/apache22/mime.types
2. httpd-default.conf 設定
/usr/local/etc/apache22/extra/httpd-default.conf にデフォルトの設定を記述しています。
セキュリティ対策のために以下の設定を変更することをおすすめします。
ServerTokens Full
ServerSignature On
HostnameLookups Off
を以下のように変更します。
ServerTokens ProductOnly
ServerSignature Off
HostnameLookups On
ServerTokens は、クライアントに返信するサーバ応答ヘッダに含める情報を制御します。デフォルトでは、apacheのバージョン、OS、PHP のバージョンなど、サーバの詳しい情報をクライアントに送り返す状態になっています。これを ProductOnly にすると返信する内容はサーバが apache であるということのみでバージョンに関する情報等も返しません。
ServerSignature を Off にすると、サーバエラー発生時にサーバのアドレスやポート番号を表示することを抑止します。
HostnameLookups は、アクセスしてきたユーザをIPアドレスから、ドメインネームに変換するかしないかを決めています。この設定を行うと、apache の出力するログに、アクセスしてきたユーザのドメインネームを記録することが出来るようになりますので、アクセスログの解析を行いたいのであれば、On にしておくべきでしょう。
いささかネットワークに負荷がかかりますが、アクセスログの記録から後で逆引きすることも可能ですので、この設定をおすすめします。
3. httpd.conf 設定
/usr/local/etc/apache22/httpd.conf が大元のコンフィグレーションファイルです。
以下のように編集します。
ServerAdmin you@your.address
の you@your.address の部分を WEB サーバ管理者のメールアドレスに変えます。
変更しなくてもよい個所ですが、
User www
Group www
の個所は、WEB サーバに外部からアクセスしてくるユーザの、グループは www で、ユーザは www ということを示しています。
WEB サーバ設定後、サーバ内のファイルに書き込みをさせる場合、その所有者を www:www にする必要があることになります。サーバ内で、データベースを立ち上げて、そのデータベースを外部公開する場合も、www:www に対して、なんらかのの権限を与えることが必要です。
下も変更しなくてもよい個所ですが、
DocumentRoot "/usr/local/www/apache22/data"
の部分は、デフォルトの WEB 用ディレクトリを指します。
つまり、DNS サーバの設定で、www.仮名.ne.jp の記述をしているかと思いますが、そうすると http://www.仮名.ne.jp/ でまず /usr/local/www/data/ を見に行くことになっているわけです。
下は変更すべきです。
<Directory "/usr/local/www/apache22/data">
・・・
Options Indexes FollowSymLinks
・・・
AllowOverride None
・・・
Order allow,deny
Allow from all
</Directory>
Options の Indexes は、/ で参照されたときに DirectoryIndex(例:index.html)がない場合には、サーバがそのディレクトリ以下のファイルを表示することを許可します。この場合、そのディレクトリの中身が丸見えになってしまいますので、削除すべきです。
Order は、アクセスの許可/非許可を指定する順番を示します。この例でいうと、最初にアクセス許可する相手を定義して、非許可にする相手を定義するということになります。
で、次の Allow from all は、すべての相手に対してアクセスを許可するということになります。イントラネットなどで社内の人間に対してしかアクセスさせないのであれば、ここを変更することになります。これは別途記述します。
下も変更しなくてよいです。
<IfModule mod_userdir.c>
UserDir public_html
</IfModule>
これは、ユーザのホームページディレクトリを設定しています。例えば、user という名前のユーザがいるとします。そのホームディレクトリは、/home/user/ ですね。その下に、public_html というディレクトリを mkdir して、/home/user/public_html/index.html という HTML ファイルを作成します。そうすると、http://www.仮名.ne.jp/~user/ という URL で、そのホームページが見られるようになります。
下も変更しなくてよいですが、ログ出力ファイルの定義です。
ErrorLog /var/log/httpd-error.log
これは、WEB にアクセスしてきたときにエラーが発生した場合(例えば、存在しない HTML ファイルにアクセスしようとした等々)に出力するログファイルを指定しています。
CustomLog /var/log/httpd-access.log combined
これは、通常時のアクセスログを出力するファイル名とその形式を指定しています。
この上の方に、LogFormat というのが4行ほど、記述されていますがこれがログの出力形式を定義しています。combined にしておくといろいろな情報をログにとれますので、このままの設定をおすすめします。
ログはほうっておくとどんどん大きくなりますので、「newsyslog」を参照して、ログのローテーションを行ってください。
<Directory "/usr/local/www/apache22/cgi-bin">
AllowOverride None
Options None
Order allow,deny
Allow from all
</Directory>
これは、CGI のスクリプトファイルを置く場所を指定しています。http://www.仮名.ne.jp/cgi-bin/仮名.cgi で、スクリプトファイルにアクセスできます。
スクリプトファイルを動作させることは、セキュリティ上、危険が発生しますので、充分に注意して行ってください。
#Include etc/apache22/extra/httpd-default.conf
これは、前項で設定した etc/apache22/extra/httpd-default.conf への設定を有効にするために、先頭の # を削除して Include を有効にします。
4. apache の起動
さて、前節までの作業で、apacheは起動可能な状態になっているかと思います。
apache の起動停止用のスクリプトは、/usr/local/etc/rc.d/apache22 です。
この起動スクリプトでコンフィグレーションファイルのチェックまでできます。
/etc/rc.conf に
apache22_enable="YES"
の一行を追加してください。これで、/usr/local/etc/rc.d/apache22 での作業が可能になります。
/usr/local/etc/rc.d/apache22 configtest
と入力してください。設定した、http.conf の内容が正しく記述されているかどうか、チェックしてくれます。
記述が正しければ、Syntax OK と出力されるはずです。
記述に誤りがあれば、エラーを出力しますが、誤っている行番号やその内容などを、出力してくれるので訂正しやすいと思います。例えば <Directory /usr/local/www/apache22/data> の綴りを誤って <Directry /usr/local/www/data> と記述したとします。すると
Syntax error on line 1111 of /usr/local/etc/apache22/httpd.conf:
Invalid command '<Directry', perhaps mis-spelled or defined by a module not i
ncluded in the server configuration
という具合に、出力されます。「1111 行目の ''Directry' ってのはミススペルじゃないの?」ってことですね。
Syntax OK が出力されれば、
/usr/local/etc/rc.d/apache22 start
と入力してください。apache が起動されるはずです。
停止や再起動は以下のように入力します。
/usr/local/etc/rc.d/apache22 stop ← 停止
/usr/local/etc/rc.d/apache22 restart ← 再起動
再起動の場合は、ユーザがほとんど停止したことに気づかないくらいのスピードで起動されます。ホストが立ち上がった状態で httpd.conf を更新した場合などは、この restart を使用します。
起動スクリプトは特に設定を変更しない限りそのままにしておいてかまいません。
システムが正常に起動すれば apache も同時に起動することになります。
クライアントから、サーバにアクセスしたら It works!という文字が表示されるはずです。
5. 簡単な Virus 対策
Code Red、W32.Nimda@A という Worm型ウィルスはまだ現役でしょうか?2004年5月頃には猛威をふるっていました。
ウィルスにかかっている本人も気づかないうちに WindosNT サーバや Windows2000 に実装されている IIS という MicroSoft 社製の WEB サーバに被害を与えていました。
apache は、それらの攻撃を受けても実被害はないのですが、Virus からの攻撃を受けたことを示すログがアクセスログ上に残されて、後で解析するときに非常に見づらいものになってしまいます。
そこで、/usr/local/etc/apache/httpd.conf にちょっと細工をします。
ログファイルのファイル名を指定している部分を
SetEnvIf Request_URI default\.ida virus
SetEnvIf Request_URI root\.exe virus
SetEnvIf Request_URI cmd\.exe virus
CustomLog /var/log/httpd-access.log combined env=!virus
CustomLog /var/log/virus.log combined env=virus
こうしておくと、Code Red というウィルスは、default.idaというファイルを見つけて改竄しようとしており、W32.Nimda@A というウィルスは root.exe または cmd.exe とファイルを見つけて改竄しようとしているので、その URI をリクエストしたログは、通常のアクセスログには残されず、/var/log/virus.log という別のファイルに残されます。
根本的な解決にはなっていませんが、とりあえず、アクセスログを見るときに嫌な思いをしなくて済むかもしれません。
/var/log/virus.log も newsyslog.conf でローテーションさせましょう。
上記を2001年頃に記述しましたが、2004年に W32.HLLW.Gaobot.gen という厄介な奴が現れました。
これも IIS の WebDAVをいうサービスを狙い撃ちしてくるものだそうです。
これは、上記の対策では解決できないもので、1回に 32KB というデータを送信してくるのでデータが長大になってしまって、アクセス解析プログラムが重くなってしまいます。
以前、ここに別ログとして出力させる方法を記述しておりました。その方法とはこのウィルスの持つ特徴(ドメイン名でなく、IP アドレスに対して直接アクセスしてくる)を逆に利用して、IP アドレス直にアクセスしてくるメッセージを別ログに分けるようにする方法だったのですが、これだと、IP アドレスに直にアクセスするメッセージをすべて別ログに分けてしまいますので、正規のメッセージも別ログに分けてしまうことになってしまいました。
そこで、次善の策として、エラーコード 414 (メッセージが長すぎる)というログのメッセージはアクセスログに記録しないという方法を採ることとします。この場合、このメッセージの出力元は、エラーログのほうからリストアップしなければならなくなりますが、それは grep でリストアップすることができます。
エラーコード 414 のメッセージをアクセスログに記録しないには、http.conf の
LogFormat "%h %l %u %t \r %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
の行を
LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
と書き換えます。
記述後に「apache」を再起動することで、変更が有効になります。