ウェブ、ショウジン

セキュリティ面に気をつかったphp.iniの設定

2009-6-30
Category
PHP

Ubuntu Server ver.8.10にインストールしたPHP5におけるphp.iniの設定内容メモ。

php.iniの場所は
/etc/php5/apache2/php.ini

*設定を変更したあとはApacheの再起動をして、設定を有効にするのを忘れないように。

$ sudo /etc/init.d/apache2 reload
 * Reloading web server config apache2
   ...done.

1. PHPのversionを隠す

expose_php = Off

2. ログに記録するレベルを指定

E_STRICTはPHP5で推奨されていない関数が使用された場合などに警告を出す

error_reporting = E_ALL & ~E_NOTICE | E_STRICT

3. エラーをHTMLで表示しない(Off)ようにする

この値がOnだと、ブラウザ上でエラーメッセージを確認することが出来る。

display_errors = Off

4. PHPのエラーをログに記録する

log_errors = On

5. ログに記録するサイズを増やす

log_errors_max_len = 4096

(デフォだと1024)

6. 記録するログのファイルを指定(これ自体は後ほど作成する)

error_log = /var/log/php/php_error_log

(デフォだと ;error_log = filename となっているので、; も外してファイル名とパスを指定)

7. 古くて長い変数は使用しないということにして

register_long_arrays = Off

8. Webアプリケーションではargcやargvは不要なので

register_argc_argv = Off

9. magic_quotesは確実にOffにしておく

magic_quotes_gpc = Off

10. デフォルトの文字コードを指定

default_charset = “UTF-8″

(デフォでは先頭に ; がついているので、これをはずした上で)

11. include_pathのデフォルトディレクトリを指定

include_path = “.:/usr/share/php:/usr/share/pear”

(この場合、/usr/share/php と /usr/share/pear を指定している)

↑もちろん「; UNIX: “/path1:/path2″」とある、その次の行で、行頭の ; をとるのも忘れないように。

12. 動的モジュールのロードを無効に

enable_dl = Off

13. ファイルのアップロード機能を使わない場合は確実に無効にしておく

file_uploads = Off

14. URIをファイルとして扱わないようにする

(これが有効だとインターネットのどこからでもコードを読み込んで実行出来てしまう可能性があるらしい)

allow_url_fopen = Off

15. JavaScriptでセッションIDを使用しない場合は1に

session.cookie_httponly = 1

16. セッションIDを作成する際の外部リソースへのパスを指定

(読み込むバイト数も指定しておく)

; How many bytes to read from the file.
session.entropy_length = 32

; Specified here to create the session id.
session.entropy_file = /dev/urandom

17. SHA-1の指定に変更しておく

session.hash_function = 1

18. 言語環境を日本語に設定

mbstring.language = Japanese

(デフォでは行頭に ; がついていて無効なので、これを外しておく)

19. 内部文字コードを指定(使用する文字コードに)

mbstring.internal_encoding = UTF-8

(デフォだと行頭に ; がついていて無効なので、これを外した上で)

以上で設定は完了。

次に、6で指定した、PHPのエラーをログに記録するファイルを作成する。

ディレクトリを作成し、ログ書き込みファイルを作成し、作成したディレクトリに Web サーバ(この場合Apache2)が書き込み出来るように、書き込み権限を与える。

$ sudo mkdir /var/log/php
$ sudo touch /var/log/php/php_error_log
$ sudo chown -R www-data. /var/log/php

ここまで出来たら、設定を反映させるために Apache を再起動させる。

$ sudo /etc/init.d/apache2 restart
 * Restarting web server apache2
 ... waiting    ...done.

その他のセキュリティに関する設定

1. open_basedirの指定をする

(ここで指定したディレクトリ以外での php の実行を防ぐ)

再度 /etc/php5/apache2/php.iniを開き

open_basedir = /usr/share/:/var/www/

(デフォだと行頭に ; がついているので、これを外した上で)

上の記述だと、/usr/share(PEAR パッケージを利用するために)と /var/wwwディレクトリをPHPが実行可能がディレクトリとして指定している。このopen_basedirの設定をしていないと、以下のようなコードを実行されると /etc/passwdの中身が丸見えになってしまう(らしい)。

<?php
require_once "/etc/passwd";
?>

2. 指定した関数を無効化する

disable_functions = 関数名

(状況に応じて、無効にしたい関数等をここに記述して無効化する)

PHP のログのローテーション

PHP のエラーログを出力しているけれど、このままではローテーションが行われず、ファイルがどんどん大きくなっていく。以下のような内容のファイルを悪性してやることで、エラーログを一週間単位でローテーションさせることができる(らしい)。

$ sudo vim /etc/logrotate.d/php

/etc/logrotate.d/php の中身

/var/log/php_error_log {
    weekly missingok
    notifempty
    sharedscripts
    postrotate
    /etc/init.d/apache2 reload > /dev/null 2>/dev/null || true
    endscript
}

忘れずにApache再起動!

$ sudo /etc/init.d/apache2 reload

参考エントリ:http://d.hatena.ne.jp/Fiore/20080417/1208466735
お世話になりました。ありがとうございました。

Categories

Tag Cloud

AdMob Android Apache centos CodeIgniter EC-CUBE facebookアプリ facebookページ feed Firefox Flash google googleanalytics htaccess iPad iPhone JavaScript lamp mobile nginx ogp pear php plugin rollover rss sendmail setting smarty ssh Titanium Mobile Titanium Studio tutorial ubuntu vim VirtualBox vmware vps Windows WordPress xampp youtube さくらインターネット アクセス解析 カスタム投稿