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
APACHE_HOME/binで実行
./apachectl start
停止は
./apacehctl stop
再起動は
./apachectl restart
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
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はパスワード含んでいるということです。
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
BrowserMatch "MSIE" AuthDigestEnableQueryStringHack=Onを追加するといけました。
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にこの条件がついてくれます。
ディレクトリを移動したい場合、そのディレクトリに.htaccessファイルを作り、
RewriteEngine on RewriteBase /hoge/ RewriteRule ^(.*)$ /hogehoge/$1 [R=301,L]
また/hogeでも移動させたい場合は、ルートに
RewriteEngine on RewriteRule /hoge$ /hogehoge/index.html [R=301,L]
参考:
http://tech.bayashi.net/svr/doc/apache/mod_rewrite.html
http://japache.infoscience.co.jp/rewriteguide/
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にしてみないか?
大きくは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);
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
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サーバを運用する
インストールされてない場合は、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
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
GTECyberTrustRoot.crt ComodoSecurityServicesCA.crt www_hogehoge_jp.crtwww_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というように設定をしてやる。ただ安さと引き替えに携帯電話での問題がありますので、この辺はコストパフォーマンスを考えながら選択することになります。
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になっていなか確かめましょう。
.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 で特定のコンテンツへのアクセスに対して帯域制限しよう
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の対策
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
もっと消したい場合は、バナー抑制!を参考に
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
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/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 とは?
検索エンジンロボットを制御する
httpd -l
あと
httpd -M
とか。
httpd.confのservernameを直しましょう。
IndexIgnore? *.hoge
SSI以外にmod_layoutが使えるかもしれません。ちょっと使ってないので、わからないですが。他にもphpでヘッダや、フッタをincludeするとか。どれが一番楽でしょうね。
エラーログにエラーが出まくってました。どうもphpをインストールするとき、--with-mysql=/usr/local/mysqlをつけてなかったからみたいです。詳しくは、 http://www.hamusuta.net/mame/viewkizione.php?kizino=04022940416e4111521
PidFile logs/httpd.pid
apachectl graceful
Redirectを使います。 http://www.itmedia.co.jp/help/tips/linux/l0397.html
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をつけてコンパイルしましょう。
Satisfyを使います。
IPアドレス制限とユーザー認証の組み合わせ
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設定&管理 逆引きリファレンス
このアドバンスリファレンスシリーズは辞書代わりにつかうのは大変便利です。ほかのも買ってしまいました。