%%Title: apache の使い方
%%Created: Thu Aug 21 12:00:00 JST 1997
%%Updated: Wed Jun 19 18:44:16 JST 2002
o apache-2.0.55
o error_logに1秒置きに以下のメッセージが出る。
[warn] (51)Network is unreachable: connect to listener
主にインターフェイスに IPv6アドレスがついていないのが原因。
httpd.confで、IPv6アドレスを使わないように設定する。
Listen 0.0.0.0:80
#Listen [::]:80
またはコンパイル時に --disable-ipv6する。
o
SetHandler server-status
Order deny,allow
Deny from all
Allow from 10.0.0.0/8
Allow from 61.192.162.193
o
SetEnvIf Remote_Addr "^127\." no-logging
CustomLog /var/log/httpd/access_log combined env=!no-logging
o 認証されていない場合にRedirectする
SetEnvIf
o 直リンクを防ぐ
Refererを改竄してくる相手には無効
#
# disallow direct linking
#
SetEnvIf Referer "^http://www.tanu.org/" local_referal
SetEnvIf Referer "^http://127.0.0.1/" local_referal
SetEnvIf Referer "^$" local_referal
Order Deny,Allow
Deny from all
Allow from env=local_referal
o apache-2.0.46
SSIでゾンビプロセスができるのは mod_cgidを使った時だけと言うのが分かった。
LoadModule cgi_module libexec/apache2/mod_cgi.so
#LoadModule cgid_module libexec/apache2/mod_cgid.so
することででなくなる。
srclib/apr/threadproc/unix/proc.c が怪しそう。
o apache-2.0.39
apache-2系の 2.0.39 より古いバージョンと apache-1系の 1.3.26
より古いバージョンには、非常に深刻なバグがあります。
2002年6月の時点では、apache-2.0.39 か apache-1.3.26 を使いましょう。
http://httpd.apache.org/info/security_bulletin_20020617.txt
IPv6/IPv4 でHTTP喋るには?
Listen 0.0.0.0:80
Listen 80
文字化けする。
AddDefaultCharset ISO-8859-1
をコメントアウトする。
SSI使うとゾンビプロセスができる。当面以下のパッチで回避。
*** modules/generators/mod_cgid-old.c Fri Jun 14 04:41:17 2002
--- modules/generators/mod_cgid.c Wed Jul 10 21:38:02 2002
***************
*** 514,520 ****
--- 514,537 ----
apr_pool_create(&ptrans, pcgi);
+ #if 0
apr_signal(SIGCHLD, SIG_IGN);
+ #else
+ /*
+ * parent should ignore the signal from child
+ * or parent process has to wait for child process.
+ */
+ {
+ struct sigaction sa;
+
+ memset(&sa, 0, sizeof(sa));
+ sa.sa_handler = NULL;
+ sa.sa_flags = SA_NOCLDWAIT;
+ sigemptyset(&sa.sa_mask);
+ sigaction(SIGCHLD, &sa, (struct sigaction *)0);
+ }
+ #endif
+
apr_signal(SIGHUP, daemon_signal_handler);
if (unlink(sconf->sockname) < 0 && errno != ENOENT) {
o apache-1.2.0 を make する。
まず Configuration に以下の様なものを追加。
agent_log_module : AGENTをログする。
referer_log_module : REFERENCEをログする。
status_module : server status を表示出来るようにする。
rewrite_module : サーバ側でURIを書き換え出来るようにする。
proxy_module : PROXYモジュール
% cat Configuration
:
Module agent_log_module mod_log_agent.o
Module referer_log_module mod_log_referer.o
Module status_module mod_status.o
Module proxy_module modules/proxy/libproxy.a
:
% sh Configure を実行。
% make
o httpd.conf
apache-core.html などを参照…
o srm.conf
o access.conf
apache の設定
ここを熟読すれば完璧。
まず個人でいろいろやろうと思うなら、access.conf に
<Directory /usr/home/sakane/public_html>
Options All
AllowOverride All
order allow,deny
allow from all
</Directory>
とか書いておく。
o VirtualHost
IPアドレスごとに DocumentRoot を振る仕組み
DocumentRoot /usr/home/sakane/public_html/hardrock
ServerName hardrock.kame.net
FQDN毎にDocumentRootを振るには
http://127.0.0.1/~sakane/ln/apache2/vhosts/name-based.html
NameVirtualHost を * にする。
NameVirtualHost *
DocumentRoot /usr/local/www/hardrock.kame.net/
ServerName hardrock.kame.net
DocumentRoot /usr/local/www/www.tanu.org/
ServerName www.tanu.org
o あるディレクトリにパスワード制限をかける
.htaccess に以下のように書く。
AuthType Basic
AuthName Authentication
AuthUserFile /usr/local/etc/htpasswd
AuthGroupFile /dev/null
<limit get>
require user hoge
</limit>
htaccess でパスワードファイルを作る。
% htaccess -c /usr/local/etc/htpasswd hoge
でかいサーバは以下のディレクティブを使うべき。
AuthDBMUserFile
AuthDBMGroupFile
o プロキシのアクセス制限をかける
<filename>を使う。
正規表現も書けるけど、その場合は <FilesMatch regex>が好ましいとあるが、apache1.2.0では、使えない。
e.g.
<Files "hoge.html">
この中に Limit を書く
</Files>
<Files ~ "\.html">
この中に Limit を書く
</Files>
<FilesMatch "\..html">
この中に Limit を書く
</FilesMatch>
o 他のURLへ飛ばす。
サーバで指定する方法
httpd.conf に Redirect fromURL toURL とか書いとく。
ユーザが指定する方法
httpd.conf で AllowOverride FileInfo しとく。
.htaccess に
Redirect fromURL toURL
とか書いとく。書き方の詳細はここ
Rewrite を使う方法
o Server Side Include (SSI) する
ドキュメントのあるディレクトリの .htaccess や httpd.conf に XBitHackを設定する。
XBitHack on
user実行ビットが立っているファイルは SSIの対象にする
XBitHack Full
XBitHack onに加えて、group実行ビットが立っているファイルは Last-modified date を返す。
以前の Apacheでは、
AddType text/html .html
AddHandler server-parsed .html
を .htaccessやhttpd.confに設定していたが、この方法では
.htmlファイル全てが SSI対象になってしまうので、サーバ側に負荷がかかる。
SSIさせたい HTMLファイルに
<!--#exec cmd="ls" -->
とか、書いとく。すると、サーバ側で lsが実行されてドキュメントに含まれる。
<!--
Last-modified: <!--#flastmod virtual="index.html" -->
-->
とか書く。するとファイルを更新した日付が勝手に埋め込まれる。
o その他
% cat .htaccess
DirectoryIndex home.shtml
AddType text/html .shtml
AddHandler server-parsed .shtml
と書いてある状態で DirectoryIndex を読むと化ける。
SSLを使えるようにする。
注意: apache-2系には mod_ssl が最初から入ってる。
SSLを使えるようにする。
o mod_ssl を使う。
http://www.modssl.org/
sslとの違い。
o httpsd を make する。
- 以下からSSLeayとSSL化パッチを拾ってくる。
ftp://ftp.psy.uq.oz.au/pub/Crypto/SSL/
ftp://ftp.ox.ac.uk/pub/crypto/SSL
apache を ssl化するパッチに合わせたバージョンを拾ってくる。
SSLeay-0.8.0 -> apache_1.2.0+ssl_1.7.tar.gz
SSLeay-0.6.6 -> apache_1.2b8+ssl_1.5.tar.gz
apache_1.2.0+ssl_1.7.tar.gz だと、SSL3を張る時にI/O error する。
ブラウザのSSL3をdisableすればOK.
apache_1.2.0+ssl_1.8.tar.gz では、SSL3も動作OK.
- SSLeayをインストールする。
howto-ssl.txt 参照
- apache にパッチ SSLpatch をあてる。
README.SSL参照
src/Configuration に Module ssl_module apache_ssl.o が追加される。
- SSLeay.patch/src/apache_ssl.c を apache の src にコピーする。
- Configuration を編集する。
SSL_BASE= /usr/local/ssl
SSL_INCLUDE= -I$(SSL_BASE)/include
SSL_LIB_DIR= $(SSL_BASE)/lib
- ファイルをいくつか修正する。
MD5_CTX が APACHE_MD5_CTX に置き換わっている影響による。
以下のファイルを s/MD5_CTX/APACHE_MD5_CTX/ する。
src/modules/proxy/proxy_util.c
- make する。
% ./Configure ; make
o サーバ側認証(上位CAなし)
- サーバの証明書と鍵を生成する。
% ssleay req -nodes -new -x509 -keyout httpsd.key.pem -out httpsd.cert.pem
- httpsd.conf に cert と key を設定する。
SSLCertificateFile /usr/local/httpd/ssl/httpsd.cert.pem
SSLCertificateKeyFile /usr/local/httpd/ssl/httpsd.key.pem
o サーバ側認証(上位CAあり)
CA.sh を使用する。/usr/local/ssl/lib/ssleay.cnf の設定に従いCAの
為のディレクトリ、ファイルを作成する。
- デモ用新規CAの証明書と鍵を生成する。
% CA.sh -newca
(ssleay req -new -x509 -keyout cakey.pem -out cacert.pem)
- サーバの証明書と鍵を生成する。
% CA.sh -newreq
(ssleay req -new -keyout newreq.pem -out newreq.pem)
- サーバの証明書に署名をする。
% CA.sh -sign
(ssleay ca -policy policy_anything -out newcert.pem -infiles newreq.pem)
署名は CERTIFICATE REQUEST データのみで行なえる。
- httpsd.conf に cert と key を設定する。
SSLCertificateFile /usr/local/httpd/ssl/newcert.pem
SSLCertificateKeyFile /usr/local/httpd/ssl/newreq.pem
証明書と鍵は分離するべきか?
証明書や鍵のデータは、他のデータから分離すべきか?
% sed -n '/^-----BEGIN CERTIFICATE-----/,/^-----END CERTIFICATE-----/p' < newcert.pem > httpsd.cert.pem
% sed -n '/^-----BEGIN RSA PRIVATE KEY-----/,/-----END RSA PRIVATE KEY-----/p' < newreq.pem > httpsd.key.pem
o 上位CAをダウンロードするCGI
以下をクライアントに投げる。
echo "Content-Type: application/x-x509-ca-cert"
echo
cat cacert.pem
o クライアントに鍵を生成させる方法
o クライアント認証
certs.tar.gz を利用する。
- apps/ca.c にパッチをあてる。
o SSL httpsd.conf の設定例
#SSLDisable
#SSLCACertificatePath
#SSLCACertificateFile
SSLCertificateFile /usr/local/ssl/certs/httpsd.pem
SSLCertificateKeyFile /usr/local/ssl/private/httpsd.key
SSLVerifyClient 0
SSLVerifyDepth 10
SSLFakeBasicAuth
SSLLogFile /usr/local/httpd/logs/ssl.log
ssl のログ。full path
#SSLRequiredCiphers
#SSLRequireCipher
#SSLBanCipher
# Experiment with authorization...
#
#AuthType Basic
#AuthName Experimental
#AuthGroupFile /dev/null
#AuthUserFile /u/ben/www/1/users
#
#allow from all
#require valid-user
#
#