なんやらかんやら指摘していますが非常に浅い領域の話なので熟練者はスルーしてください
はじめに
個人的にLAMP環境でImageMagickを使った開発が多いのだが資料が少ない&古い。
毎回LAMPのセットアップでコケる要因がこのimagickとImageMagickの導入である。
仮想環境も含め数十回は実行したこの導入作業、いい加減アーカイブしておこうと思った次第。
(スナップショット取っとけと言う話はさておいて)
まずImagickとImageMagickの違いから。
Imagickとは
phpマニュアルによるとImagickとは
Imagick は、ImageMagick API を使用して画像の作成や修正を行う ネイティブ PHP 拡張モジュールです。
見ての通りImageMagickが無いとImagickは使用出来ない。
カレーとカレーパンぐらい違う話であり、php開発者なら言わずもがなの話である。
実装時にソースコードには基本的に「ImageMagick」という単語はほぼ出てこない。
$img = new Imagick($filePath);
というようにソース上使用するのはImagickである。
ImageMagickとは
ImageMagick(イメージマジック)とは、画像処理ライブラリです。コマンドラインツールやAPIライブラリとして利用します。非常に多くの画像フォーマットに対応し、高機能な画像処理機能を提供します。
あくまでライブラリであり用途はphpに留まらない。
.NET,C++,Python,Rubyなど導入可能言語は多岐に渡り、
各々MiniMagickやMagick.NETなどの拡張モジュールを導入して使用することになる。
話が戻るがこれらがphpで言うところのImagickである。
ImageMagickの問題
以前から薄々認識はしていたが、なんせ脆弱性に関する不具合が多い。
「ImageMagick 脆弱性」でググると山のように記事がヒットする。
主にJVNによる指摘をピックアップ。
ImageMagick における境界外読み取りに関する脆弱性
ImageMagick におけるリソース管理に関する脆弱性
ImageMagick におけるバッファエラーの脆弱性
ていうかもうビルドバージョンレベルで指摘があるやん…
幅広い機能を持つが故かとにかく多い。
ポンコツコーダーの自分としてはひとまず最新版を入れて対処するしかないというのが悲しいところ…。
少しでもリスクを下げるべくの対処法をそれしか持ってないのは反省点である。
ImageMagick使わんかったらええやん!
というのが最も早い解決法なのだが、今はイチから学習し直す時間がないので
ひとまず前述のとおり最新版で対応したい。
代替案、ガチめの対策案についてはこちらの記事が詳しいので参考に。
「さようなら ImageMagick」の考察
ImageMagickを使うWebアプリのセキュリティ
本題
ということで力不足の自分はImageMagickは最新版を入れて対処しようという方針なので
その方法をご紹介。
作業環境はこちら
- MacOS Mojave 10.14.3
- Vagrant
- CentOS 7.4
- Apache 2.4.x
- php 7.2.x
インストールするものとしては大まかに
- ImageMagick-libs
- IamgeMagick
- ImageMagick-devel
- php-pear (Imagickインストール用のライブラリ)
- phpize (pecl用ライブラリだが依存パッケージ補完で大体勝手に入る)
- Imagick
まずImageMagickのインストールから
yum install ImageMagick
とやると大事故につながる
デフォルトリポジトリのImageMagickは6.x系なのでコレの流れで進めていくと
依存関係モジュールもそれに合ったものが入ってしまい、気づいた時にはどれがどの依存パッケージなのか分からなくなりもう色々アレになってしまう。
最近気付くのが遅れこれをやらかしてしまい、AWSのインスタンスを1個潰すハメになってしまった。
ImageMagickは公式のrpmを使用する
最新版が配布されているのでここを使う。
ImageMagick公式
現時点では7.0.8.68
##最初にLibsから
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-libs-7.0.8-68.x86_64.rpm
※2019/10/07追記
まっさらなサーバだと色々依存ライブラリが足りないとエラーが出て進まないことが多々ありましたんで
とりあえず判明してるやつの解決策を追記しておきます。
各ライブラリの最新Verはpkgs.orgから探したらよいのかな
コケポイント① openjpeg無いよエラー
エラー: パッケージ: ImageMagick-libs-7.0.8-68.x86_64 (/ImageMagick-libs-7.0.8-68.x86_64)
要求: libopenjp2.so.7()(64bit)
openjpegって一見分からねえですがパッケージ取ってきてダイレクトに入れます。
書いてて気付いたけどそのままyum installで良かった。。。
wget http://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/o/openjpeg2-2.3.1-1.el7.x86_64.rpm
rpm -Uvh openjpeg2-2.3.1-1.el7.x86_64.rpm
後述のdevelを入れる際にopenjpeg-devel入れろとも言われるので合わせて対応。
openjpeg-devel入れるのにopenjpeg-toolsも入れろと言われるので(ry
##次に本体
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-7.0.8-68.x86_64.rpm
##develも入れておきたいが公式には載っていない...
けど一応存在するようである
yum install https://imagemagick.org/download/linux/CentOS/x86_64/ImageMagick-devel-7.0.8-68.x86_64.rpm
これでOK
magick --version
Version: ImageMagick 7.0.8-68 Q16 x86_64 2019-05-12 https://imagemagick.org
Copyright: © 1999-2019 ImageMagick Studio LLC
License: https://imagemagick.org/script/license.php
Features: Cipher DPC HDRI Modules OpenMP(3.1)
Delegates (built-in): bzlib cairo djvu fftw fontconfig freetype gslib jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps rsvg tiff webp wmf x xml zlib
2019/10/07修正
最近のトレンドは
convert --versionではなく
magick --versionだそうです
Imagickのインストール
まずpeclコマンドを使えるようにする
yum install php-pear
pecl version
PEAR Version: 1.10.9
PHP Version: 7.2.18
Zend Engine Version: 3.2.0
imagickをインストール
pecl install imagick
####コケポイント②phpize無いよエラー
peclコマンド叩いたら稀に出ます
Can't find PHP headers in /usr/include/php
The php-devel package is required for use of this command.
ERROR: `phpize' failed
php-develを入れて解決
yum install php-devel
##確認
pecl list
Installed packages, channel pecl.php.net:
=========================================
Package Version State
imagick 3.4.4 stable
php.iniにextensionを追加する
[PECL]
extension=imagick.so
Apache再起動してphpモジュール確認
service httpd graceful
php -m | grep imagick
imagick
ついでにphpinfo();なりでimagickが追加されてることを確認する。
#それでもimagickが動かない
追記 2020-06
ちゃんとの上の手順でやったのにphpinfoにimagickが出ないって場合があると思いますが
phpをcgi形式で稼働させてないでしょうか
apacheの再読み込みだけでなくphp-fpmも再起動してあげてください
$ service php-fpm restart
たぶんこれで出ると思います。
おわり。