2014年5月8日木曜日

FuelPHPでセキュアな設定をする

FuelPHPをお仕事で使う方も増えてきたと思います。
そんな中で気になるのはやはりセキュリティ。
ということで今日はFuelPHPでセキュアな状態にするための設定を書きます。
まず

@kenji_sさんの下記のブログが非常に分かりやすく書かれています。
今日はこれ以外の下記の項目について書きます。

  1. DBにセッションを保存
  2. 変更推奨のセッション情報
  3. https時にCookieにsecure属性を付与

1.DBにセッションを保存

defaultはセッションをクッキーに保存しています。
これをDBに変える情報は公式ドキュメントにあります。

FuelPHP公式ドキュメント 1.7

DB以外にも

  • File
  • Memcached
  • Redis

などが選べます。
DBを使う際にMySQLの方はいいのですがPostgreSQLを使う方は

#reate the sessions table
$ php oil r session:create

が動きません。
なのでCREATE文と設定方法をご紹介します。

まず

fuel/core/config/session.php



fuel/app/config/session.php

にコピーします。
次に fuel/app/config/session.php のdriverの項目でdbを指定します。

'driver'  => 'db',
次にdbにセッション専用のテーブルを作成します。
下記SQLで作成できます。

--PostgreSQL用
CREATE TABLE sessions
(
session_id character varying(40) NOT NULL,
previous_id character varying(40) NOT NULL,
user_agent text NOT NULL,
ip_hash character varying(32) NOT NULL DEFAULT ''::character varying,
created integer NOT NULL DEFAULT 0,
updated integer NOT NULL DEFAULT 0,
payload text NOT NULL,
CONSTRAINT sessions_pkey PRIMARY KEY (session_id),
CONSTRAINT sessions_payload_key UNIQUE (payload)
)
WITH (
OIDS=FALSE
);
ALTER TABLE sessions
OWNER TO ユーザ名;

これでセッションをDBに保存するようになります。

2.セッション時間の変更

セッション利用する際に変更推奨の項目です。
1.でcopyしてきた

fuel/app/config/session.php

の項目に

//セッションIDを保存するCookie名
cookie_name

があります。
こちらはdefaultの名前ではFuelPHPのどのdriverを使ってるかがわかります。
セキュアな環境を求められる際は変更した方が良いと思います。
似たような設定にCSRF対策時に利用するkey名があります。
こちらは

app/config/config.php

のSecurityの項目の

csrf_token_key

の項目で変更できます。

それ以外にもsession.phpには

  • expiration_time
  • rotation_time
  • match_ip
  • match_ua

などセキュアにセッションを扱うための設定があります。
defaultはゆるく設定されていますので要件に合わせて設定を変更すると良いと思います。

3.https時にCookieにsecure属性を付与

httpsの際にCookieにsecure属性をつけていないと盗聴される可能性があります。

PHP と Web アプリケーションのセキュリティについてのメモ

Cookie の secure 属性


セキュリテイについては安定の徳丸さんの記事を御覧ください。

徳丸浩の日記

HTTPSを使ってもCookieの改変は防げないことを実験で試してみた


FuelPHPはdefaultでは付与していません。
ですが設定一つで対応できます。
設定箇所は

fuel/app/config/config.php

'cookie' => array()

を有効にし

'secure' => false,



'secure' => true,

と変更します。
これでsecure属性を付与してくれます。
ただし、secure属性は

  • https通信時のみ Cookie の内容を送信
  • http通信時には Cookie の内容を送らない

というものですのでhttpでアクセスした際はCookieの内容を送信しません。
ですのでhttp通信時はセッションの保持もCSRFも正常に動作しません。
(本版環境はhttpsだけど開発環境はhttpの場合などでハマるポイントですね)

以上の3点が本番リリース時に気にする項目だと思います。
FuelPHPとは関係ないですがヘッダー情報でphpとapacheのバージョン情報が分かります。
こちらはapacheのhttpd.confやphp.iniを修正する必要があります。

■apacheの場合
・対象File
CentOS:/etc/httpd/httpd.conf
ubuntu:/etc/apache2/conf-enabled/security.conf

・変更箇所
ServerTokens Prod
ServerSignature Off

■PHPの場合
・対象File
php.ini

・変更箇所
expose_php = Off

となります。
上記と合わせて設定をご検討していただけたらと思います。


ということでFuelPHPのconfigは色々と設定出来るので一読すると面白いと思いますよ!!