* Apacheインストール [#e0292372]

#setlinebreak(on);

・[[インストール>#install]]
・[[設定ファイルの記述>#edit_config]]
・[[自動起動用スクリプトの作成>#make_init_script]]
・[[自動起動するようにサービスとして登録>#entry_service]]
・[[ログファイルの設定>#config_log]]
  ・[[ログのローテーション設定>#config_log01]]
  ・[[ワームのログを分ける>#config_log02]]
・[[セキュリティ対策>#security]]
  ・[[エラーページにサーバのバージョン等を表示しない>#security01]]
  ・[[CGIプログラムなどをコンテンツユーザーの権限で実行するようにする>#security02]]
  ・[[PHPのセーフモードをOnにする>#security03]]
・[[機能拡張>#extension]]
  ・[[Apacheをmod_perl対応にする]]
  ・[[ApacheでSSL(SNI)設定]]
  ・[[ApacheとRailsをmod_proxyで連携する]]

&aname(install);
◆インストール
 cd /usr/local/src
 tar zxfv httpd-2.0.50.tar.gz
 cd /usr/local/src/httpd-2.0.50
 ./configure --enable-module=so --enable-ssl --with-ssl=/usr/local/ssl
 make
 make install
#myterm2(){{
cd /usr/local/src
tar zxfv httpd-2.0.50.tar.gz
cd /usr/local/src/httpd-2.0.50
./configure --enable-module=so --enable-ssl --with-ssl=/usr/local/ssl
make
make install
}}
 ※せっかくApache2にしたので mpm=worker で動かしたいが、マルチスレッド対応でないPHP関数が存在するようなのでとりあえず保留。
#html(<table><tr><td colspan="2">   [マニュアルより引用]</td></tr><tr><td style="width:10px;"></td><td style="border=1px solid #000000">)
 いくつかのオーペレーティングシステムでflock() はプロセスレベルで実装されています。
 ISAPIのようなマルチスレッド型のサーバーAPIを使用している場合、同じサーバーインスタンスの並列スレッドで実行されている
 他のPHPスクリプトに対してファイルを保護する際に flock()を使用することはできません!
#html(</td></tr></table>)

&aname(edit_config);
◆設定ファイルの記述
  [ /usr/local/apache2/conf/httpd.conf ]
 DocumentRoot "/xxx/xxx/xxx" ・・・  必要に応じて変更
 User httpd  ・・・  Apacheの実行ユーザ(事前にユーザを作成しておく)
 Group httpd  ・・・   〃 実行グループ
 LanguagePriority ja en ca cs da de el eo es et …  ・・・  jaを一番前に
 #AddDefaultCharset ISO-8859-1  ・・・  コメントアウト
 ServerTokens Prod  ・・・  クライアントに返すサーバ情報はプロダクト名のみ
 ServerSignature Off  ・・・  エラーページ等にサーバ情報を表示しない
/usr/local/apache2/conf/httpd.conf
#mycode2(){{
DocumentRoot "/xxx/xxx/xxx" ・・・  必要に応じて変更
User httpd  ・・・  Apacheの実行ユーザ(事前にユーザを作成しておく)
Group httpd  ・・・   〃 実行グループ
LanguagePriority ja en ca cs da de el eo es et …  ・・・  jaを一番前に
#AddDefaultCharset ISO-8859-1  ・・・  コメントアウト
ServerTokens Prod  ・・・  クライアントに返すサーバ情報はプロダクト名のみ
ServerSignature Off  ・・・  エラーページ等にサーバ情報を表示しない
}}

  [ /usr/local/apache2/conf/mime.types ]
 application/x-httpd-php php    ・・・php用の設定を追加 
/usr/local/apache2/conf/mime.types
#mycode2(){{
application/x-httpd-php php    ・・・php用の設定を追加 
}}

&aname(make_init_script);
◆起動スクリプトの作成
 cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd  ・・・ apachectlをコピーして作成
 vi /etc/init.d/httpd
 −−−−−−−−−−−−−−−−
 #!/bin/sh
 #
 <font color=red># chkconfig: 345 90 10    ・・・ 起動するランレベル サービス起動する順番 サービス停止する順番
 # description: Apache web server
 # processname: httpd</font>
 〜〜〜〜〜〜〜〜〜〜〜〜〜〜
 ※chkconfigからメンテできるようにスクリプトの上部にこういうのを追加。(赤部分)
#myterm2(){{
cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd  ・・・ apachectlをコピーして作成
}}


◆起動スクリプトを編集(chkconfigからメンテできるように)
/etc/init.d/httpd
#mycode2(){{
#!/bin/sh
#
# chkconfig: 345 90 10    ・・・ 起動するランレベル サービス起動する順番 サービス停止する順番
# description: Apache web server
# processname: httpd

}}

&aname(entry_service);
◆自動起動するようにサービスとして登録
 chkconfig --add httpd       ・・・  サービスに httpd を追加
#myterm2(){{
chkconfig --add httpd       ・・・  サービスに httpd を追加
}}

&aname(config_log);
&aname(config_log01);
◆ログのローテーション設定
 (アクセスログが肥大化しすぎないように一定間隔でローテーションするように設定。)
  [/etc/logrotate.d/httpd]を以下の内容で新規作成
 /usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log {
 weekly
 rotate 8
 create
 missingok
 sharedscripts
 postrotate
 /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid` >/dev/null 2>&1
 endscript
 }
(アクセスログが肥大化しすぎないように一定間隔でローテーションするように設定。)
/etc/logrotate.d/httpd を以下の内容で新規作成
#mycode2(){{
/usr/local/apache2/logs/access_log /usr/local/apache2/logs/error_log {
  weekly
  rotate 8
  create
  missingok
  sharedscripts
  postrotate
  /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid` >/dev/null 2>&1
  endscript
} 
}}

&aname(config_log02);
◆ワームのログを分ける
  サーバを外部に公開して1週間たらずで不振なアクセスがあった。

 218.246.33.41 - - [02/Sep/2005:08:30:39 +0900] "GET /NULL.IDA?CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
 CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC%u0aeb
 %ub890%u898b%u77e8%u0000%u0000%u838b%u0094%u0000%u408b%u0564%u0150%u0000%ue0ff%u9090=x&\x90\x90\x90\
 x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\
 x90\x90\x90\x90\xeb\t\x90\x90\x90_\xeb\b\x90\x90\x90\xe8\xf5\xff\xff\・・延々と続いて・・・・最後にcmd.exe$ HTTP/1.1"  404 206

  しかも何度か連続してアクセスしてきている。

  気になったのでCyberSyndorome((http&#58;//www.cybersyndrome.net/))で調べてみると中国からのアクセスらしい。
  さらにググってみると MicrosoftのWebサーバ、IIS(Internet Information Service)へワーム攻撃らしい。。(てゆーかIISちゃうし。)
  外部と接続はしてるけど検索エンジンにサイトを登録したりとか別にしてないし、する予定もないが、
  (なぜか)ログ解析はしてるのでアクセスログを汚されたくない。。ので、このログを別ファイルに分ける設定をします。

  [httpd.confを編集] ※赤字部分を追加(または変更)
 ・
 ・
 <font color=red><IfModule mod_setenvif></font>
 <font color=red>SetEnvIf Request_URI "default\.ida" worm</font>  こーゆーのもあるらしい
 <font color=red>SetEnvIf Request_URI "null\.ida" worm</font>
 <font color=red></IfModule></font>
 ・
 ・
 <font color=red>CustomLog logs/access.log combined env=!worm</font>
 <font color=red>CustomLog logs/worm.log combined env=worm</font>
 ・
 ・


&aname(security);
◆セキュリティ対策

&aname(security01);
  (1) エラーページにサーバのバージョン等を表示しない。
#html(<table><tr><td style=padding-left:10px>)
  [httpd.config]
 ・
 ServerSignature Off
 ・
 ServerTokens Prod
#html(</td><td>)
※エラー時(403 Not Found など)にサーバのバージョン等が表示されてしまうと、
 そのバージョンにセキュリティホールなどがある場合は、攻撃対象になってしまうので非表示にしておく。

※これでクラッカーなどによる被害を防げる訳ではありません。 セキュリティーホールは必ず塞ぐ必要がある。
#html(</td></tr></table>)

&aname(security02);
  (2) 共用サーバの場合は、CGIプログラムなどをApacheの実行ユーザー権限ではなく、
    それぞれのコンテンツユーザーの権限で実行するようにする。
#html(<table><tr><td style=padding-left:10px>)
 make distclean
 ./configure --enable-module=so \
 --enable-ssl \
 --with-ssl=/usr/local/ssl \
 --enable-suexec \
 --with-suexec-caller=nobody \
 --with-suexec-docroot=/var/www \
 --with-suexec-userdir=web \
 --with-suexec-uidmin=500 \
 --with-suexec-gidmin=500 \
 --with-suexec-safepath=/usr/local/bin:/usr/bin:/bin \
 --with-suexec-bin=/usr/local/apache2/bin/suexec
 make
 make install
#html(</td><td>)
 --with-suexec-caller ・・・ httpd.conf で指定するapahcheの実行ユーザ
 --with-suexec-uidmin ・・・ CGI/SSI プログラム実行を許可するユーザ ID(グループID)の最小値。
 --with-suexec-gidmin     (システム用のアカウントを閉め出すのに有効。)
#html(</td></tr></table>)

#html(<table><tr><td style=padding-left:10px>)
 #!/usr/bin/perl print "Content-type: text/html\n\n"; print `whoami`;
#html(</td><td valign=top>)
こんなカンジのCGIを用意して確認。
Apacheの実行ユーザ(httpdとか)でなく、コンテンツユーザのIDが表示されればOK。
#html(</td></tr></table>)

   suexec を使用するには、UserDir で行う方法と、VirtualHostで行う方法がある。

    (a)バーチャルホストで行う方法。(とりあえず)
#html(<table><tr><td style=padding-left:10px>)
    [httpd.config]
>>
 NameVirtualHost *:80
 <VirtualHost *:80>
 ServerAdmin info@example.com
 DocumentRoot /home/example/www
 ServerName www.example.com
 ErrorLog logs/example.com-error_log
 TransferLog logs/example.com-access_log
 </VirtualHost>
 
 <VirtualHost *:80>
 ServerAdmin info@example2.com
 DocumentRoot /home/example2/www
 ServerName www.example2.com
 ErrorLog logs/example2.com-error_log
 TransferLog logs/example2.com-access_log
 SuexecUserGroup example2 example2
 UserDir disable
 <Directory "/home/example2/www">
 Options +ExecCGI
 AddHandler cgi-script .cgi
 </Directory>
 </VirtualHost>
#html(</td><td>)
SuexecUserGroupにてCGI を実行するユーザを指定した場合のみ suexecが有効となる。
この場合、 /home/example/www 以下のcgi は、httpd.conf で指定した
Apacheの実行ユーザの権限で実行されるが、
/home/example2/www 以下のcgi は、ユーザ example2 権限で実行される。
#html(</td></tr></table>)

&aname(security03);
  (3) PHPのセーフモードをOnにする。
   ※suEXECモジュールでは、phpの実行権限を変えることができないので、PHPのセーフモードをOnにする。
   ./configure --help してみると、
   --enable-safe-mode      Enable safe mode by default.	
   と表示されたので、どうやらデフォルトで使用可能になっているようなので、php.ini をいじって safe_mode = "1" に変えてapache再起動。

#html(<table><tr><td colspan="2">   [マニュアルより引用]</td></tr><tr><td style="width:10px;"></td><td style="border=1px solid #000000;">)
 -rw-rw-r--    1 rasmus   rasmus       33 Jul  1 19:20 script.php
 -rw-r--r--    1 root     root       1116 May 26 18:01 /etc/passwd
 
 以下のscript.php を実行すると、
 <?php
  readfile('/etc/passwd');
 ?>
 
 セーフモードが有効な場合、以下のようなエラーが出力されます。
 Warning: SAFE MODE Restriction in effect. The script whose uid is 500 is not
 allowed to access /etc/passwd owned by uid 0 in /docroot/script.php on line 2
#html(</td></tr></table>)

   と同じようになったので OK。

   と思ったら、「セーフモードだとファイルの新規作成ができない」という不具合に遭遇!
   調べてみると、やっぱり新規作成はできないようだ(TT)
   それだとカナリ気まずいので、セーフモードはとりあえず保留。
   かなり気まずいので、セーフモードはとりあえず保留。

   [メモ]
  サイトのアイコンを変えるには、自分で作った(もしくはどっかからパクッてきた)アイコンファイルを
  favicon.icoというファイル名に変えてWEB公開しているディレクトリに置いておく。
 
   [アイコンを簡単に作れるサイト]
    http://www.chami.com/html-kit/services/favicon/

トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS