Apacheの設定ファイル

Apache+mod_ssl [.htaccessファイルについて]

.htaccessファイルを設置すると、設置したディレクトリ以下のApacheの設定を変更することができる。つまりhttpd.conf内で<Directory>指示子を使うのと同様な機能を、Apacheのリスタートなしで提供できる。特にこのファイルはベーシック認証のページを作ったり、ディレクトリの設定を行ったりするときに有効である。ただしApacheのインストール後は、サーバ内でのセキュリティのためデフォルトでは無効になっている。これを有効にするにはhttpd.confの中の「AllowOverride」指示子の設定を変更する必要がある。

<Directory "許可するディレクトリ">
     AllowOverride All </Directory>
  • All :すべての有効な指示子を許可
  • None :すべての指示子を無効
  • AuthConfig:認証指示子を許可(AuthUserFile, requireなど)
  • FileInfo :ドキュメントの種類に関する指示子を許可(AddType, DefaultTypeなど)
  • Indexes :インデックス表示に関する指示子を許可(DirectoryIndex, AddIconなど)
  • Limit :ホストに対するアクセス制限に関する指示子を許可(allow, deny, order)
  • Options :特定のディレクトリ機能の指示子を許可(Options, XBitHack)
<Files .htaccess>
     Order allow,deny
     Deny from all
</Files>

なお、「.htaccess」というファイルは訪問者から見られないようにする必要があるため、以下の行を加えておく必要がある。デフォルトでは有効になっているので特に記述する必要はない。

Options指示子

Options指示子を設定することで、サーバのさまざまな設定を変更することができる。別の指定によって先に無効化されたオプションを有効化させる場合は前に「+」をつける。逆は「-」をつければよい。

Options指示子

  • ExecCGI :CGIを有効にする
  • FollowSymLinks :ディレクトリ内のシンボリックリンクをたどる
  • Includes :SSIを有効にする
  • IncludesNOEXEC :#includeと#exec以外のSSIを有効にする
  • Indexes :ディレクトリのIndex表示をする
  • SymLinksIfOwnerMatch:実体とリンクの所有者が同じ場合のみシンボリックリンクをたどる
  • ultiViews :ドキュメントの言語に基づいてネゴシエートされたコンテンツを配信

VirtualHostの設定

 Apacheでは、仮想ホストの設定を行うことができる。Apacheの仮想ホストには「名前ベース」と「IPベース」の2つの形式があり、前者は1つのIPアドレスから複数のホスト名に対して設定でき、後者は1つのマシンに複数のIPアドレスが割り当てられている場合に、それぞれのIPアドレスに対して設定することができる。今回はこの両方の設定方法を紹介する。

1)「httpd.conf」内で、以下の行を追加。

Include "conf/virtualhost.conf"

2)「/usr/local/apache/conf/virtualhost.conf」というファイルを作成する。名前ベースの場合は以下のような内容。ここではコンテンツの内容を「/home/httpd/html」と「/home/httpd/html2」としているため、これらのディレクトリがない場合は作成しておく。

NameVirtualHost 192.168.0.2

<VirtualHost 192.168.0.2>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
</VirtualHost>

<VirtualHost 192.168.0.2>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
</VirtualHost>

上記の例では、ホスト「www.mydomain.ne.jp」と「www2.mydomain.ne.jp」がIPアドレス「192.168.0.2」でアクセスできる場合、前者のホスト名では上の設定が、後者のホスト名では下の設定が適用される。注意すべきなのは、それ以外のホスト名(たとえばIPアドレス等)でアクセスされた場合は、デフォルトの設定ではなく一番上の設定が使われることである。名前解決ができていればいくつでも書いてもいい。
IPベースの場合も同じように記述すればよい。

<VirtualHost 192.168.0.2>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
</VirtualHost>

<VirtualHost 192.168.0.3>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
</VirtualHost>

もし名前ベースのVirtualHostで、ワイルドカードのドメイン(ホスト名の部分にどんな文字列を入れてもアクセス可能なドメイン名)に対応させるには、VirtualHostディレクティブ内で、ServerAlias指示子を使うことができる。

NameVirtualHost *
<VirtualHost *>
DocumentRoot /home/user/www
ServerName www.mydomain.ne.jp
ServerAlias mydomain.ne.jp *.mydomain.ne.jp
</VirtualHost>

3)Apacheをリスタートさせ、ブラウザから「http://www.mydomain.ne.jp/」、「http://www2.mydomain.ne.jp/」、「http://192.168.0.2/」、「http://192.168.0.3/」、「http://localhost/」など入力してみて、違いを確認してみる。

# service httpd restart

[仮想ホストでのSSL運用]

セキュアサイトは仮想ホストでも運用させることができるが、IPベースでのみの運用となる。名前ベースで運用させることもできるが、その場合証明書は同じものしか利用できない。よってドメイン名が異なる場合は事実上名前ベースで運営すべきではない。IPベースではSSLサイトの数ぶんキーペアと証明書が必要である。設定自体は上のVirtualHostディレクティブの中にSSL関係の設定を入れることで実現可能である。

1)以下は名前ベースでの設定。下の例では「192.168.0.2」というIPアドレスに「www.mydomain.ne.jp」 と「www2.mydomain.ne.jp」というドメインが割り当てられ、それぞれ「/home/httpd/html」 「/home/httpd/html2」にアクセスさせるような設定方法である。

NameVirtualHost 192.168.0.2
<IfDefine SSL>
NameVirtualHost 192.168.0.2:443
</IfDefine>

<VirtualHost 192.168.0.2>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
</VirtualHost>
<IfDefine SSL>
<VirtualHost 192.168.0.2:443>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
SSLEngine On
SSLCertificateFile /usr/local/apache/conf/ssl.crt/www.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/www.key
</VirtualHost>
</IfDefine>

<VirtualHost 192.168.0.3>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
</VirtualHost>
<IfDefine SSL>
<VirtualHost 192.168.0.3:443>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
SSLEngine On
SSLCertificateFile /usr/local/apache/conf/ssl.crt/www2.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/www2.key
</VirtualHost>
</IfDefine>

注:443ポートの設定項目では、必ず<IfDefine SSL></IfDefine>で囲むこと。これを行わないとSSLなしで起動させた場合にエラーが出て起動できなくなる。
また「http://192.168.0.2/」でアクセスされた場合は、一番上で定義した設定が適用される。証明書は上と下で同じものを指定しているが、違うものを指定した場合は下のものが無効になり、上のものが適用されるので注意すること。証明書を作成する場合、Common Nameでは「*.mydomain.ne.jp」と指定するとよい。(ただし「mydomain.ne.jp」では警告が出てしまうので注意)

2)IPベースでの設定。「192.168.0.2」「192.168.0.3」が「www.mydomain.ne.jp」「www2.mydomain.ne.jp」で、「/home/httpd/html」「/home/httpd/html2」にアクセスされる。

<VirtualHost 192.168.0.2>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
</VirtualHost>
<IfDefine SSL>
<VirtualHost 192.168.0.2:443>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html
ServerName www.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www_error_log
CustomLog /usr/local/apache/logs/www_access_log combined
SSLEngine On
SSLCertificateFile /usr/local/apache/conf/ssl.crt/www.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/www.key
</VirtualHost>
</IfDefine>

<VirtualHost 192.168.0.3>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
</VirtualHost>
<IfDefine SSL>
<VirtualHost 192.168.0.3:443>
ServerAdmin postmaster@mydomain.ne.jp
DocumentRoot /home/httpd/html2
ServerName www2.mydomain.ne.jp
ErrorLog /usr/local/apache/logs/www2_error_log
CustomLog /usr/local/apache/logs/www2_access_log combined
SSLEngine On
SSLCertificateFile /usr/local/apache/conf/ssl.crt/www2.crt
SSLCertificateKeyFile /usr/local/apache/conf/ssl.key/www2.key
</VirtualHost>
</IfDefine>

注:上の例では、キーペアと証明書はそれぞれ2つずつ(仮想ホストの数ぶん)必要になる。

[worm対策]

 access_logに「root.exe」や「cmd.exe」などといった、Nimda/CodeRedIIのワームログが大量に吐き出されることがある。Apacheの運用においては実被害がないので無視していてもよいが、アクセスログが肥大化して管理しにくくなるので、これらを別ファイルに書き出すようにするとよい。
ワーム関係のログを「worm_log」というファイルに書き出すには、httpd.confで以下のように設定する。

<IfModule mod_setenvif.c>
SetEnvIf Request_URI "default\.ida" worm
SetEnvIf Request_URI "cmd\.exe" worm
SetEnvIf Request_URI "root\.exe" worm
SetEnvIf Request_URI "Admin\.dll" worm
</IfModule>

CustomLog logs/access_log common env=!worm
CustomLog logs/worm_log combined env=worm

[favicon.ico]

 Apacheを運用していると、エラーログに「favicon.ico」が存在しないというエラーが出力されることがある。favicon.icoはWindowsでいうアイコンファイルであり、これをサーバのDocumentRootに設置すると、Internet Explorerでサイトをブックマークに追加したときにここで指定したアイコンが適用されるので試してみるとよい。
また以下のようなHTMLタグを使えば、それぞれのページに別のアイコンを指定することができる。

<LINK REL="SHORTCUT ICON" href="/path/filename.ico">

上記「http://ホスト名/path/filename.ico」のファイルが適用される。

[Digest認証]

ダイジェスト認証は、入力したパスワードがMD5により暗号化されるため、平文のまま流れるBasic認証と比べてセキュリティに優れている。ただし対応しているブラウザがごく少ないのが難点である。ダイジェスト認証を使用するためには、Apacheにmod_auth_digestモジュールを組み込む必要がある。Apacheのインストール後は以下のようにして組み込むことが可能。

1)Apacheのソースディレクトリ内の「src/modules/experimental/」に移動。

2)ソースファイルからコンパイル、モジュールを作成する。

# /usr/local/apache/bin/apxs -c -DDEV_RANDOM
mod_auth_digest.c
# gcc -DUSE_HSREGEX -DUSE_EXPAT -I./lib/expat-lite -fpic \
-DSHARED_MODULE -I/usr/local/apache/include -DDEV_RANDOM -DEAPI \
-c mod_auth_digest.c
# gcc -shared -o mod_auth_digest.so mod_auth_digest.o

3)モジュールをApacheに組み込む。

# /usr/local/apache/bin/apxs -i mod_auth_digest.so

4)「httpd.conf」を編集する。

# cd /usr/local/apache/conf/
# vi httpd.conf
LoadModule digest_auth_module libexec/mod_auth_digest.so
AddModule mod_auth_digest.c

5)Apacheを再起動する。

TOP OF PAGE