%%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 # #