※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。



installation


静的に組み込みたいモジュール
名前 組込可否
mod_auth_basic
mod_authz_user
mod_authn_file

アクセスログ解析

visitors


visitorsはコマンドを打って、htmlを出力するという仕組みなので、cronにコマンドを登録する必要がある。

  • cronについて
cronには2つの動作のさせ方がある。
+ crontabコマンドでユーザごとのタスクを/var/spool/cron/(ubuntuの場合のパス)に保存する方法
+ /etc/cron.hourly, cron.daily, ...にコマンドを保存する方法
 - 上記の各ディレクトリ配下のコマンドは/etc/crontabが呼び出してくれている
  詳しくは[[cronの設定>http://www.express.nec.co.jp/linux/distributions/knowledge/system/crond.html]]を参照

今回はcron.dailyにコマンドを追加する方法で設定する。/etc/cron.daily/visitorというファイルに以下の内容を記述する
#!/bin/sh

visitors -A -m 30 /var/log/apache2/access.log -o html > /var/www/visitors/report.html

上記コマンドが期待の動作をするか試す場合は下記のようにしてあげないとリダイレクト後の権限がrootで動いてくれない
sudo sh -c 'visitors -A -m 30 /var/log/apache2/access.log -o html > /var/www/visitors/report.html'

/etc/cron.daily/visitorsをrwxrwxr-x(この権限って名前あったっけ?)にする。
chmod 775 /etc/cron.daily/visitors



command

設定ファイルに異常がないか調べる

$ apache2ctl configtest
Syntax OK


静的モジュールを一覧する

apache2 -l

MPMを確認する方法

静的モジュールを一覧すると分かる。worker.cが組み込まれていればworker MPMで動作しており、prefork.cが組み込まれていればpreforkで動作している。
$ apache2 -l
Compiled in modules:
 core.c
 mod_log_config.c
 mod_logio.c
 worker.c
 http_core.c
 mod_so.c


Ubuntu 8.04 で配布されているバイナリのApache/2.2.8のコンパイルオプションをチェック

$ apache2 -V
Server version: Apache/2.2.8 (Ubuntu)
Server built:   Mar 10 2009 18:05:43
Server's Module Magic Number: 20051115:11
Server loaded:  APR 1.2.11, APR-Util 1.2.12
Compiled using: APR 1.2.11, APR-Util 1.2.12
Architecture:   32-bit
Server MPM:     Worker
  threaded:     yes (fixed thread count)
    forked:     yes (variable process count)
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/worker"
 -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 DYNAMIC_MODULE_LIMIT=128
 -D HTTPD_ROOT=""
 -D SUEXEC_BIN="/usr/lib/apache2/suexec"
 -D DEFAULT_PIDLOG="/var/run/apache2.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="/etc/apache2/mime.types"
 -D SERVER_CONFIG_FILE="/etc/apache2/apache2.conf"


忘れがちなdirective/ modules

Multiview


ScoreBoardFile

親プロセスと子プロセス間の通信用にサーバーで使用されるファイルの設定

content negotiation - 言語や拡張子ごとにレスポンス内容を変更

apacheによる暗黙のファイル名にパターン照合


ファイル名に対する拡張子をタイプマップファイルで指定する


セキュリティのチェックリスト


以下のディレクトリの権限をチェック


  • ServerRoot
rootユーザのみアクセス可能にする
 -rw-r--r-- 1 root root

  • DocumentRoot
Apacheのユーザ(Userディレクティブで定義されたユーザ)またはグループ(Groupディレクティブで定義されたグループ)のみがウェブコンテンツのディレクトリにアクセスできるようにする。Apache userは読み取り・実行アクセスのみ行うので書き込み権限は必要ない。書き込み -コンテンツ作成(手作業、プログラムによる静的ページの自動生成を含む) - はApacheのグループに所属しているユーザから行う。

$ chmod -R 2570 /www/htdocs
-r-xrws---  1 www-data www-data
2570の2はsetgid

  • ScriptAlias
Apacheのユーザ(Userディレクティブで定義されたユーザ)のみがアクセスできるようにする。Apache userは読み取り・実行アクセスのみ行うので書き込み権限は必要ない。CGIの自動生成を行わない限り、Apache group権限での書き込みは行われない。そのため、所有グループはApache groupではなく開発専用の別のグループを割り当てる。

#webevは開発グループ
chown -R www-data.webdev /www/cgi-bin
chmod -R 2570 /www/cgi-bin


  • CustomLog
Ubuntuの初期設定のまま変えない
-rw-r----- 1 syslog            adm
-rw-r----- 1 root              adm

ディレクティブ


サーバの署名

  • ServerSignature Off
エラー画面などにサーバのバージョンなどの情報が表示されてしまうのを防ぐ

  • ServerTokens ProductOnly
HTTP Headerにサーバの情報が表示されてしまうのを防ぐ

telnet> open www.yourserver.com 80
Trying 10.0.0.2...
Connected to www.yourserver.com
Escape character is '^]'.

HEAD / 1.1

HTTP/1.1 403 Forbidden
Date: Mon, 09 Nov 2009 22:30:41 GMT
Server: Apache/2.2.9 (Ubuntu) DAV/2 SVN/1.5.1 Phusion_Passenger/2.2.5
Connection: close
Content-Type: text/html; charset=iso-8859-1

それでも消えないHeader情報はmod_headersで消せる。

DAV ON

DAVディレクティブがOnになっていると RESTが有効になってしまう。
例えば以下の例では/var/www/html/webdav以下のディレクトリでPUT DELETEなどのメソッドが有効である。
<Directory /var/​www/html/webdav>​
 DAV On
</Directory>

特定のメソッドの実行に人称を加えたい場合は以下の様にLImitで制限する。
<Limit POST PUT DELETE>
 Require valid-user
</Limit>

Option Index

Indexが上位から継承されているときは Option -Indexを指定し、それ以外の場合はOptionからIndexの指定を単に無くす。

FollowSymLinks

FollowSymLinksディレクティブをはずす。もしくは-FollowSymLinksを指定する。

Directory

上位ディレクトリで全てDenyした上で下位ディレクトリをそれぞれ使用するタイミングでAllowする。
<Directory />
 Order deny,allow
 Deny from all
</Directory>

<Directory “/www/htdocs”>
 Order deny,allow
 Allow from all
</Directory>

UserDir


http://www.domain.com/~username が無効であることを確認

その他

ApacheをconfigureするときのオプションでSuExecが実行できるコマンドのPATHを指定できる。
--suexec-safepath=”/usr/local/bin:/usr/bin:/bin”

専用のフォルダを作成し、そこに実行するであろうコマンドのsymリンクだけを作成すればよい。
sudo mkdir /usr/bin/suexec
ln /usr/bin/whois /usr/bin/suexec/whois

web scanners


CGI

設定ファイルやデータベースがDocumentRoot配下にないこと

スクリプトが作成する一時ファイルがDocumentRoot配下に無いこと。バグが引き金になってサーバーサイドの情報を書き込む可能性があるから。逆に言うとApacheユーザが書き込み可能なディレクトリはDocumentRoot以下に持たないこと

スクリプトの拡張子をURLに使用しないこと .pl .cgi mod_rewriteやフレームワークに備え付けのルーターを使用してマッピングを変更する。




Performance Tuning


まず以下の項目をチェックする
  • Memoryの検討
  • HDの検討
  • プロセッサーの検討はCGIが高度な計算をしる以外の場合は特に大きな効果がない
  • ネットワークフローの検討
- bandwidthを他のサーバ(web svr, DB svr, NFS)と共有していないか確認する
- Ethernet switch、Load balancerの導入、パケットの経路の確認
  • OSのチューニング
- 後記

その上でApacheのDirectiveのTuningを開始する。

ApacheのDirective

HostnameLookups

HostnameLookupsはリクエストがあるたびにリモートホスト(クライアント)のホスト名を取りに行くので使わない

AllowOverride None

AllowOverride はNoneを設定する。そうでない場合、例えば%DocumentRoot%/images/photos/20090921/birthday.jpegへのリクエストは各階層において.htaccessを探すFileI/Oが発生する。
%DocumentRoot%/.htaccess
%DocumentRoot%/images/.htaccess
 :
%DocumentRoot%/images/photos/20090921/.htaccess

Option -FollowSymLinks

FollowSymLinksはセキュリティを低下するため”-”を付け足すかserver sectionのOptionには記述しないでおきたいところ。しかし、その場合Apacheは各リクエストに対してlstat()を呼び出し、これがパフォーマンスの低下につながる。これを避けるにはOption FollowSymLinksを記述した上でシムリンクを検索する。
find your_top_web_directory -type l -print 



以下広告