CentOS7 に yum で PHP5.6 を入れた話
現在稼働しているサーバの PHP が 5.4 だったのだけど、どうしても password_hash
, password_verify
を使いたかったので、入れ替えた時のお話。
password_verify
はタイミング攻撃に対応していてパスワードクラック対策になるので、ぜひ使って見たかった (同じく hash_equals
もある)。
yum リポジトリを追加
epel (もしなければ)
yum install epel-release
rpm で remi を追加
rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
古い php を削除
yum -y remove php-*
php5.6 をインストール
yum -y --enablerepo=remi,remi-php56 install php php-mysql php-mbstring php-gd php-pear php-mcrypt mod_ssl
プラグインはお好みで。
password_hash
以外での暗号化することも考えて、 mod_ssl
や php-mcrypt
も入れておいた。
バージョンを確認
php --version
を発行し、
PHP 5.6.30 (cli) (built: Jan 19 2017 07:57:06)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies
こんな感じで帰って来れば OK.
apache 再起動
systemctl restart httpd
fast-cgi や Nginx はまた別の機会に。
phpinfo() を実行する
こんな感じでヘッダに 5.6.xx となれば OK.
(黒塗りのところは host 名)
蛇足
本当は 7.0 とか使いたかったんだけど
大人の事情(笑)により頓挫。
宇宙船演算子とか使ってみたい。
Null 合体演算子は切実に使いたい。
タイミング攻撃とは
ザクっというとパスワードの検証にかかる時間を調べることにより、処理内容を推測してパスワードをクラックする(パスワード検証に限らないが)。
我々はコードを書くときに「ネストを深くしない」「可能な限り早く return する」ことを心がけるけれど、そうすると処理する時間に僅かだが差が出るので、それを何度もやりその有意差から、「ああ、この辺りで処理を抜けてるな」みたいなことがわかってしまう。
よく文字列比較で使う ===
や strcmp
なども内部的には、文字数を比較していたり、効率化のために「可能な限り早く return し」ているので、自分で記述した処理以外の部分でも攻撃対象となってしまう。
password_verify
や hash_equals
はどんな値が入力されても同じ時間で答えを返すように設計されているので、こういった攻撃の対策に役立つ。
Discussion