Red Hat Software CollectionsとSCLについて調べたメモ

CentOSユーザーならお世話になっているだろうRemi Collet氏がブログに「Red Hat will provide PHP 7.1 for RHEL (and CentOS)」なる記事をポストされていた。タイトルだけ見て、デフォルトがPHP5.4.16から7.1系になるの?こんなタイミングで?と思ったら、そういう話ではなく。 なんでもRed Hat Software Collections(以下RHSCL)という新しめな安定版のソフトウェアコンポート集?があり、それの3.0でPHP7.1やnode8なんかを提供してくれるとのこと。
以下はRHSCLについてよくわかっていないので調べたメモ。

RHEL/CentOSの標準パッケージの運用ポリシー

RHSCLの前にまずは標準パッケージの運用ポリシーから。
CentOS公式のFAQにもある通り、RHEL/CentOSはエンプラ向けのため、新しいバージョンをどんどんサポートするのではなくあるバージョンを安定的、長期的(10年)に提供する、というポリシーがある。要は、「脆弱性対応で新しいバージョンにアップデートせざるを得ない時、そこに脆弱性の修正だけでなく後方互換性のない変更が入ってるとエンプラの現場じゃ辛くない?ウチがバージョンを維持したまま脆弱性対応なんかはバックポートするよ」と言ってくれている。
実際にバックポートされているかどうかは、rpmコマンドでchangelogが見れるのでそこで確認できる。

$ rpm -q --changelog php | head -10
* Fri Aug 05 2016 Remi Collet <rcollet@redhat.com> - 5.4.16-42
- bz2: fix improper error handling in bzread() CVE-2016-5399

* Mon Aug 01 2016 Remi Collet <rcollet@redhat.com> - 5.4.16-41
- gd: fix integer overflow in _gd2GetHeader() resulting in
  heap overflow CVE-2016-5766
- gd: fix integer overflow in gdImagePaletteToTrueColor()
  resulting in heap overflow CVE-2016-5767
- mbstring: fix double free in _php_mb_regex_ereg_replace_exec
  CVE-2016-5768

RHSCL/SCL

とはいえ新しいバージョンのソフトウェアを使いたいよね、という場面は往々にしてある。そこで、じゃあライフサイクルは短くなるけどそれも提供しましょう、というのがRed Has Software Collections並びにCentOS向けのSoftware Collectionsということらしく、これらは

  • 対象OSはRHEL/CentOSの6, 7
  • ライフサイクルは3年
  • 標準パッケージやシステムを破壊したり競合しないように設計されている
    • インストール先が/opt/rh/だったり
  • 標準パッケージとの共存が可能(後述)
  • RHSCLはRed Hatが、SCLはコミュニティが運用

などという特徴がある。

RHSCL3.0でサポートする予定のソフトウェアはRed Hatのブログで、それ以前のバージョンでサポートしているソフトウェアとそのサポート終了予定はRed Hatのサポートで確認できる。 SCLでサポートしているソフトウェアはDirectory — Software CollectionsSpecialInterestGroup/SCLo/CollectionsList - CentOS Wikiで確認できそう(だけど、実際のリポジトリの状態より古い?)。
2つを見比べると、SCLでサポートしていないものはちらほらあるが、これは人的なリソースの具合に依存しているんだろうか…

RHSCL/SCLを使うメリットデメリット

  • メリット
    • 最長3年間はバージョン自体を上げることなく脆弱性対応が可能
      • 公式リポジトリやRemiリポジトリからインストールした場合は、マイナー/メジャーバージョンアップを伴う可能性がある
    • 公式のサポートが切れた後もしばらく脆弱性対応が継続されることがある
      • 例えばPHP7.0であれば、公式のセキュリティサポートは2018年12月までなのに対し、RHSCL2.4提供のものは2019年11月まで
    • ある程度新しいバージョンを使用可能
  • デメリット
    • 脆弱性対応がバックポートされるまでに時間を要しうる
    • 最新版への追従はできない
    • (標準パッケージと比べてライフサイクルが短いため)バージョンアップの検証・実施が必要になるまでの期間が短い

CentOS7でSCLで提供されているPHP7.0系をインストール

実際にCentOS7でSCLリポジトリからPHP7.0をインストールし、有効化、標準パッケージとの共存、バックポートの有無を確認していく。
単純にPHPをインストールしてphp -vしているだけなので、フレームワーク動かすやらはハマりどころがあるかもしれない。
テスト環境はVagrantでbento/centos-7.3

標準のphpをインストール

$ sudo yum install -y php
$ php -v
PHP 5.4.16 (cli) (built: Nov  6 2016 00:29:02) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

リポジトリを登録

$ sudo yum install -y centos-release-scl
$ ls /etc/yum.repos.d/CentOS-SCLo-scl*
/etc/yum.repos.d/CentOS-SCLo-scl.repo  /etc/yum.repos.d/CentOS-SCLo-scl-rh.repo

PHP7.0をインストール

$ yum info rh-php70
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: www.ftp.ne.jp
 * epel: ftp.kddilabs.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Available Packages
Name        : rh-php70
Arch        : x86_64
Version     : 2.3
Release     : 1.el7
Size        : 4.0 k
Repo        : centos-sclo-rh/x86_64
Summary     : Package that installs PHP 7.0
License     : GPLv2+
Description : This is the main package for rh-php70 Software Collection,
            : that install PHP 7.0 language.

$ sudo yum install -y rh-php70
$ php -v
PHP 5.4.16 (cli) (built: Nov  6 2016 00:29:02) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

切り替え

$ scl enable rh-php70 bash
$ php -v
PHP 7.0.10 (cli) (built: Nov  3 2016 08:06:03) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies
$ exit
exit
$ php -v
PHP 5.4.16 (cli) (built: Nov  6 2016 00:29:02) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

バックポートの確認…と思ったけど、PHP7.0ではまだ特にない様子なのでnginx1.8で確認

$ sudo yum install -y rh-nginx18
$ rpm -q --changelog rh-nginx18-nginx
* Mon Jun 20 2016 Joe Orton <jorton@redhat.com> - 1:1.8.1-1
- update to 1.8.1 (CVE-2016-0742 CVE-2016-0746 CVE-2016-0747)
- add security fix for CVE-2016-4450

* Fri Nov 13 2015 Jan Kaluza <jkaluza@redhat.com> - 1:1.8.0-4
- fix SELinux context of /var/opt and /etc/opt directories (#1280221)

常時PHP7.0を有効にする(scp enableで実行している?スクリプトを/etc/profile.d/に置く)

sudo ln -s /opt/rh/rh-php70/enable /etc/profile.d/rh-php70.sh

雑感

  • 継続的にバージョンアップなりの理解を得られにくい環境においては有効何だろうと思う
    • サポート切れの日は分かっているので、いついつにバージョンアップする必要があります、というのは周知し、その時がきたらやる必要がある
  • とはいえRHSCL/SCLでなく公式の安定版に追従していくことが可能であればそれが一番心に優しそう
    • 必要なのは
      • CI/CD環境を整備すること
      • 経営層に、作業の必要性やそれにかかるコストへの理解を得ること

参考