apache2.4.x

=注意=
apacheのコンパイルにはgrepの更新が必要です。
以下のコマンドで"Bad egrep"と表示される場合はエラーが発生します。
  $ if echo GNU | egrep '(GNU|BFD)' >/dev/null; then echo "Good egrep"; else echo "Bad egrep"; fi

apacheの2.4.x系をインストールしようとしたら、文句言われた。。。
内容がかなり変わりそうな予感なので新しい項目で書こうと思った。
久しぶりなので、ちゃんとかけるか不安だったりする。
「文句言われた」
./configureしたら最初から「APRが無いぞ」と言われた(´・ω・`)

	┃configure:
	┃configure: Configuring Apache Portable Runtime library...
	┃configure:
	┃checking for APR... no
	┃configure: error: APR not found.  Please read the documentation.

やること一覧
	・aprのインストール:
	・apache2.4.xのインストールApache HTTPサーバのインストール
		コンパイルとインストール - Apache HTTP サーバ
		Linux Tips「ソ−スコンパイルのApacheも/etc/rc.d/init.d/下のスクリプトで制御させたい」ユーザーディレクトリを有効にするバーチャルホストを有効にする設定変更時の注意点ログの設定(最低限やっておきたいこと)Apache - JAVAに関する備忘録 HIDEKAZU PukiWiki
		Regular Expression(Riue ちゃんの正規表現講座) - Index
		Stray Penguin - Linux Memo (logrotate)



aprのインストール



「」


apache2のインストール

httpd-2.2.19.tar.gzを探してくる。
Welcome! - The Apache HTTP Server Project
で、ユーザーのホームディレクトリにFFFTPで送る。
例のあれ

	$ tar xvfz httpd-2.2.19.tar.gz
	$ cd httpd-2.2.19
	$ ./configure --prefix=/opt/apache2 --enable-suexec \
	--with-suexec-caller=apache2 --with-suexec-docroot=/home
	または(2.2.15以降)
	$ ./configure --prefix=/opt/apache2 --enable-suexec --enable-reqtimeout \
	--with-suexec-caller=apache2 --with-suexec-docroot=/home
		

option説明など
--with-mpm=apacheの動作タイプを変更する
prefork(デフォルト)/worker/perchildが使用可能
phpを利用する場合にはpreforkが推奨されている
--enable-suexecsuexecを有効にする
--enable-reqtimeoutmod_reqtimeoutを有効にする
--with-suexec-caller=suexecの初期実行ユーザーの指定
--with-suexec-docroot=suexecの実行ディレクトリの指定
\改行しても実行に移らないようにする呪文
本来はバックスラッシュ(キーボードの右下にある/の右隣のキー)
日本語環境では\になる

$ make # make install 注:バージョンアップ(例:2.0.x=>2.2.xに変更)の時はPHPの再コンパイルが必要。
おまじない
	# strip -p /opt/apache2/bin/*
	# strip -p /opt/apache2/lib/*
suexecの設定の確認
	# /opt/apache2/bin/suexec -V
		┃ -D AP_DOC_ROOT="/home"
		┃ -D AP_GID_MIN=100
		┃ -D AP_HTTPD_USER="apache2"
		┃ -D AP_LOG_EXEC="/opt/apache2/logs/suexec_log"
		┃ -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
		┃ -D AP_UID_MIN=100
		┃ -D AP_USERDIR_SUFFIX="public_html"
			注:デフォルトではユーザーID、グループIDともに100未満のユーザーでは
			  実行できないようになっています。なので、rootだとエラーが出ます。
設定変更
	# vi /opt/apache2/conf/httpd.conf
		(最低限の変更)
		┃User apache2
		┃Group  httpd
		┃
		┃ServerName 玄箱のIP:80
		┃ServerName 取得ドメイン名:80
			注:ServerNameにはDDNS名も登録しておく(複数表記可能)
テスト1
	# /opt/apache2/bin/apachectl start
		玄箱( http://kuro-box/ )にアクセスして「予想に反して」ページが出るか確認
	# /opt/apache2/bin/apachectl stop
自動起動の設定
	# cp /opt/apache2/bin/apachectl /etc/init.d/httpd
	# chmod 755 /etc/init.d/httpd
	# ln -s /etc/init.d/httpd /etc/rc.d/rc2.d/S25httpd
	# ln -s /etc/init.d/httpd /etc/rc.d/rc0.d/K25httpd
	# ln -s /etc/init.d/httpd /etc/rc.d/rc6.d/K25httpd
テスト2(起動|再起動|停止)
	# /etc/init.d/httpd start
	# /etc/init.d/httpd restart
	# /etc/init.d/httpd stop
成功なら再起動
	# shutdown -r now
で、確認
	$ ps ax
「デフォルトでコンパイル・ロードされるモジュール」
apache関係のサイトでてんこ盛りのオプションをつけてconfigureしているサイトを良く見かけます。
でも、あれってapache1.x系のころの情報を引きずっているだけみたいです(あとは明示的に指定しないと落ち着かない人とか)
実際、何も指定しない状態( ./configure --prefix=/opt/apache2 のみ)で2.0.54をコンパイルした時、
$ /opt/apache2/bin/httpd -l
	┃Compiled in modules:
	┃  core.c		Apache のコア
	┃  mod_access.c	クライアントのホスト名や IP アドレスによってアクセス制御を行なう
	┃  mod_auth.c	テキストファイル形式の認証ファイルを使用した ユーザ認証機能を提供する
	┃  mod_include.c	サーバがパースする html ドキュメント
	┃  mod_log_config.c	サーバへのリクエストのロギング
	┃  mod_env.c	CGI スクリプト及び SSI ページに渡される環境変数を変更する機能を提供する
	┃  mod_setenvif.c	リクエストの特徴に基づいた環境変数の設定を可能にする
	┃  prefork.c	スレッドを使わず、先行して fork を行なうウェブサーバを実装
	┃  http_core.c
	┃  mod_mime.c	リクエストされたファイルの拡張子とファイルの振る舞い (ハンドラとフィルタ)、
			内容 (MIME タイプ、言語、文字セット、エンコーディング) とを関連付ける
	┃  mod_status.c	サーバの活動状況と性能に関する情報を提供する
	┃  mod_autoindex.c	Unix の ls コマンドや Win32 の dir シェルコマンドに似た ディレクトリインデックスを生成する
	┃  mod_asis.c	自分用の HTTP ヘッダの書かれているファイルを送信する
	┃  mod_cgi.c	CGI スクリプトの実行
	┃  mod_negotiation.c	コンテントネゴシエーション 機能を提供する
	┃  mod_dir.c	「最後のスラッシュ」のリダイレクトと、ディレクトリのインデックスファイルを扱う機能を提供する
	┃  mod_imap.c	Server-side imagemap processing
	┃  mod_actions.c	メディアタイプやリクエストメソッドに応じて CGI スクリプトを実行する機能を提供
	┃  mod_userdir.c	ユーザ専用のディレクトリを提供
	┃  mod_alias.c	ホストファイルシステム上のいろいろな違う場所を ドキュメントツリーにマップする機能と、 
			URL のリダイレクトを行なう機能を提供する
	┃  mod_so.c		起動時や再起動時に実行コードとモジュールをサーバにロードする
				内臓マニュアル http://kuro-box/manual/mod/ より解説抜粋(上記説明部分)
と、これだけのモジュールが読み込まれます。
ほとんどのサイトで指定される --enable-so (作られるモジュールはmod_so.c)も何も指定せずにコンパイルされてますね。
みんな、無駄が多すぎるよ(;´Д`)

ユーザーディレクトリを有効にする

アドレス表記例:http://kuro-box/~ruche/

ユーザーのディレクトリからサイトを公開する方法
問題点は

まぁ、あるものは使えるようにしておくって事で。

WEBテスト用ユーザーを作る
	# useradd -g users -d /home/ruche -s /bin/bash ruche
	# mkdir /home/ruche
	# passwd ruche
	# chown ruche /home/ruche
設定ファイルの煮詰め
	httpd.confを書き直して、
	/opt/apache2/bin/httpd -t で確認。
		を繰り返す。納得できる設定になるまで。
ユーザーディレクトリ使用のための変更部分(参考程度)
	# vi /opt/apache2/conf/httpd.conf
		(変更)
		┃    Options FollowSymLinks Includes ExecCGI MultiViews
		(中略)
		┃<Directory /home/*/public_html>
		┃    AllowOverride FileInfo AuthConfig Limit Indexes
		┃    Options MultiViews SymLinksIfOwnerMatch IncludesNoExec
		┃#     <Limit GET POST OPTIONS PROPFIND>
		┃#         Order allow,deny
		┃#         Allow from all
		┃#     </Limit>
		┃    <LimitExcept GET POST OPTIONS PROPFIND>
		┃        Order deny,allow
		┃        Deny from all
		┃    </LimitExcept>
		┃</Directory>
		┃
		┃<Directory /home/*/public_html/cgi-bin/>
		┃Options ExecCGI
		┃# SetHandler cgi-script
		┃</Directory>
			他に、管理者のメールアドレスなど
			注:直す場所と結果は上記の通りですが、どこをどう直したか忘れました(をひ
他にやったこと
	rucheのディレクトリに public_html を作って「トロピカルフルーツ@避難所」をアップ(を
	cgiの改行コードがCR+LF(Win標準)なのでLFに変更
	cgiのperlへのパスが間違ってるので修正(1行目:#!/usr/bin/perl)
「public_html」
ユーザーディレクトリのルート(一番上)を公開するとそれより下はすべて公開されます。
それは危険(いや?)なので、public_htmlというWEB公開用のディレクトリを作って、そこにhtmlを放り込みます。
もし、ルートを公開してmaildir形式を採用、アクセス権を間違えるとメールが全部丸見え・・・ガクガク(((;゚Д゚)))ブルブル

「納得できる設定」
どういう設定をするかは、利便性と安全性を天秤にかけて決めます。
管理者の気持ち一つなので詳細な設定は出せませんが、サイト巡りをして自分にあった設定を見つけ出しましょう。
私の場合は、
基本的にデフォルト
隠しファイルとか置くからディレクトリのインデックス化は無効
ユーザーディレクトリではcgi-bin以下でのみCGIを使えるようにする(テスト用)
servers以下ではsuexecでCGIを実行する
といった感じ(気まぐれで変わるかも)

「suexecを使うときの注意点」
ディレクトリのguestのアクセス権にwをつけるとエラーを吐いて止まります。
だって、guestがアクセスしてもuser権限で動作させることを目的としてるんですもの。矛盾するからね。

バーチャルホストを有効にする

アドレス表記例:http://fuga.hoge.com/

アドレスが判りやすいので、多分、こっちがメインになっていくと思われ。

httpd.confの修正

	# vi /opt/apache2/conf/httpd.conf
		(変更)
		┃# ScriptAlias /cgi-bin/ "/opt/apache2/cgi-bin/"
			ScriptAliasをコメントアウト(404notFound防止)
		┃# ### Section 3: Virtual Hosts
			以下、全部コメントアウト
http.confの最後にvhost.confを読み込むように指定する
	# vi /opt/apache2/conf/httpd.conf
		(追加)
		┃# </VirtualHost>
		┃Include conf/vhost.conf
vhost.confの作成(最低限の設定?)
	# vi /opt/apache2/conf/vhost.conf
		(新規)
		┃NameVirtualHost *:80
		┃
		┃<VirtualHost *:80>
		┃    ServerAdmin [your@mail]
		┃    DocumentRoot /home/www/default
		┃    ServerName fuga.hoge.com
		┃    UserDir disable    SuexecUserGroup ruche users
		┃    <Directory "/home/www/default">
		┃      Options FollowSymLinks Includes
		┃      AllowOverride None
		┃      Order allow,deny
		┃      Allow from all
		┃    </Directory>
		┃    <Directory "/home/www/default/cgi-bin">      Options ExecCGI      AllowOverride None      Order allow,deny      Allow from all    </Directory>    ErrorLog logs/default-error_log    CustomLog logs/default_log combined env=!nolog
		┃</VirtualHost>
			注:ServerAdminは省略可能(省略時はhttpd.confのメールアドレスを使用)
			注:CGIを使わないなら赤文字の部分を削除する。
			注:ログをaccessから分離する必要が無いなら青文字の部分を削除する。
			注:combined env=!nolog は後で使うからここでは説明は省く。
/home/www/defaultを作成
	$ mkdir [-p] /home/www/default
		注:適宜、chmodやchownを実行すること
htmlを/home/www/defaultにUPする

複数のバーチャルホストを立てたい場合は、
<VirtualHost *:80>〜</VirtualHost>を立てたいバーチャルホスト分だけ作成する。
一番最初のバーチャルホストがデフォルトホストになり、間違ったホスト名が入力されたとき表示される。
デフォルトホスト
一番ロボット検索に探されるホスト。言い換えれば、一番攻撃を受けるホスト。
私の場合、デフォルトホストにはhtmlとcssの簡単なページをつくり、CGIを無効にしている。
とにかくウイルスからCGIの狙い撃ちなど、いろんな中の人がやってくる場所になります。
アドレス(ホスト部分)の記述ミスでも表示される場所だから、誘導するリンクを作っておくのも手。
まぁ、検索の誘導にもなると思うけど・・・

あぁ、間違っても/home/wwwや/homeにデフォルトホストとかを作らないこと。
自分用の隠しページも開かれてしまう可能性があるので(指定したディレクトリ以下が見れるようになるから)

--設定変更時の注意点--

設定変更をしたら構文チェックをしてapacheを再起動する

	# /opt/apache2/bin/httpd -t
	# /etc/init.d/httpd restart
バーチャルホストの確認方法
	1.WAN側のproxyサーバーを経由する
	2.おやじ氏のチェッカーを利用する
	3.Winのhostsファイルを編集してしまう(あまりお勧めしません)
		注:プロバイダがproxyサーバーを提供してるならそっちを使ったほうが楽
ルータのポートを開くのを忘れないように


ログの設定(最低限やっておきたいこと)

問題発生時にはログを確認して状況を把握するのが基本となるわけだけど・・・

デフォルトのまま運用してしまうと
ウィルスにアクセスされて不必要なログができたり、
画像のアクセスログとかいろいろなログがいっぱい録られたり、
ログが肥大化したりして、
不必要なログに必要なログが埋もれて見づらくなってしまう。

だから、最低限やっておきたいことを記載しておく。

事前処置

	# vi /opt/apache2/conf/httpd.conf
		(変更)
		┃#CustomLog logs/access_log common
ウィルスログの分離
不要なログの破棄
	# vi /opt/apache2/conf/vhost.conf
		(追加)
		┃##logging settings
		┃
		┃#CSS,gif,png,jpg,js logging off
		┃SetEnvIf Request_URI "\.(gif)|(jpe?g)|(png)|(css)|(js)$" nolog
		┃#BGM files(midi,mp3) logging off
		┃SetEnvIf Request_URI "\.(midi?)|(mp3)$" nolog
		┃#local ip logging off
		┃SetEnvIf Remote_Addr 192.168. nolog
		┃#worm log is other log-file
		┃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\.printer" worm nolog
		┃SetEnvIf Request_URI "NULL\.IDA" worm nolog
		┃
		┃CustomLog logs/access_log combined env=!nolog
		┃CustomLog logs/worm_log combined env=worm
			注:別にhttpd.confに書いてもかまわない
			  管理しやすいからvhost.confに書いているだけ
上記設定でもれるウィルスログの処理
W32.HLLW.Gaobot.gen対策
ウィルスの情報:W32.HLLW.Gaobot.gen
ログの例
	$ cat /opt/apache2/logs/access_log | grep SEARCH
		┃... "SEARCH /\x90\x02\xb1\x02\xb1 ...
	$ cat /opt/apache2/logs/error_log | grep "URI too long"
		┃... request failed: URI too long (longer than 8190)
処置方法
	# vi /opt/apache2/conf/httpd.conf
		(変更)
		┃LogFormat "%h %l %u %t \"%!414r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
ログの肥大化防止
	# vi /etc/logrotate.d/httpd
		...ってviで書くよりも、Winで書いてFFFTPでアップしたほうが楽(を
			設定はログローテートを参照。
過去ログ保存用ディレクトリ(olddirの指定先)の作成
	# mkdir /opt/apache2/logs/old
長かった・・・orz
「問題発生時にはログを確認して状況を把握」
クラッカーに関してはよくわからないけど、ソフトウェアの問題についてはよくわかります。
ほとんどはログを根気よく読んで、サイト検索を地味に続ければ解決します。
ただ使うだけのWinに慣れちゃうとログって意味あるの?と思ってしまいがちですが・・・

「問題点の特定」
これって、本当に地味な作業だからもう二度とやりたくないものばかりですね。
だから、このサイト作ってるんだけど・・・(;´Д`)


戻るなら押せ!