タグ別アーカイブ: Apache

Basic認証よりセキュアなDigest認証を使う方法

よく.htaccessで、認証制限をかけたいページにこんなの書いてますよね。

AuthType Basic
AuthName "Input your ID and Password."
AuthUserFile /path/to/.htpasswd
require valid-user

然し、Basic認証って実は入力したユーザ名とパスワードを平文で送信してしまうのです。
つまり、通信パケットを監視されていれば、認証に必要な入力情報をカンタンに拾えてしまうという事。

そこで、認証情報をMD5暗号化して送信するDigest認証。
詳しい仕組みは下記を参照のこと。
http://ja.wikipedia.org/wiki/Digest%E8%AA%8D%E8%A8%BC

自分でApacheのコンフィグを操作できる場合、下記コンフィグが読み込まれているか確認しましょう。
レンタルサーバの場合は対応がまちまちなので、各々お問い合わせください。

# Apache2.2以下:/etc/httpd/conf/httpd.conf
# Apache2.4以降:/etc/httpd/conf.module.d/00-base.conf
LoadModule auth_digest_module modules/mod_auth_digest.so

パスワードの作成は「htpasswd」コマンドの代わりに「htdigest」コマンドを使います。
※パスワードファイルの名前は自由ですが、Apacheの標準設定では「.ht」から始まるファイル名は全て表から閲覧できないようになっています。
なので、パスワードファイルを複数作る際は「.htdigest.loginuser」や「.htadmin」といったように
ファイル名が「.ht」から始まるようにしましょう。

htdigest (オプション引数) "(パスワードファイルのパス)" "(レルム)" (ユーザ名)
↓例↓
htdigest -c "/path/to/.htdigest" "Digest Auth" user001

.htaccessには、上記例を参考にするとこういう記述になるはず。
※AuthName(レルム)が一致していること。

AuthType Digest
AuthName "Digest Auth"
AuthUserFile "/path/to/.htdigest"
Require valid-user

エラーページやHTTPヘッダから、Apacheとphpのバージョンを隠す方法

・Apacheのバージョンを隠す:

#sudo vi /etc/httpd/conf/extra/httpd-default.conf
ServerTokens Prod

・HTTPヘッダにphpに関する情報を出力させない

#sudo vi /etc/php.ini
expose_php = Off

Apacheリロード

#sudo systemctl restart httpd

Webページ読み込みを高速化させるHTTPサーバモジュール「mod_pagespeed」

Googleが公開したmod_pagespeedは、画像の最適化やキャッシュ、JS/CSSなどの最適化を自動で行なってくれるため、インストールするだけで表示速度が高速になります。
その代わり、サーバのパワー消費が大きくなります。

ダウンロードは以下から。パッケージ版とソースコード版があります。
https://developers.google.com/speed/pagespeed/module?hl=ja

インストールが完了すると、モジュールの他に下記コンフィグファイルがあると思いますが
/path/to/httpd/conf.d/pagespeed.conf
/path/to/httpd/conf.d/pagespeed_libraries.conf
このpagespeed.confを下記サイトを参考に弄ってみましょう(基本的にはデフォルトのままでも十分効果を発揮します)
https://www.cyberagent.co.jp/recruit/techreport/report/id=7992

最後にApacheをリロードして、ページロード時間を測ってみましょう( ^ヮ^)ノ

ApacheをDoS攻撃(田代砲)から守るための対策モジュール「mod_evasive」

Apache1.3~2.xでDoS対策をするためのモジュール「mod_evasive」。
バージョンによりインストール方法が違うので、ファイル同梱のREADMEを参照されたし。

Linux(ここではRedHat系ディストリ)+Apache 2.x系での導入方法は以下の通り。
※その前に、http-develをインストールしておくこと。

1.インストール

・epelレポジトリからインストールする場合

sudo rpm -Uvh http://ftp.riken.jp/Linux/fedora/epel/epel-release-latest-7.noarch.rpm
sudo yum --enablerepo=epel install mod_evasive

・ソースからコンパイルする場合

wget http://www.zdziarski.com/blog/wp-content/uploads/2010/02/mod_evasive_1.10.1.tar.gz
tar xvzf mod_evasive_1.10.1.tar.gz
cd mod_evasive_1.10.1
#Apache2.4系は「mod_evasive20.c」内の文字列「remote_ip」を「client_ip」に変換してください。
sudo apxs -iac mod_evasive20.c
sudo chmod 755 /usr/lib64/httpd/modules/mod_evasive20.so

※ Windows版のDLLライブラリは現在行方不明です(´・ω・`)

2.Apacheのコンフィグにモジュールを追加する

#sudo vi /etc/httpd/conf/httpd.conf
#Windowsでは「.so」を「.dll」に置換
LoadModule evasive20_module modules/mod_evasive20.so

3.コンフィグ作成

#sudo vi /etc/httpd/conf.d/mod_evasive.conf
DOSHashTableSize 4096
DOSPageCount 3
DOSSiteCount 50
DOSPageInterval 1
DOSSiteInterval 5
DOSBlockingPeriod 30
DOSLogDir /var/log/httpd/mod_evasive

※コンフィグ内訳:

DOSHashTableSize → ハッシュテーブルのサイズ
DOSPageCount   → 同一ページへのリクエスト数
DOSSiteCount   → 同一サイトへのリクエスト数
DOSPageInterval  → DOSPageCount値の計測間隔(秒)
DOSSiteInterval  → DOSSiteCount値の計測間隔(秒)
DOSBlockingPeriod → アクセス禁止時間(秒)
DOSEmailNotify  → メール通知先
DOSSystemCommand → ブラックリストに乗ったときにコマンドを起こす
DOSLogDir     → DOSのログ、デフォは/tmp
DOSWhitelist   → モジュールから除外するIP。複数指定可

以上の設定例では、同一のユーザから
同一ページへ3回以上/1秒のアクセス、またはサイトへ50回以上/5秒のアクセスがあった場合に、30秒間アクセスを弾きます。
その際ユーザへ送られるHTTPリクエストは、403 Forbiddenとなります。
abコマンドで負荷テストをするなりして、いい具合に設定しましょう( ^ヮ^)ノ

4.Apache再起動

sudo systemctl restart httpd

実はもうひとつ、似たようなモジュールがありまして。
5年以上前に(株)はてなのエンジニアさんが作った「mod_dosdetector」なる中級者向けのそれ。
DoS判定が立つと、Apacheのリライトルールに使用できる環境変数が発生し
同じくリライトルールでアクセス対応をする。といった代物。
コンフィグは、mod_evasiveと似たり寄ったりです。
http://www.trajectory.jp/tech/server/dosdetector.php

CentOS6.5で、Apache2.2.26のソースコードをrpmにリビルドしてアップデートしたときのお話

サーバエンジニアの友達「Apache2.2.15使ってんすか」

十円玉「centosplusレポジトリからね( ´-`)y-~~」

サーバエンジニアの友達「それ、穴だらけっすよ。リクエストの空受けしたりしますよ。2.2系なら2.2.25出てますけどそれもまだ・・・。」

十円玉「今2.2.26出てんのか( ´-`)y-~~」

久しくターボールをパッケージビルドしていなくて色々忘れている十円玉「aprのバージョンで弾かれた(´・ω・`)」

aprをビルドするも下手こく十円玉「・・・ッッッ(`゚д゚´)」

サーバエンジニアの友達「今『su -』でrootになってるんですよね?そしたらビルド環境こうしたらどうすか( ´-`)つ」

サーバエンジニアの友達「Linuxには、変数やディレクトリの予約語があるので注意してくださいね」

#rpmbuildの環境ディレクトリを作成
#mkdir /root/rpmbuild/{SPECS,BUILD,BUILDROOT.SOURCES,SRPMS,RPMS}

 

#vi .rpmmacros
%_topdir          /root/rpmbuild
%_specdir         %{_topdir}/SPECS
%_builddir        %{_topdir}/BUILD
%_buildroot       %[_topdor]/BUILDROOT
%_sourcedir       %{_topdir}/SOURCES
%_srcrpmdir       %{_topdir}/SRPMS
%_rpmdir          %{_topdir}/RPMS

サーバエンジニアの友達「aprとapr-utilsのターボールをさっきのSOURCESディレクトリにコピーして」

サーバエンジニアの友達「aprとapr-utilsのターボールを解凍したら、*.specファイルをさっきのSPECディレクトリにコピーするじゃないですか」

サーバエンジニアの友達「apr.specはこうじゃないですか?」

#vi /root/rpmbuild/SPECS/apr.spec
#「Version」を合わせる
#「%define aprver 1」直下に、変数「prefixdir」を定義する
%define prefixdir /usr/local/apr
#「Source0」のパスの拡張子を、SOURCESディレクトリと合わせる
Source0: http://www.apache.org/dist/apr/%{name}-%{version}.tar.gz
#./configureのオプションを以下に変更
./configure \
        --prefix=%{prefixdir} \
#以下をコメントアウト
#make check || exit 1
#変数「%{_libdir}」を、冒頭で定義した「%{prefixdir}」に置換
#rm -f $RPM_BUILD_ROOT%{_libdir}/apr.exp
↓
rm -f $RPM_BUILD_ROOT%{prefixdir}/lib/apr.exp
#以下をコメントアウト
#%doc CHANGES LICENSE NOTICE
#変数「%{_libdir}」を、冒頭で定義した「%{prefixdir}」に置換
#%{_libdir}/libapr-%{aprver}.so.*
↓
%{prefixdir}/lib/libapr-%{aprver}.so.*
#「$doc」をコメントアウト
#%doc docs/APRDesign.html docs/canonical_filenames.html
#%doc docs/incomplete_types docs/non_apr_programs
#%doc --parents html
#変数「%{_bindir}」を、冒頭で定義した「%{prefixdir}」に置換
#%{_bindir}/bin/apr*config
#%{_bindir}/lib/libapr-%{aprver}.*a
#%{_bindir}/lib/libapr-%{aprver}.so
#%dir %{_libdir}/apr
#%dir %{_libdir}/apr/build-%{aprver}
#%{_libdir}/apr/build-%{aprver}/*
#%{_libdir}/pkgconfig/apr-%{aprver}.pc
#%dir %{_includedir}/apr-%{aprver}
#%{_includedir}/apr-%{aprver}/*.h
↓
%{prefixdir}/bin/apr*config
%{prefixdir}/lib/libapr-%{aprver}.*a
%{prefixdir}/lib/libapr-%{aprver}.so
%dir %{prefixdir}/lib
%dir %{prefixdir}/build-%{aprver}
%{prefixdir}/build-%{aprver}/*
%{prefixdir}/lib/pkgconfig/apr-%{aprver}.pc
%dir %{prefixdir}/include/apr-%{aprver}
%{prefixdir}/include/apr-%{aprver}/*.h

サーバエンジニアの友達「apr-util.specは」

#vi /root/rpmbuild/SPECS/apr-util.spec
#「Version」を合わせる
#「%define apuver 1」直下に、変数「prefixdir」を定義する
%define prefixdir /usr/local/apr
#「Source0」のパスの拡張子を、SOURCESディレクトリと合わせる
Source0: http://www.apache.org/dist/apr/%{name}-%{version}.tar.gz
#以下をコメントアウト若しくは削除
#%package pgsql
#Group: Development/Libraries
#Summary: APR utility library PostgreSQL DBD driver
#BuildRequires: postgresql-devel
#Requires: apr-util = %{version}-%{release}
#%description pgsql
#This package provides the PostgreSQL driver for the apr-util
#DBD (database abstraction) interface.
#%package mysql
#Group: Development/Libraries
#Summary: APR utility library MySQL DBD driver
#BuildRequires: mysql-devel
#Requires: apr-util = %{version}-%{release}
#%description mysql
#This package provides the MySQL driver for the apr-util DBD
#(database abstraction) interface.
#%package sqlite
#Group: Development/Libraries
#Summary: APR utility library SQLite DBD driver
#BuildRequires: sqlite-devel >= 3.0.0
#Requires: apr-util = %{version}-%{release}
#%description sqlite
#This package provides the SQLite driver for the apr-util DBD
#(database abstraction) interface.
#%package freetds
#Group: Development/Libraries
#Summary: APR utility library FreeTDS DBD driver
#BuildRequires: freetds-devel
#Requires: apr-util = %{version}-%{release}
#%description freetds
#This package provides the FreeTDS driver for the apr-util DBD
#(database abstraction) interface.
#%package odbc
#Group: Development/Libraries
#Summary: APR utility library ODBC DBD driver
#BuildRequires: unixODBC-devel
#Requires: apr-util = %{version}-%{release}
#%description odbc
#This package provides the ODBC driver for the apr-util DBD
#(database abstraction) interface.
#「./configure」を以下のように書き換える
#※ここはあくまでもウチでの環境でのサンプル
./configure \
        --with-apr=%{prefixdir} \
        --with-ldap --without-gdbm \
        --with-berkeley-db \
        --with-crypto --with-openssl --with-nss \
        --without-sqlite2 \
#以下のコメントアウトを外す
make check || exit 1
#変数「%{_libdir}」を、「%{prefixdir}」に置換する
#rm -f $RPM_BUILD_ROOT%{_libdir}/aprutil.exp
↓
rm -f $RPM_BUILD_ROOT%{prefixdir}/lib/aprutil.exp
#変数「%{_libdir}」を、「%{prefixdir}」に置換する
#「$doc~」をコメントアウト
%doc CHANGES LICENSE NOTICE
%{_libdir}/libaprutil-%{apuver}.so.*
%dir %{_libdir}/apr-util-%{apuver}
↓
#%doc CHANGES LICENSE NOTICE
%{prefixdir}/lib/libaprutil-%{apuver}.so.*
%dir %{prefixdir}/include/apr-%{apuver}
#変数「%{_libdir}」を、「%{prefixdir}」に置換する
#%{_libdir}/apr-util-%{apuver}/apr_dbm_db*
↓
%{prefixdir}/lib/apr-util-%{apuver}/apr_dbm_db*
#以下をコメントアウト
#%files pgsql
#%defattr(-,root,root,-)
#%{_libdir}/apr-util-%{apuver}/apr_dbd_pgsql*
#%{prefixdir}/lib/apr-util-%{apuver}/apr_dbd_sqlite*
#%files mysql
#%defattr(-,root,root,-)
#%{_libdir}/apr-util-%{apuver}/apr_dbd_mysql*
#%files sqlite
#%defattr(-,root,root,-)
#%{_libdir}/apr-util-%{apuver}/apr_dbd_sqlite*
#%files freetds
#%defattr(-,root,root,-)
#%{_libdir}/apr-util-%{apuver}/apr_dbd_freetds*
#%files odbc
#%defattr(-,root,root,-)
#%{_libdir}/apr-util-%{apuver}/apr_dbd_odbc*
#変数「%{_libdir}」を、「%{prefixdir}」に置換する
#%{_libdir}/apr-util-%{apuver}/apr_ldap*
↓
%{prefixdir}/lib/apr-util-%{apuver}/apr_ldap*
#%{_libdir}/apr-util-%{apuver}/apr_crypto_openssl*
↓
%{prefixdir}/lib/apr-util-%{apuver}/apr_crypto_openssl*
#%{_libdir}/apr-util-%{apuver}/apr_crypto_nss*
↓
%{prefixdir}/lib/apr-util-%{apuver}/apr_crypto_nss*
#変数「%{_libdir}」「%{_incluidedir}」を、「%{prefixdir}」に置換する
#%{_bindir}/apu-%{apuver}-config
#%{_libdir}/libaprutil-%{apuver}.*a
#%{_libdir}/libaprutil-%{apuver}.so
#%{_libdir}/pkgconfig/apr-util-%{apuver}.pc
#%{_includedir}/apr-%{apuver}/*.h
↓
%{prefixdir}/bin/apu-%{apuver}-config
%{prefixdir}/lib/libaprutil-%{apuver}.*a
%{prefixdir}/lib/libaprutil-%{apuver}.so
%{prefixdir}/lib/pkgconfig/apr-util-%{apuver}.pc
%{prefixdir}/include/apr-%{apuver}/*.h
#以下をコメントアウト
#%doc --parents html

サーバエンジニアの友達「で、aprとutilをビルドして」

#aprのrpmパッケージを作成
rpmbuild -bb /root/rpmbuild/SPECS/apr.spec
rpmbuild -bb /root/rpmbuild/SPECS/apr-util.spec

サーバエンジニアの友達「出来上がったrpmを同時アップデート」

#aprアップデート
rpm --force --nodeps -Uvh /root/rpmbuild/RPMS/x86_64/apr-*.*.*-*.x86_64.rpm\
/root/rpmbuild/RPMS/x86_64/apr-devel-*.*.*-*.x86_64.rpm /root/rpmbuild/RPMS/x86_64/apr-debuginfo-*.*.*-*.x86_64.rpm

サーバエンジニアの友達「そしたら、Apacheのも同じ方法でビルド出来ますよね?」

段々思い出してきた十円玉「無事、Apache2.2が最新版になりやしたっっっっっ(`゚д゚´)」

ちなみに、Apache2.2.15以降のバージョンでは
コンフィグが少し改変されております、必ずチェックし直してね( ^ヮ^)ノ
2.4系はガラッと変わるよ( ^ヮ^)ノ

極力簡単な方法で、Webページの読み込み速度を向上させる

●Apache
吐き出されるテキストファイル全てにGZIP圧縮をかけた。

#vi /etc/httpd/cond.d/deflate.conf
<Location />
	<IfModule mod_headers.c>
		Header append Vary User-Agent env=!dont-vary
	</IfModule>
	<IfModule mod_deflate.c>
		SetOutputFilter DEFLATE
		BrowserMatch ^Mozilla/4\.0[678] no-gzip
		BrowserMatch ^Mozilla/4 gzip-only-text/html
		BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
		SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
		SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
		AddOutputFilterByType DEFLATE text/plain
		AddOutputFilterByType DEFLATE text/html
		AddOutputFilterByType DEFLATE text/xml
		AddOutputFilterByType DEFLATE text/css
		AddOutputFilterByType DEFLATE text/javascript
		AddOutputFilterByType DEFLATE application/xhtml+xml
		AddOutputFilterByType DEFLATE application/xml
		AddOutputFilterByType DEFLATE application/rss+xml
		AddOutputFilterByType DEFLATE application/atom_xml
		AddOutputFilterByType DEFLATE application/javascript
		AddOutputFilterByType DEFLATE application/x-javascript
		AddOutputFilterByType DEFLATE application/x-httpd-php
	</IfModule>
    <ifModule mod_expires.c>
        ExpiresActive On
    
        ExpiresDefault "access plus 1 seconds"
        ExpiresByType text/html "access plus 1 seconds"
        ExpiresByType image/gif "access plus 2592000 seconds"
        ExpiresByType image/jpeg "access plus 2592000 seconds"
        ExpiresByType image/png "access plus 2592000 seconds"
        ExpiresByType image/x-icon "access plus 2592000 seconds"
        ExpiresByType text/css "access plus 604800 seconds"
        ExpiresByType text/javascript "access plus 216000 seconds"
        ExpiresByType application/x-javascript "access plus 216000 seconds"
        ExpiresByType application/x-shockwave-flash "access plus 216000 seconds"
    </ifModule>
</Location>

※上記コンフィグのLocationの囲いを取っ払って、.htaccessに記載してもOK。

●php
CentOS標準のバージョンが5.3だったのを、remiレポジトリ導入で5.5にyumアップデート。

●中間キャッシュエンジン導入
php5.3まではAPCかeAcceleratorかxcacheの三択だったが、
php5.5になってからは、「OPcache」が標準導入され
リソースを漁っている内に、OPcacheが今後メジャーなキャッシュエンジンになっていくだろうと確信を得て導入。
っつか、OPcacheってphp5.2からPECLで使えたのね。

#vi /etc/php.d/opcache.conf
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=256
opcache.interned_string_buffer=0
opcache.max_accelerated_files=5000
opcache.fast_shutdown=1

●php内のデータオブジェクト・セッション等のキャッシュ
PECL::memcachedを使用

●その他導入を考えたけど・・・
・phpをFPM+Fast-CGIモジュールで動かそうかとも考えていたが、標準と大差がなかったので今回は省略。
セキュアなWebシステムの運用をするわけでもなければ、Apacheモジュール版のphpエンジンで十分です。

●WordPress高速化
以下を参照されたし。
http://www.10yendama.com/archives/740