Apache

インストール

http://httpd.apache.org/download.cgiよりダウンロード sslを有効にしたい場合は、--enable-sslを付加する。 Digest認証をしたい場合は--enable-auth_digestをつける。圧縮転送をしたい場合は、 --enable-deflateをつける。 WebDev?を使いたい場合は、--enable-dav=yes --with-berkeley-db=/usr/local/BerkeleyDB.4.3 またproxyを組み込みたい場合は--enable-proxy, URLを書き換えたい場合は、--enable-rewrite ModSecurity?を使いたかったので、--enable-unique-idを付加しました。lpap認証を使いたいかったので、--with-ldap --enable-ldap --enable-auth-ldapを付加してます。ちなみに ./configure --helpを参考に

tar zxvf httpd-2.0.52.tar.gz
cd httpd-2.0.52
./configure --prefix=/usr/local/apache2 --enable-ssl --enable-so
--enable-auth_digest --enable-deflate
--enable-dav=yes --with-berkeley-db=/usr/local/BerkeleyDB.4.3
--enable-proxy --enable-rewrite --enable-unique-id
--with-ldap --enable-ldap --enable-auth-ldap --with-included-apr

か、2.2は

--with-ldap --enable-ldap --enable-authnz-ldap --with-included-apr

全部いきたい場合は

--enable-module=all --enable-mods-shared=all
make
make install

再度インストールする場合は、apacheは止めましょう。ちなみにmakeのときに

Undefined symbols:
 "_apr_socket_sendfile", referenced from:
     _sendfile_it_all in libmain.a(core_filters.o)    

ってleopardのときエラーになったんですが、次やるとうまくいけました。make cleanしたからかな?
終了後

ldd /usr/local/apache2/bin/httpd

で使用しているライブラリをチェックしておきます。 オプションの--enable-deflateをつけた場合は、エラーがでました。http://forums.devside.net/viewtopic.php?t=123と同じエラーです。PHPを参考にzlibをインストールしてますが、エラーがでます。どうも、/usr/include/zlib.hと/usr/local/include/zlib.hが2ついてこれが原因ぽいです。ですので、とりあえず、/usr/local/include/zlib.hを/usr/local/include/zlib.horgにリネームしてコンパイルしました。後ユーザとグループは

groupadd httpd
useradd httpd -g httpd -d /dev/null -s /sbin/nologin

で作成し、httpd.confのuser,groupをhttpdにします。 ついでにaprも入れておきます。http://apr.apache.org/download.cgiより、

wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-1.2.12.tar.gz
wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-util-1.2.12.tar.gz
tar xzvf apr-1.2.12.tar.gz 
tar xzvf apr-util-1.2.12.tar.gz
cd apr-1.2.12
./configure
make
make instal
cd ../apr-util-1.2.12
./configure --with-apr=/usr/local/apr
make
make install

2.2

起動・停止

APACHE_HOME/binで実行

./apachectl start

停止は

./apacehctl stop

再起動は

./apachectl restart

リバースproxy

http://www.sixapart.jp/movabletype/developers/naoya/archives/2004/10/apache_20_mod_p.html

独自のディレクトリ作成

APACHE_HOME/conf/httpd.confに追加します。

Alias /test /usr/local/test
<Directory /usr/local/test>
 Options All MultiViews
 AllowOverride All
</Directory>

ちなみに特定のURLにディレクティブを設定したい場合は、Locationを使います。 またcgiを動かしたい場合は、/usr/local/testに.htaccessを作り

Options +ExecCGI +MultiViews

を追加します。 ちなみに、

<Directory /usr/local/test> 
 Options All     対象となるフォルダのオプション
 AllowOverride None .htaccessで別の指定を許可するかどうか
 Order allow,deny  許可と不許可の評価の順番 
 Allow from all     許可の範囲 Allow from 192.168.0とか、 Allow from 192.168.0.0/24とか 
                    .co.jpとか  複数の場合はスペースで allow fromを複数行でも可
</Directory> 

で、optionsの設定は、

All MultiViewsを除くすべてのオプションが有効
None すべて無効
ExecCGI CGIスクリプトの実行を許可
FollowSymLinks シンボリックリンクへアクセス許可
Includes サーバサイドのインクルード許可
IncludesNoExec サーバサイドのインクルード許可するがコマンドは禁止
Indexes ディレクトリ一覧を表示

  SSLだけ許可したい場合は、

SSLRequireSSL 

承認

  • Basic承認
    .htaccessファイルを作成し、
    AuthType Basic  <--Basic認証
    AuthUserFile /etc/test.conf <--IDとパスワードが設定されているファイル
    AuthName test   <--ダイアログの名前
    require valid-user <--AuthUserFileのファイルにあればOK
       その中でも制限したい場合は、valid-user cat,birdであればcat,birdのみ
    Satisfy any
    <Files ~ "^.(htpasswd|htaccess)$">
    deny from all
    </Files>
    最後はリターンを入れないようにしてください。 Satisfy anyは、「ホスト制限を通過する」あるいは「パスワード認証を通過する」のどちらかひとつを満たせば、コンテンツが見れます。パスワードファイルの作り方は、
    /usr/local/apache2/bin/htpasswd -bc test.conf admin passwd
    この-cは新しく作成します。-bはパスワード含んでいるということです。
    参考 こちらよりAuthUserFile?が作成できます。http://www.chama.ne.jp/access/index.htm
  • Digest承認
    ではDigestの設定をみていきましょう。Basic 認証は平文なので覗き見されたら終わりです。このDigest認証は暗号化されているために盗聴に強くなってます。
    htdigest -c passwdfile authname username
    あとは.htaccessです。
    AuthDigestFile /passwdfile <-AuthUserFileではない。
    AuthName authname  <-htdigestと同じにしておく
    AuthType Digest
    Require valid-user
    動かしてみると、なんとログに
    Digest: uri mismatch
    とでてます。調べているとどうもIE6の問題のような... test.cgi?name=aaaとかクエリがある場合にだめみたいです。 http://issues.apache.org/bugzilla/show_bug.cgi?id=27758
    2.0.52のソースをみているとどうもpatchはあたっているようです。mod_auth_digest.cの1610行あたりにコメントが書いてありました。となると、これはhttp://httpd.apache.org/docs-2.0/mod/mod_auth_digest.htmlをみると、httpd.confに
    BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=On
    を追加するといけました。
  • MySQL承認
    つ次はMySQLを使った認証です。これはまた便利に使えそうです。http://sourceforge.net/projects/modauthmysql/からダウンロードしました。解凍後コンパイルします。ダウンロード後、コンパイルです。
    apxs -c -L/usr/local/mysql/lib/mysql -I/usr/local/mysql/include/mysql
    -lmysqlclient -lm -lz mod_auth_mysql.c
    この-L,-Iはmysqlの環境を確認してください。またapxsはwhichでどこにあるかを確認しておいてください。複数apacheが入っている場合は、フルパスで指定します。ではインストールです。
    apxs -i mod_auth_mysql.la
    コンパイルがうまくいっているとmod_auth_mysql.laができています。これはapache2.xの場合で、1.xの場合は、mod_auth_mysql.soとしてやります。詳細は、BUILDファイルを参照してみてください。ではhttp.confを修正します。
    LoadModule mysql_auth_module modules/mod_auth_mysql.so
    ではapacheの再起動です。
    apachectl restart
    次にMySQLに承認用のDBとテーブルをつくっていきましょう。DBもテーブルも項目名もどうでもいいです。これは、.htaccessで対応づけます。
    create database webauth;
    GRANT SELECT ON webauth.* to webauth@localhost identified by 'yourpasswd';
    use webauth
    create table auth_user (
     name varchar(50) not null,
     pass varchar(50) not null,
     active varchar(1) not null,
     primary key (name)
    );
    後はデータを適当にインサートしておきます。では.htaccessを編集しましょう。
    AuthName "mysql auth"    :タイトル
    AuthType Basic           :Basic承認
    require valid-user
    AuthMySQLHost localhost  :MySQLのホスト
    AuthMySQLDB webauth      :MySQLのDB
    AuthMySQLUser webauth    :MySQLにログインするユーザ
    AuthMySQLPassword yourpasswd :MySQLにログインするパスワード
    AuthMySQLUserTable auth_user :承認用のテーブル
    AuthMySQLNameField name      :MySQLの名前のフィールド
    AuthMySQLPasswordField pass  :MySQLのPasswordのフィールド
    AuthMySQLCryptedPasswords Off :未調査
    #AuthMySQLKeepAlive        Off  :未調査
    #AuthMySQLAuthoritative    On   :未調査
    #AuthMySQLNoPasswd         Off  :未調査
    AuthMySQLUserCondition "active=1"
    AuthMySQLUserCondition?はおもしろいです。SQLにこの条件がついてくれます。

参考:Apacheによるアクセス制限

mod_rewrite

ディレクトリを移動したい場合、そのディレクトリに.htaccessファイルを作り、

RewriteEngine on
RewriteBase /hoge/
RewriteRule ^(.*)$ /hogehoge/$1 [R=301,L]

また/hogeでも移動させたい場合は、ルートに

RewriteEngine on
RewriteRule /hoge$ /hogehoge/index.html [R=301,L]

クエリはRewriteRule?では置換してくれないので、

RewriteEngine On
RewriteBase /
RewriteCond %{QUERY_STRING} ^aaa=(.*)$
RewriteRule ^hoge/hoge1.php /hoge/hoge2/hoge3.php?bbb=%1 [R=301,L]

参考:
http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html
http://japache.infoscience.co.jp/rewriteguide/

mod_deflate

mod_deflateによるコンテンツの圧縮転送

mod_authnz_ldap

ldap認証です。httpd.confに

<Location /svn>
 DAV svn
 SVNParentPath /usr/local/svn-rep
 AuthType Basic
 AuthName test
 AuthBasicProvider     ldap
 AuthzLDAPAuthoritative        off
 AuthLDAPURL   ldap://localhost/ou=sales,o=example,c=jp?uid
 require valid-user
</Location>

とか。2.0と2.2でちょっと違いますね。上記のサンプルはwebdavも使った2.2です。
2.0で.htaccessに書いた場合

AuthType Basic
AuthLDAPUrl ldap://localhost/ou=People,dc=my-domain,dc=com?uid
AuthName test
require valid-user

ApacheのLDAP認証
Apacheで作るファイルサーバ(LDAP認証編)2.0の場合はこちらを参考に
mod_authnz_ldap
そろそろLDAPにしてみないか?

CGI実行

大きくは2通り httpd.confに

ScriptAlias /cgi-bin/ /webroot/cgi-bin/

もしくは.htaccessに

SetHandler cgi-script or AddHandler cgi-script .cgi .pl
Options +ExecCGI

とする。AddHandler?については拡張子を指定する場合で、SetHandler?は拡張子に関係なく実行させたい場合です。ただしOptionsで指定できるのは、AllowOverride?の指定によるので、確認しておく。

メール送るサンプル

#!/usr/bin/perl
$sendmail = '/usr/sbin/sendmail';
$from = 'from@hoge.jp';
$to = 'to@hoge.jp';
$subject = 'test';
$msg = <<"_DATA_";
message
_DATA_
# sendmail
open(SDML,"| $sendmail -t -i") || die 'sendmail error';
# mailhead
print SDML "From: $from\n";
print SDML "To: $to\n";
print SDML "Subject: $subject\n";
print SDML "Content-Transfer-Encoding: 7bit\n";
print SDML "Content-Type: text/plain;\n\n";
# mail
print SDML "$msg";
# end
close(SDML);

FastCGI

Rubyを動かしたいので、インストールしてみました。

wget http://www.fastcgi.com/dist/fcgi.tar.gz
tar xzvf fcgi-2.4.0.tar.gz
cd fcgi-2.4.0
./configure
make
make install
ldconfig

このfcgiはThe Development Kitなので、いらないような気もしますが、とりあえずいれてます。ではmod_fastcgiです。

wget http://www.fastcgi.com/dist/mod_fastcgi-2.4.2.tar.gz
tar xzvf mod_fastcgi-2.4.2.tar.gz
cd mod_fastcgi-2.4.2

READMEを読んで、

For information on installing mod_fastcgi with Apache 2.x, see the file INSTALL.AP2.

とあるので、INSTALL.AP2を読みます。

cp Makefile.AP2 Makefile
make
make install

すると/usr/local/apache2/modules/にmod_fastcgi.soが出来てました。ではhttpd.confに

LoadModule fastcgi_module modules/mod_fastcgi.so
<IfModule mod_fastcgi.c>
   FastCgiIpcDir /tmp/fcgi_ipc/
   AddHandler fastcgi-script .fcgi
</IfModule>

を付け加えて、再起動です。

FastCGI: access for server (uid -1, gid -1) failed: read not allowed
FastCGI: can't create dynamic directory "/tmp/fcgi_ipc/dynamic": access for server (uid -1, gid -1) failed: read not allowed

こんなエラーが出る場合は、

chown -R httpd:httpd fcgi_ipc
chmod -R 777 fcgi_ipc

として権限をつけておいてやるか、

<IfModule mod_fastcgi.c>
   FastCgiIpcDir /tmp/fcgi_ipc/
   AddHandler fastcgi-script .fcgi
</IfModule>

を、

User httpd
Group httpd

と定義してある下に書いてやります。

ログ

インストールしたら、ログの設定は変更しておきましょう。 APACHE_HOME/conf/httpd.confで

#CustomLog /usr/local/apache/logs/access_log common

コメントし、

CustomLog /usr/local/apache/logs/access_log combined

を生かします。

ワームのログをはずす

APACHE_HOME/conf/httpd.confで

#画像ファイル,CSSはログをとらない
SetEnvIf Request_URI "\.(gif)|(jpg)|(png)|(css)$" nolog
#ローカルIPからのはログはとらない
SetEnvIf Remote_Addr 192.168.100. nolog
#wormのログは別ログへ
SetEnvIf Request_URI "^/_mem_bin/" worm nolog
SetEnvIf Request_URI "^/_vti_bin/" worm nolog
SetEnvIf Request_URI "^/c/" worm nolog
SetEnvIf Request_URI "^/d/" worm nolog
SetEnvIf Request_URI "^/msadc/" worm nolog
SetEnvIf Request_URI "^/MSADC/" worm nolog
SetEnvIf Request_URI "^/scripts/" worm nolog
SetEnvIf Request_URI "^/default.ida" worm nolog
SetEnvIf Request_URI "root\.exe" worm nolog
SetEnvIf Request_URI "cmd\.exe" worm nolog
SetEnvIf Request_URI "NULL\.IDA" worm nolog
CustomLog logs/access_log combined env=!nolog
CustomLog logs/worm_log combined env=worm

ついでにSEARCHで始まるやたら長いアクセスも除外します。414のエラーがそれです。

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

に変更しておきましょう。

日本語が化ける

#AddDefaultCharset ISO-8859-1
AddDefaultCharset none
またLanguagePriority?にjaをせっていして日本語の優先度をあげます。

AddDefaultCharset Off

noneなんて指定なかったんですね。なぜこんなことを覚えてしまったんでしょう。マニュアルを読まずに検索エンジンに頼ってしまった結果です。ちょっと他のも見直してみます。またLanguagePriority? は、「MultiViews? リクエストを扱うときに、クライアントが優先順位を提供していない場合の 言語の優先順位を設定します」と書いてあるので、関係ないです。またAddDefaultCharsetはデフォルトでOffなので、

#AddDefaultCharset ISO-8859-1

でもいいです。これでも化けるページがありました。

<meta http-equiv="Content-Type" content="text/html; charset=shift_jis">

と設定してあるのに。調べると、<title>が<meta>より上にきているページでした。 http://web-sniffer.net/などでHTTP Response Headerを確認してみましょう。

http://httpd.apache.org/docs-2.0/mod/core.html#adddefaultcharset

VirtualHost?の設定

httpd.confに

NameVirtualHost *:80
<VirtualHost *:80>
   ServerName www.j2se.org
   ServerAlias j2se.org
   DocumentRoot H:\webroot1
   <Directory "H:\webroot1">
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
   CustomLog "H:\webroot1\logs\access.log" combined
   ErrorLog "H:\webroot1\logs\error.log"
</VirtualHost>
<VirtualHost *:80>
   ServerName www.hidekazu.info
   ServerAlias hidekazu.info
   DocumentRoot H:\webroot2
   <Directory "H:\webroot2">
       AllowOverride All
       Order allow,deny
       Allow from all
   </Directory>
   CustomLog "H:\webroot2\logs\access.log" combined
   ErrorLog "H:\webroot2\logs\error.log"
</VirtualHost>

としてやると、www.j2se.orgとwww.hidekazu.infoの2つ出来上がりました。このとき元のhost(hidekazu.dhs1.sst.ne.jp)にはpukiwiki/pukiwiki.phpがあって、www.j2se.orgにはない場合、www.j2se.org/pukiwiki/pukiwiki.phpとすれば、どうなるのでしょうか。 この場合は、表示されます。つまりwww.j2se.orgにない場合は、通常の設定があればそれを使用するのです。ですので、VirtualHost?ではなく通常の設定を消してしまえば、どこにもないので、表示はされません。ただこのときtomcatと連携している場合は、tomcatは表示されます。これは、tomcatのserver.xmlのHostの設定によります。 見せたくない場合は、server.xmlの<Hostで始まっているタグでname="localhost"とあるのですが、これを

<host name="hidekazu.dhs1.sst.ne.jp" ....

とします。次に、Apacheと連携しているということは、workers2.propertiesがあると思いますので、これに、[uri:/home/*]となっていたのを

[uri:hidekazu.dhs1.sst.ne.jp/home/*]

と変更してやります。するとwww.j2se.orgからはhomeは見えなくなります。
ServerAlias? hidekazu.infoとしていますが、この設定がない場合は、hidekazu.infoでアクセスされた場合、最初のバーチャルホストのホームページが みえてしまいますので、エリアスを設定しています。 またVirtualHost?が増えていくと管理がやりにくくなりますので、ここは別のファイルで管理します。apacheのディレクトリの下に

mkdir vhosts

として、VirtualHost?用のディレクトリを作成します。 その中に適当にVirtualHost?ごとにファイルを作成します。上の例でいくと、j2se.confと、hidekazu.confで作成しました。その中身は<VirtualHost? *:80>から</VirtualHost?>までです。ファイルの中身が書き終えましたら次は、http.confを修正します。<VirtualHost? *:80>以下を消します。その代わりに、

Include vhosts/*.conf

を設定しておきます。するとそのvhostsにあるファイルを読み込んでくれるので、管理が少し楽になります。設定は

httpd -t -D DUMP_VHOSTS

で確認してください。

Apache の設定 - 1つのホストで複数のhttp/httpsサーバを運用する

SSL

インストールされてない場合は、http://www.openssl.org/source/からダウンロードしましょう。apacheのconf以下に、ssl.confがありますので、これのSSLCertificateFile?とSSLCertificateKeyFile?を参照してください。SSLCertificateFile?が証明書を示しており、SSLCertificateKeyFile?が秘密鍵を示しています。デフォルトでは、conf/server.crtとconf/server.keyです。もしかしたら、server.crtとserver.keyはssl.crtとssl.keyだたかもしれません。ではconf/server.keyで

openssl md5 * > rand.dat
openssl genrsa -rand rand.dat -des3 1024 > server.key 

SSLのCSR参照 次に、CSRを作ります。CSRとは、サイト証明書を発行するためのリクエストになります。confの下で作業します。

openssl req -new -x509 -days 365 -key ssl.key/server.key -out myserver.crt
(openssl req -new -key ssl.key/server.key -out myserver.crt ベリサリンの場合)
Country Name             (2 letter code) [GB]:JP<リターン>
State or Province Name   (full name)     [Berkshire]:Osaka
Locality Name            (eg, city)      [Newbury]:Osaka-shi
Organization Name        (eg, company)   [My Company Ltd]:Kaisya Co.
Organizational Unit Name (eg, section)   []:IT
Common Name              (eg, your name or your server's hostname)[]:test.com
Email Address            []:test@test.com
  • days 証明書の有効期限を設定 承認局を使わず自分で承認する場合は、このファイルをssl.crtにserver.crtにして保存しておきましょう。 他局で承認してもらう場合はmyserver.crtを送りましょう。 です。ではapacheを立ち上げましょう。
    apachectl startssl
    ここでEnter pass phrase:と聞かれますので、秘密鍵でいれたキーを入力します。 またこのパスワード聞かれると困る方は(自動起動で)
    openssl rsa -in server.key -out server.key
    で作成してください。またinit.dはdaemon /usr/local/apache2/bin/httpd -D SSLにしておいてください。
  • ベリサリン(高い。ただしメジャー)で
    openssl md5 * >rand.dat
    openssl genrsa -rand rand.dat -des3 1024 > server.key
    cd ..
    openssl req -new -key ssl.key/server.key -out myserver.crt
  • Toritonで(安い。3年で2万くらい) 契約ができると3つのファイルが送られてくる。
    GTECyberTrustRoot.crt
    ComodoSecurityServicesCA.crt
    www_hogehoge_jp.crt
    www_hogehoge_jp.crtを
    conf/ss.crtにserver.crtで保存
    GTECyberTrustRoot?.crtを
    conf/sslrootに保存
    ComodoSecurityServicesCA.crtを
    conf/sslrootに保存
    保存すると後は、ssl.confで
    SSLCertificateFile /usr/local/apache2/conf/ssl.crt/server.crt
    SSLCertificateKeyFile /usr/local/apache2/conf/ssl.key/server.key
    SSLCACertificatePath /usr/local/apache2/conf/sslroot
    SSLCACertificateFile /usr/local/apache2/conf/sslroot/COMODOSECURITYSERVICESCA.CRT
    というように設定をしてやる。ただ安さと引き替えに携帯電話での問題がありますので、この辺はコストパフォーマンスを考えながら選択することになります。
    参考:携帯電話とSSLルート証明書

http://ash.jp/sec/openssl_ca.htm
http://www.stackasterisk.jp/tech/systemConstruction/apache09_01.jsp
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/702apachessl.html http://www.atmarkit.co.jp/fnetwork/rensai/pki03/pki01.html
http://www.atmarkit.co.jp/flinux/rensai/apache12/apache12a.html
http://www.atmarkit.co.jp/fnetwork/rensai/pki01/pki01.html
http://www.bitlink.co.jp/server/httpd_conf.htm

クライアント証明書

SSLで方法は記述していますが、phpのプログラムを動かすと、

ページを表示できません

とIEで表示されました。FireFox?では

Method Not Allowed

と表示されるときがあります。ログを見てみると、

[error] SSL Re-negotiation in conjunction with POST method not supported! hint: try SSLOptions +OptRenegotiate

とありますので、SSLOptions +OptRenegotiate?をつけてトライしたのですが、現象は変わらず。調べておりましたら、 apacheのバグらしく、2.2では直っているとのこと。使っているのは2.0でした。んーー うなっていてもしょうがないので、 http://issues.apache.org/bugzilla/show_bug.cgi?id=12355を参考にパッチを当てるか、postをgetに変えましょう。 一応2.0.54用ですが、下に添付してあります。ssl_engine_io.c,mod_ssl.h,ssl_engine_kernel.c 参考 http://framework.g.hatena.ne.jp/tukiichi/comment?date=20070214

拒否

ドメインで拒否する場合

deny from .hoge.com .hoge2.com

IPで拒否する場合

deny from 100.200. … 100.200.で始まるアドレスを拒否する

うまくいかないときはAllowOverride? Noneになっていなか確かめましょう。

SSI

.htaccessに

Options +IncludesNoExec
AddType text/html .shtml
AddHandler server-parsed .shtml

として、インクルードしたいファイルに

<!--#include file="test2.htm"-->

と記述します。IncludesNoExec?をIncludes にすることも可能ですが、この場合EXECコマンドが使えるので、セキュリティを考慮してください。

帯域制限

mod_bandwidthは1.3で2.0には対応していないらしいので、bwshareをインストールしてみます。ただ、for Apache 1.3.x and 2.0.44となっているので、2.0.53はどうなんでしょうか。http://www.topology.org/src/bwshare/README.html

既存のトラフィック制御モジュール
Apache で特定のコンテンツへのアクセスに対して帯域制限しよう

ab

Apache BenchというApacheのベンチマークツールです。たとえば

ab -n 100 -c 10 -w http://localhost/index.html > kekka.html

とすると100回のリクエストを10の同時接続でテストします。 -A user:passwordを追加すれば認証のあるページもテストできます。

http://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.html

セキュリティ

とりあえずこちらを一読Apacheの安全を確保するための10の対策

Apacheのバージョン情報を隠す

ServerSignature Off

http://www.ne.jp/asahi/tokyo/shin/linux/apache/apache01.html

情報の抑止

ServerTokens Prod

デフォルトはFullなので、Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod?/1.2 なことを教えちゃいます。 http://httpd.apache.org/docs/2.2/ja/mod/core.html#servertokens
もっと消したい場合は、バナー抑制!を参考に

mod_security

Web Application Firewall (WAF)というもので、これはapacheに組み込んで使うのですが、ホストのチェックやURLパラメータチェック、POSTチェック等をしてくれます。ぜひ組み込んでおきましょう。 マニュアルです。http://hp.vector.co.jp/authors/VA027424/mod_security/v_1_9_stable_ja_.html
http://www.modsecurity.org/download/index.htmlよりダウンロードしました。

wget http://www.modsecurity.org/download/modsecurity-1.8.7.tar.gz
tar xzvf modsecurity-1.8.7.tar.gz
cd modsecurity-1.8.7

1.9.4がでてますが、同じようにします。 ここにINSTALLファイルがありますので、一読しておきましょう。

cd apache2

apache1系の場合はcd apache1です。

/usr/local/apache2/bin/apxs -cia mod_security.c

するとhttpd.confに

LoadModule security_module    modules/mod_security.so

が設定されていると思います。
2.1.1もでてますね。あれ、だいぶんちがうなー まず、mod_unique_idがいるので、apacheを--enable-unique-idでコンパイルします。 オプションでlibxml2がいるみたいので、入れておきます。http://xmlsoft.org/http://xmlsoft.org/downloads.htmlよりダウンロードします。

ftp://xmlsoft.org/libxml2/libxml2-2.6.28.tar.gz
tar xzvf libxml2-2.6.28.tar.gz
cd libxml2-2.6.28
./configure --with-zlib --with-html --with-xpath --with-xptr --with-xinclude
make
make install

ではmodsecurity-apache_2.1.1をインストールしましょう。

wget http://www.modsecurity.org/download/modsecurity-apache_2.1.1.tar.gz
tar xzvf modsecurity-apache_2.1.1.tar.gz

次にapache2ディレクトリにある、Makefileを編集します。

#top_dir      = /apps/apache22
top_dir      = /usr/local/apache2
INCLUDES=-I/usr/include/libxml2

ではインストールです。

make
make install

すると/usr/local/apache2/modulesにmod_security2.soができてますので、httpd.confに

LoadModule security2_module modules/mod_security2.so

を追加します。apacheを再起動したら、

Cannot load /usr/local/apache2/modules/mod_security2.so into server: /usr/local/apache2/modules/mod_security2.so: undefined symbol: xmlFree

と怒られましたので、

LoadFile /usr/lib/libxml2.so

を追加しました。 ではルールをhttp://www.modsecurity.org/download/modsecurity-core-rules_2.1-1.4.tar.gzよりダウロードし、

mkdir /usr/local/apache2/conf/modsec
cd /usr/local/apache2/conf/modsec
tar xzvf modsecurity-core-rules_2.1-1.4.tar.gz

とし、httpd.confに

<IfModule security2_module>
  Include conf/modsec/*.conf
</IfModule>

を付け加えておきます。http://www.modsecurity.org/documentation/ModSecurity-Migration-Matrix.pdfに1系からの移行についてまとめがあります。

ではhttpd.confに設定します。1系

<IfModule mod_security.c>
 SecFilterEngine On  <-フィルターエンジンをON
 SecFilterScanPOST On <- POSTの解析をON
 SecFilterDefaultAction "deny,log,status:406" <-デフォルトのアクションの設定です。denyで拒否し、logでログに残し、エラー画面は406です。
 SecFilter /etc/passwd <-index.html?/etc/passwdとかリクエストにこの文字列が入っている場合はエラーです。
# script tag 
 SecFilter "<[[:space:]]*script.*>"
 SecFilter "<[[:space:]]*style.*>"
 SecFilter "<[[:space:]]*link.*>"
 SecFilter "<[[:space:]]*body[[:space:]]*>"
# suspected protocol
 SecFilter "javascript:"
 SecFilter "vbscript:"
 SecFilter "about:"
# call script
 SecFilter "expression\("
 SecFilter "&{.*};"
# event
 SecFilter "onError"
 SecFilter "onUnload"
 SecFilter "onBlur"
 SecFilter "onFocus"
 SecFilter "onClick"
 SecFilter "onMouseOver"
 SecFilter "onMouseOut"
 SecFilter "onSubmit"
 SecFilter "onReset"
 SecFilter "onChange"
 SecFilter "onSelect"
 SecFilter "onAbort"
#
 SecFilterSelective REQUEST_METHOD "!(GET|POST|HEAD)" <-リクエストがGET,POST,HEAD以外はエラー
 SecAuditEngine RelevantOnly <-RelevantOnlyでルールと一致したものがログに落ちます。
 SecAuditLog /usr/local/apache2/logs/modsec.log <-ログ
</IfModule>

一部単語の最後の文字が全角になってますが、これはそのままですと引っかかって登録できないので変えてます.... またルールについては、下記のURLから参考にさせてもらいました。WebDAVの場合はメソッドで、COPY,MKCOL,MOVE,PROFIND,PROPATCH,LOCK,UNLOCK,DELETE等追加しないと動きません。 またhttp://www.modsecurity.org/download/modsecurity-rules-current.tar.gzからダウンロードして、 解凍した*.confを

apache2/conf/modsec/

にでもコピーして

Include conf/modsec/*.conf

としておけば、logsディレクトリに

modsec_audit.log

が出力されます。ただし

SecFilterSignatureAction "log,pass,msg:'Command execution attack'"

のようにpassになってますので、denyにでも変えておきます。 もっと厳しくするには、
http://www.gotroot.com/tiki-index.php?page=mod_security+rules
よりダウンロードしましょう。 ブラックリストのルールがあります。
http://www.atmarkit.co.jp/fsecurity/rensai/webhole11/webhole01.html
http://www.atmarkit.co.jp/fsecurity/rensai/webhole12/webhole02.html
http://www.softek.co.jp/Sec/mod_security3.html
http://hp.vector.co.jp/authors/VA027424/mod_security/mod_security_manual_v_1_8_4_ja_.html#40

DOS対策

mod_evasiveをhttp://www.zdziarski.com/projects/mod_evasive/よりダウンロードします。Apache2の場合

wget http://www.zdziarski.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz
tar xzvf mod_evasive_1.10.1.tar.gz
cd mod_evasive
/usr/local/apache2/bin/apxs -i -a -c mod_evasive20.c

するとhttpd.confに

LoadModule evasive20_module   modules/mod_evasive20.so

が追加されていました。ではディレクティブです。

<IfModule mod_evasive20.c>
   DOSHashTableSize    3097
   DOSPageCount        2
   DOSSiteCount        50
   DOSPageInterval     1
   DOSSiteInterval     1
   DOSBlockingPeriod   10
</IfModule>

またオプションとして、

Optionally you can also add the following directives:
   DOSEmailNotify      you@yourdomain.com
   DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
   DOSLogDir           "/var/lock/mod_evasive"

も指定出来るそうです。このあたりの細かい内容はREADMEに記述してあるのですが、上記の設定では、 同ページで、1秒間に(DOSPageInterval?)に2回以上(DOSPageCount)、 もしくは同サイトで1秒間に(DOSSiteInterval?)に50回以上(DOSSiteCount)リクエストがあった場合に、 10秒(DOSBlockingPeriod?)ブロックすると言ったような設定になります。
http://d.hatena.ne.jp/stanaka/20070204/1170553603
http://itpro.nikkeibp.co.jp/article/COLUMN/20070510/270527/

libwww-perl

ログを見ていると、スパムでユーザエージェントにlibwww-perl/5.65とかやってくる場合があります。Googleでははじいているようですので、 はじいちゃいましょう。

SetEnvIf User-Agent "^libwww" deny_ua
Order allow,deny
Allow from all
Deny from env=deny_ua

ついでにLWP::Simpleも止める場合は、

SetEnvIf User-Agent "^LWP::Simple" deny_ua

を追加しておきます。 Googleにもアクセス拒否され、スパム送信源と化した「libwww-perl」とは?

ロボット

ロボットに巡回してほしくない場合に、サイトのトップにrobots.txtを作成します。

User-agent: *
Disallow: /secret/

ただ無視する検索エンジンもあります。 参考
robots.txt とは?
検索エンジンロボットを制御する

TIPS

インストールされているモジュールを調べる

httpd -l

あと

httpd -M

とか。

httpd: Could not determine the server's fully qualified domain name, using 127.0.0.1 for ServerName?というエラーがでた。

httpd.confのservernameを直しましょう。

Indexリストで特定のファイルを非表示にしたい。

IndexIgnore? *.hoge

ヘッダ、フッタをすべてのページにつけたい

SSI以外にmod_layoutが使えるかもしれません。ちょっと使ってないので、わからないですが。他にもphpでヘッダや、フッタをincludeするとか。どれが一番楽でしょうね。

File 'NONEXISTENT/charsets/?.conf' not found

エラーログにエラーが出まくってました。どうもphpをインストールするとき、--with-mysql=/usr/local/mysqlをつけてなかったからみたいです。詳しくは、 http://www.hamusuta.net/mame/viewkizione.php?kizino=04022940416e4111521

プロセスIDの指定

PidFile logs/httpd.pid

起動中のhttpdに設定を反映させる~

apachectl graceful

別のURLに転送させたい

Redirectを使います。 http://www.itmedia.co.jp/help/tips/linux/l0397.html

HTTPメソッドで制限をかけたい

GETとPOSTを制限したい場合は.htaccessで

<Limit GET POST>
 order deny,allow
 deny from all
 allow from 192.168.1
</Limit>

とか

追加でモジュールを入れたい

たとえばmod_rewrite

cd httpd-2.0.54
mkdir work
cp -ip modules/mappers/mod_rewrite.c work/
cp -ip modules/mappers/mod_rewrite.h work/
cd work
/usr/local/apache2/bin/apxs -c mod_rewrite.c
/usr/local/apache2/bin/apxs -i -a -n rewrite mod_rewrite.la

mod_proxy

cd httpd-2.0.54
mkdir work
cp -ip modules//proxy/mod_proxy.c work/
cp -ip modules//proxy/mod_proxy.h work/
cd work
/usr/local/apache2/bin/apxs -c mod_proxy.c
/usr/local/apache2/bin/apxs -i -a -n proxy mod_proxy.la

ん?動かしたらエラーがでたぞ。

[warn] proxy: No protocol handler was valid for the URL /hoge. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

これだけではだめなのか。では

/usr/local/apache2/bin/apxs -cia mod_proxy.c proxy_util.c
/usr/local/apache2/bin/apxs -cia proxy_connect.c
/usr/local/apache2/bin/apxs -cia proxy_http.c

で動きました。素直に--enable-proxyをつけてコンパイルしましょう。

IPアドレス制限とユーザー認証

Satisfyを使います。 IPアドレス制限とユーザー認証の組み合わせ

RDF(Resource Description Framework)を開きたい

AddType application/xml .rdf
AddType text/xml;charset=UTF-8 .rdf

リンク

http://httpd.apache.org/
Apache HTTP サーバ バージョン 2.0 ドキュメント 調べるときに
Apache2 に OpenSSL を適用するための覚え
Apache バーチャルホスト説明書
パソコンおやじ
Apacheのインストール
Studying HTTP HTTPの勉強に
Apache 2.0 + mod_proxy によるリバース・プロキシの構築
Apache入門
mod_concat で複数ファイルを連結して配信する
.htaccessで使える16の技
web開発者なら知っておきたい HTTPステータスコード

参考書籍

Apache2設定&管理 逆引きリファレンス
このアドバンスリファレンスシリーズは辞書代わりにつかうのは大変便利です。ほかのも買ってしまいました。

カテゴリ

:web

コメント

  • #comment

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-12-29 (金) 15:25:17 (2311d)