* 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://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/