カスタム検索
このエントリーをはてなブックマークに追加
tomo.gif (1144 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)line.gif (927 ツバツイツト)To previous pageTo home pageMailing to me

Apache2.0でサイト公開するための設定
(CentOS4 + SELinux)

Modified: 12 February 2006

個人でホームページを公開するのは簡単ですが、商売で公開する(銭を取るには)には、いろいろ追加設定がいります。

参考: 「Apache 2.0の必須設定と基本セキュリティ対策」
http://www.atmarkit.co.jp/flinux/rensai/apache2_01/apache01b.html


"ServerName"の設定
".htaccess"の設定確認
実行時のユーザを決める
サーバーの情報を隠す
動作モードの確認
接続数の制限
サービスの制限設定
取り込まれる追加モジュールの確認
ルートディレクトリの設定
"DocumentRoot"の設定
ログファイルを保存する


 "ServerName"の設定 

正確に設定する

一見、ほどんど効果がないように見えますが、バーチャルドメインを使う場合など、ホスト名を失ったとき、この設定が参照されるようです。

ServerName  www.tomo.ac:80

適当にしていると、原因不明のエラーで悩むことになるかもしれません。


 ".htaccess"の設定確認 

読み取りの禁止

ディレクトリのアクセス制限の設定ファイル(".htaccess")は、それ自身が流出しないように、ファイル名を特定しての禁止設定("<Files>")をします。

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy All
</Files>

"^\.ht" は、先頭が".ht"で始まるファイル(".htaccess"や".htpasswd")についての制限であることを示します。

"Satisfy All"は、すべての制限を通過しないと許可しないという意味ですが、上記ケースでは、記述効果はありませんが、将来このセクション内に新たな条件を追加した場合でも、うっかり流出してしまうことのないようにするために記述されています。


 実行時のユーザを決める 

デフォルトのユーザ

Redhat系のLinuxでは、デフォルトでは、以下のように、"apache"になっています。

User apache
Group apache


バーチャルドメイン毎にユーザを決める

"<VirtualHost>"内に記述すると、そのバーチャルホストでの実行時のユーザを決めることができます。

<VirtualHost 192.168.0.12>
        :

User tomo
Group tomo

        :
</VirtualHost>

ただし、CGIの実行時であって、htmlの読み取りややphpの実行権は、apacheのままです。


 サーバーの情報を隠す 

エラー時の表示をやめる

Forbidden

You don't have permission to access / on this server.
Apache/2.0.52 Server at test.tomo.ac Port 80

Apacheのバージョンなどが表示されるので、以下の設定で禁止する。

ServerSignature Off

以下のようにメッセージが表示されるだけになります。

Forbidden

You don't have permission to access / on this server.

サーバー情報を最小にする

ServerTokens OS

上記の設定を、以下のように変更します。

ServerTokens ProductOnly

 動作モードの確認 

動作モードの確認

Apache2.0は、"worker"(マルチスレッド)と"prefork"(Apach1.3と同様)の動作モードを備えています。

# /usr/sbin/httpd -V
Server version: Apache/2.0.52
Server built:   Jan  5 2006 12:31:31
Server's Module Magic Number: 20020903:9
Architecture:   32-bit
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D HTTPD_ROOT="/etc/httpd"
 -D SUEXEC_BIN="/usr/sbin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
# 

 接続数の制限 

接続数の制限

最大の接続数はメモリサイズを超えない範囲で制限する。

# ps -A -o pid,vsz,rsz,command | grep httpd
 3453  7696 3212 /usr/sbin/httpd
 3456  7832 3360 /usr/sbin/httpd
 3457  7832 3344 /usr/sbin/httpd
 3458  7832 3344 /usr/sbin/httpd
 3459  7832 3360 /usr/sbin/httpd
 3460  7832 3360 /usr/sbin/httpd
 3461  7832 3344 /usr/sbin/httpd
 3462  7832 3344 /usr/sbin/httpd
 3463  7832 3228 /usr/sbin/httpd
 3738  5580  724 grep httpd
# 

目安だが、1接続に対し、3.3MByte消費していることがわかる。

512MBのメモリの場合は、155(=512M/3.3M)ぐらいが最大である。今回は、128MBなので、余裕を見て、少し少なめの "36" に設定しました。

動作モードが、"prefork"なので、"/etc/httpd/conf/httpd.conf"の"prefork MPM"のところを変更します。

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      36
MaxClients       36
MaxRequestsPerChild  4000
</IfModule>

"MaxClients"は、"ServerLimit"以下に設定しないといけません。


 サービスの制限設定 

タイムアウトを短くする

デフォルトでは、"300"だが短くして"60"にする。DoS攻撃にも強くなります。

Timeout 60

 取り込まれる追加モジュールの確認 

"/etc/httpd/conf.d"を確認する

設定ファイル("httpd.conf")の読み込み時に、"/etc/httpd/conf.d"の中の設定が取り込まれますので、不要なものがないことを確認します。

# ll /etc/httpd/conf.d/
合計 16
-rw-r--r--  1 root root 392  1月  6 03:34 README
-rw-r--r--  1 root root 299  1月  6 03:34 welcome.conf
# 

 ディレクトリの設定 

デフォルトディレクトリの設定

デフォルトでは、以下の設定になっています。

<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

以下のように設定すれは、アクセスを許可したディレクトリのみがアクセスできるようになりますし、例外を許可する".htaccess"もデフォルトで無効になります。

<Directory />
    Order Deny,Allow
    Deny from all
    Options None
    AllowOverride None
</Directory>


ユーザディレクトリ非公開の確認

ユーザディレクトリが非公開になっていることを確認します。

<IfModule mod_userdir.c>
    #
    # UserDir is disabled by default since it can confirm the presence
    # of a username on the system (depending on home directory
    # permissions).
    #
    UserDir disable

    #
    # To enable requests to /~user/ to serve the user's public_html
    # directory, remove the "UserDir disable" line above, and uncomment
    # the following line instead:
    #
    #UserDir public_html

</IfModule>

ユーザディレクトリを公開する場合、以下の設定で、"root" の公開は禁止します。

<IfModule mod_userdir.c>

    UserDir disable root

    UserDir public_html

</IfModule>

 "DocumentRoot"の実験 

"httpd.conf"の変更

"/etc/httpd/conf/httpd.conf"の"DocumentRoot"を変更します。

DocumentRoot  /var/www/html

<Directory "/var/www/html">
ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>

上記を、以下のように変更します。

DocumentRoot  /www/html

<Directory "/www/html">
ScriptAlias /cgi-bin/ "/www/cgi-bin/"

<Directory "/www/cgi-bin">
    AllowOverride None
    Options None
    Order allow,deny
    Allow from all
</Directory>


SELinuxの場合

SELinuxの場合、新しいディレクトリにアクセス権がないので、以下のエラーが出ます。

# service httpd start
httpd を起動中: Syntax error on line 265 of /etc/httpd/conf/httpd.conf:
DocumentRoot must be a directory
                                                           [失敗]
# 

アクセス権を "/etc/selinux/targeted/contexts/files/file_contexts" を変更して許可します。

# apache
       :
/var/www(/.*)?                      system_u:object_r:httpd_sys_content_t
/var/www/cgi-bin(/.*)?              system_u:object_r:httpd_sys_script_exec_t

上記を、以下のように変更します。

# apache
       :
/www(/.*)?                          system_u:object_r:httpd_sys_content_t
/www/cgi-bin(/.*)?                  system_u:object_r:httpd_sys_script_exec_t

設定後、以下のコマンドで反映させます。

# restorecon -R /www
# restorecon -R /www/cgi-bin
# 

起動してみます。

# service httpd start
httpd を起動中:                                            [  OK  ]
# 


 DocumentRootを指定しないとどうなるのか

DocumentRootを指定しないで開くと、「ファイルが見つかりません」のメッセージがでました。

いったいどこを探しに行っているかを、"/var/log/httpd/error_log"の最後に以下のようなメッセージが記録されていました。

要は、""を探しにいっているようです。これがコンパイル時に組み込まれているデフォルトのようです。

[Sun Jan 22 19:18:54 2006] [error] [client 192.168.0.81] File does not exist: /etc/httpd/htdocs/

バーチャルホストを指定している場合のDocumentRoot

バーチャルホストを指定していない場合あらかじめ設定されているDocumentRootが参照されますが、"NameVirtualHost"を有効にして、バーチャルホストを指定していると、その"VirtualHost"のブロック内で定義されている"DocumentRoot"が有効になります。

バーチャルホストを指定する場合、一般に複数の"VirtualHost"が定義されます。どの"VirtualHost"の定義が採用するかどうかは、"VirtualHost"内の"ServerName"が一致したらその一致した"VirtualHost"内の"DocumentRoot"が有効になります。

"VirtualHost"の中に、"DocumentRoot"の定義がない場合、デフォルトの"DocumentRoot"が有効になります。 


 ログファイルを保存する 

ログをリネームする

"<VirtualHost>"の中で定義すると、そのバーチャルホストだけのログが取れます。

詳しいログをとるには、"combined"を指定します。

<VirtualHost 192.168.0.12>
        :
    ErrorLog logs/tomo.ac-error_log
    CustomLog logs/tomo.ac-access_log combined
</VirtualHost>

        :

<IfModule mod_ssl.c>
        :
SSLLog      logs/tomo.ac-ssl_engine_log
        :
</IfModule>

        :

<VirtualHost _default_:443>
        :
ErrorLog logs/tomo.ac-ssl-error_log
TransferLog logs/tomo.ac-ssl-access_log
        :
CustomLog logs/tomo.ac-ssl_request_log \
          "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
</VirtualHost>


エラーログのレベルの設定

下のほうに行くほど詳しいログが出ることになる。

emerg 動作不能な状況(Emergencyの意)
alert 修正しなければ(部分的に)動作できない問題
crit 上記に該当しない動作上の問題(Criticalの意)
error 存在しないファイルへのアクセスなど各種エラー
warn 警告(Warningの意)。設定のミスなどが考えられる場合
notice 起動停止や設定変更された場合など
info あらゆる情報(プロセスの起動や停止など)
debug Apache関連のデバッグに必要な情報

デフォルトは、"warn"です。

公開するなら、最低でも "notice"。セキュアにするなら、"info"。

設定どおりに動かないとき原因を推察する場合、"debug"。


LogLevel info

SSLLogLevel info


ログのローテーション

ローテーション間隔を、"monthly"(毎月1回)に指定します。そして、ローテーションしたログは、"rotate 6"(半年)保存にしてします。

"/etc/logrotate.conf"を開きます。

# see "man logrotate" for details
# rotate log files weekly
monthly

# keep 4 weeks worth of backlogs
rotate 6

# create new (empty) log files after rotating old ones
create

# uncomm:xent this if you want your log files compressed
#compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
  monthly
  create 0664 root utmp
  rotate 1
}

# system-specific logs may be also be configured here. 

To previous pageTo home pageMailing to meJump to Top of pageline.gif (927 ツバツイツト)line.gif (927 ツバツイツト)tomo.gif (1144 ツバツイツト)
カスタム検索



このエントリーをはてなブックマークに追加