前提
開発環境自体の用意は、以下の記事の手順通りに作成しています。
はじめに
以下のコマンドで、yumで安易にImageMagickをインストールしてはいけません
yum install ImageMagick
これで入るImageMagickは6.x系ですので、
もし、これを入れてしまうと、6.x系準拠の依存ライブラリが大量に入って、
後々面倒なことになります。(1敗)
なぜ最新版を入れるのか
ImageMagickは数多の脆弱性が指摘されているためです。
しかし、他のライブラリを使う学習コストをかける時間はなかったので、
ImageMagickの最新版を入れることで対応することにしました。
インストール手順
Step1. ImageMagick 最新版のバージョンを確認
※注意 ImageMagickは私がこの記事を書くおよそ1週間前にも(当時の)最新版で脆弱性が指摘されています。
そのため、私の記事に書いてある内容をそのまんまコピペするのではなく、
公式サイトから常にその時の最新版を探して、URLを読み替えて下さい
ImageMagick 7.1.0-49 以前のバージョンで脆弱性が指摘
https://news.mynavi.jp/techplus/article/20230203-2582052/
ImageMagick 公式サイト
https://www.imagemagick.org/script/download.php#linux
ImageMagick バイナリファイルの一覧ページ(更新日時 降順)
https://imagemagick.org/archive/linux/CentOS/x86_64/?C=M;O=A
ちなみに、 2023.02.14 時点の最新版は「ImageMagick-7.1.0-62」です
Step2. リポジトリのインストール(リポジトリが存在しない場合のみ)
Amazon Linux 2に標準で入っているamzn2-coreリポジトリはどれもこれもライブラリのバージョンが古いです。
なので、最新版を取り扱っているepelリポジトリをインストールします
# Amazon Linux でepel-releaseパッケージをインストール出来るようにする
sudo amazon-linux-extras install epel
# epel-releaseパッケージをインストール
sudo yum install epel-release
# remiリポジトリを使えるようにする
sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
Step3. 依存ライブラリの事前インストール
ImageMagickのインストール前に必要なライブラリをインストールします
sudo yum install fftw3
=================================================================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================================================================
Installing:
fftw-libs x86_64 3.3.3-8.amzn2.0.2 amzn2-core 8.6 k
Installing for dependencies:
fftw-libs-double x86_64 3.3.3-8.amzn2.0.2 amzn2-core 771 k
fftw-libs-long x86_64 3.3.3-8.amzn2.0.2 amzn2-core 495 k
fftw-libs-single x86_64 3.3.3-8.amzn2.0.2 amzn2-core 778 k
Transaction Summary
=================================================================================================================================================================================================================
Install 1 Package (+3 Dependent packages)
Total download size: 2.0 M
Installed size: 6.4 M
sudo yum install libraqm
=================================================================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================================================================
Installing:
libraqm x86_64 0.7.0-4.el7 /libraqm-0.7.0-4.el7.x86_64 20 k
Installing for dependencies:
fribidi x86_64 1.0.2-1.amzn2.1 amzn2-core 79 k
graphite2 x86_64 1.3.10-1.amzn2.0.2 amzn2-core 115 k
harfbuzz x86_64 1.7.5-2.amzn2 amzn2-core 279 k
Transaction Summary
=================================================================================================================================================================================================================
Install 1 Package (+3 Dependent packages)
Total size: 493 k
Total download size: 473 k
Installed size: 1.2 M
Step4. ImageMagickモジュールの存在確認
ImageMagickの7.x系 が存在することを確認します
sudo yum list --enablerepo=remi,epel | grep ImageMagick
ImageMagick7.x86_64 1:7.1.0.62-1.el7.remi @remi
ImageMagick7-devel.x86_64 1:7.1.0.62-1.el7.remi @remi
ImageMagick7-libs.x86_64 1:7.1.0.62-1.el7.remi @remi
ImageMagick.i686 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-c++.i686 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-c++.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-c++-devel.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-devel.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-doc.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
ImageMagick-perl.x86_64 6.9.10.68-5.amzn2.0.1 amzn2-core
remiでは「ImageMagick7
」という名前で存在することが分かりました
sudo yum list --enablerepo=remi ImageMagick7 ImageMagick7-devel ImageMagick7-libs
ImageMagick7.x86_64 1:7.1.0.62-1.el7.remi remi
ImageMagick7-devel.x86_64 1:7.1.0.62-1.el7.remi remi
ImageMagick7-libs.x86_64 1:7.1.0.62-1.el7.remi remi
2023.02.14 時点の最新版である「ImageMagick-7.1.0-62
」があるので、これをインストールします
Step5. ImageMagick 7系のインストールを実行する
sudo yum install --enablerepo=remi ImageMagick7 ImageMagick7-devel
Error: Package: 1:ImageMagick7-libs-7.1.0.62-1.el7.remi.x86_64 (remi)
Requires: libraw_r.so.19()(64bit)
依存ライブラリが一つだけ、存在しないためにエラーとなりました。。
これは LibRaw というライブラリの version 0.19 が必要ですが、
amzn2-core では version 0.14 しか提供されていないため、依存関係が解決できずにエラーとなっています。
sudo yum list LibRaw
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
252 packages excluded due to repository priority protections
Available Packages
LibRaw.i686 0.14.8-5.amzn2.20120830git98d925.1 amzn2-core
LibRaw.x86_64 0.14.8-5.amzn2.20120830git98d925.1 amzn2-core
ここでは、外部から RPM を取得・インストールすることで必要なバージョンを解決します。
ダウンロードURLはバージョンが古くなると消えるようなので、
以下のサイトから最新のダウンロードリンクを確認してください
sudo rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/LibRaw-0.19.4-1.el7.x86_64.rpm
error: Failed dependencies:
libjasper.so.1()(64bit) is needed by LibRaw-0.19.4-1.el7.x86_64
liblcms2.so.2()(64bit) is needed by LibRaw-0.19.4-1.el7.x86_64
今度は libjasper と liblcms2 が必要とのこと...
上記pkgs.orgのRequires(必要ライブラリ)の記述によると、libjasperは「jasper」という名前でインストールできる模様
sudo yum list jasper
jasper.x86_64 1.900.1-33.amzn2 amzn2-core
liblcms2は「lcms2」という名前
sudo yum list lcms2
lcms2.i686 2.6-3.amzn2.0.2 amzn2-core
lcms2.x86_64 2.6-3.amzn2.0.2 amzn2-core
ImageMagick7の依存ライブラリの
LibRawの依存ライブラリの
jasperとlcms2をインストールします
sudo yum install jasper lcms2
改めてLibRawをインストールします
sudo rpm -ivh http://mirror.centos.org/centos/7/os/x86_64/Packages/LibRaw-0.19.4-1.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:LibRaw-0.19.4-1.el7 ################################# [100%]
やっとインストールできました。
(ここにたどり着くまでに半日かかりました)
いよいよImageMagick7をインストールします
sudo yum install --enablerepo=remi ImageMagick7 ImageMagick7-devel
=================================================================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================================================================
Installing:
ImageMagick7 x86_64 1:7.1.0.62-1.el7.remi remi 103 k
ImageMagick7-devel x86_64 1:7.1.0.62-1.el7.remi remi 136 k
Installing for dependencies:
ImageMagick7-libs x86_64 1:7.1.0.62-1.el7.remi remi 2.5 M
OpenEXR-devel x86_64 1.7.1-8.amzn2.0.1 amzn2-core 59 k
OpenEXR-libs x86_64 1.7.1-8.amzn2.0.1 amzn2-core 208 k
adobe-mappings-cmap noarch 20171205-3.amzn2 amzn2-core 2.1 M
adobe-mappings-cmap-deprecated noarch 20171205-3.amzn2 amzn2-core 114 k
adobe-mappings-pdf noarch 20180407-1.amzn2 amzn2-core 703 k
atk x86_64 2.22.0-3.amzn2.0.2 amzn2-core 258 k
bzip2-devel x86_64 1.0.6-13.amzn2.0.3 amzn2-core 218 k
cairo x86_64 1.15.12-4.amzn2 amzn2-core 732 k
cups-libs x86_64 1:1.6.3-51.amzn2 amzn2-core 356 k
freetype-devel x86_64 2.8-14.amzn2.1.1 amzn2-core 447 k
gd x86_64 2.0.35-27.amzn2 amzn2-core 146 k
gdk-pixbuf2 x86_64 2.36.12-3.amzn2 amzn2-core 568 k
gl-manpages noarch 1.1-7.20130122.amzn2 amzn2-core 993 k
graphviz x86_64 2.30.1-21.amzn2.0.1 amzn2-core 1.3 M
gtk-update-icon-cache x86_64 3.22.30-3.amzn2 amzn2-core 26 k
gtk2 x86_64 2.24.31-1.amzn2.0.2 amzn2-core 3.4 M
hicolor-icon-theme noarch 0.12-7.amzn2 amzn2-core 43 k
ilmbase x86_64 1.0.3-7.amzn2.0.2 amzn2-core 102 k
ilmbase-devel x86_64 1.0.3-7.amzn2.0.2 amzn2-core 79 k
jasper-devel x86_64 1.900.1-33.amzn2 amzn2-core 376 k
jbigkit-devel x86_64 2.0-11.amzn2.0.2 amzn2-core 10 k
lcms2-devel x86_64 2.6-3.amzn2.0.2 amzn2-core 2.0 M
libICE x86_64 1.0.9-9.amzn2.0.2 amzn2-core 67 k
libICE-devel x86_64 1.0.9-9.amzn2.0.2 amzn2-core 50 k
libSM x86_64 1.2.2-2.amzn2.0.2 amzn2-core 39 k
libSM-devel x86_64 1.2.2-2.amzn2.0.2 amzn2-core 13 k
libX11-devel x86_64 1.6.7-3.amzn2.0.2 amzn2-core 982 k
libXau-devel x86_64 1.0.8-2.1.amzn2.0.2 amzn2-core 14 k
libXaw x86_64 1.0.13-4.amzn2.0.2 amzn2-core 194 k
libXcomposite x86_64 0.4.4-4.1.amzn2.0.2 amzn2-core 22 k
libXcursor x86_64 1.1.15-1.amzn2 amzn2-core 30 k
libXdamage x86_64 1.1.4-4.1.amzn2.0.2 amzn2-core 20 k
libXdamage-devel x86_64 1.1.4-4.1.amzn2.0.2 amzn2-core 9.8 k
libXext x86_64 1.3.3-3.amzn2.0.2 amzn2-core 39 k
libXext-devel x86_64 1.3.3-3.amzn2.0.2 amzn2-core 75 k
libXfixes x86_64 5.0.3-1.amzn2.0.2 amzn2-core 18 k
libXfixes-devel x86_64 5.0.3-1.amzn2.0.2 amzn2-core 13 k
libXft x86_64 2.3.2-2.amzn2.0.2 amzn2-core 60 k
libXi x86_64 1.7.9-1.amzn2.0.2 amzn2-core 41 k
libXinerama x86_64 1.1.3-2.1.amzn2.0.2 amzn2-core 14 k
libXmu x86_64 1.1.2-2.amzn2.0.2 amzn2-core 72 k
libXpm x86_64 3.5.12-1.amzn2.0.2 amzn2-core 57 k
libXrandr x86_64 1.5.1-2.amzn2.0.3 amzn2-core 27 k
libXrender x86_64 0.9.10-1.amzn2.0.2 amzn2-core 26 k
libXt x86_64 1.1.5-3.amzn2.0.2 amzn2-core 177 k
libXt-devel x86_64 1.1.5-3.amzn2.0.2 amzn2-core 446 k
libXxf86misc x86_64 1.0.3-7.1.amzn2.0.2 amzn2-core 19 k
libXxf86vm x86_64 1.1.4-1.amzn2.0.2 amzn2-core 17 k
libXxf86vm-devel x86_64 1.1.4-1.amzn2.0.2 amzn2-core 19 k
libdrm-devel x86_64 2.4.97-2.amzn2 amzn2-core 144 k
libfontenc x86_64 1.1.3-3.amzn2.0.2 amzn2-core 31 k
libglvnd x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 89 k
libglvnd-core-devel x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 19 k
libglvnd-devel x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 11 k
libglvnd-egl x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 43 k
libglvnd-gles x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 34 k
libglvnd-glx x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 125 k
libglvnd-opengl x86_64 1:1.0.1-0.1.git5baa1e5.amzn2.0.1 amzn2-core 42 k
libgs x86_64 9.25-5.amzn2 amzn2-core 4.5 M
libgs-devel x86_64 9.25-5.amzn2 amzn2-core 57 k
libjpeg-turbo-devel x86_64 2.0.90-2.amzn2.0.1 amzn2-core 110 k
libpaper x86_64 1.1.24-8.amzn2.0.2 amzn2-core 37 k
libpng-devel x86_64 2:1.5.13-8.amzn2.0.1 amzn2-core 122 k
librsvg2 x86_64 2.40.20-1.amzn2 amzn2-core 132 k
libthai x86_64 0.1.14-9.amzn2.0.2 amzn2-core 187 k
libtiff-devel x86_64 4.0.3-35.amzn2.0.5 amzn2-core 475 k
libtool-ltdl x86_64 2.4.2-22.2.amzn2.0.2 amzn2-core 49 k
libwayland-client x86_64 1.17.0-1.amzn2 amzn2-core 34 k
libwayland-server x86_64 1.17.0-1.amzn2 amzn2-core 40 k
libwebp7 x86_64 1.0.3-1.el7.remi remi 266 k
libwebp7-devel x86_64 1.0.3-1.el7.remi remi 33 k
libwmf-lite x86_64 0.2.8.4-44.amzn2.0.1 amzn2-core 67 k
libxcb-devel x86_64 1.12-1.amzn2.0.2 amzn2-core 1.0 M
libxshmfence x86_64 1.2-1.amzn2.0.2 amzn2-core 7.2 k
libzip x86_64 1.3.2-1.amzn2.0.1 amzn2-core 62 k
mesa-khr-devel x86_64 18.3.4-5.amzn2.0.1 amzn2-core 19 k
mesa-libEGL x86_64 18.3.4-5.amzn2.0.1 amzn2-core 108 k
mesa-libGL x86_64 18.3.4-5.amzn2.0.1 amzn2-core 162 k
mesa-libGL-devel x86_64 18.3.4-5.amzn2.0.1 amzn2-core 163 k
mesa-libGLU x86_64 9.0.0-4.amzn2.0.2 amzn2-core 200 k
mesa-libGLU-devel x86_64 9.0.0-4.amzn2.0.2 amzn2-core 9.1 k
mesa-libgbm x86_64 18.3.4-5.amzn2.0.1 amzn2-core 38 k
mesa-libglapi x86_64 18.3.4-5.amzn2.0.1 amzn2-core 45 k
open-sans-fonts noarch 1.10-1.amzn2 amzn2-core 476 k
openjpeg2 x86_64 2.4.0-5.amzn2 amzn2-core 160 k
pango x86_64 1.42.4-4.amzn2 amzn2-core 280 k
pixman x86_64 0.34.0-1.amzn2.0.2 amzn2-core 254 k
urw-base35-bookman-fonts noarch 20170801-10.amzn2 amzn2-core 852 k
urw-base35-c059-fonts noarch 20170801-10.amzn2 amzn2-core 880 k
urw-base35-d050000l-fonts noarch 20170801-10.amzn2 amzn2-core 75 k
urw-base35-fonts noarch 20170801-10.amzn2 amzn2-core 7.8 k
urw-base35-fonts-common noarch 20170801-10.amzn2 amzn2-core 19 k
urw-base35-gothic-fonts noarch 20170801-10.amzn2 amzn2-core 650 k
urw-base35-nimbus-mono-ps-fonts noarch 20170801-10.amzn2 amzn2-core 797 k
urw-base35-nimbus-roman-fonts noarch 20170801-10.amzn2 amzn2-core 860 k
urw-base35-nimbus-sans-fonts noarch 20170801-10.amzn2 amzn2-core 1.3 M
urw-base35-p052-fonts noarch 20170801-10.amzn2 amzn2-core 978 k
urw-base35-standard-symbols-ps-fonts noarch 20170801-10.amzn2 amzn2-core 40 k
urw-base35-z003-fonts noarch 20170801-10.amzn2 amzn2-core 275 k
xorg-x11-font-utils x86_64 1:7.5-21.amzn2 amzn2-core 103 k
xorg-x11-proto-devel noarch 2018.4-1.amzn2.0.2 amzn2-core 280 k
xorg-x11-server-utils x86_64 7.7-20.amzn2.0.2 amzn2-core 179 k
Transaction Summary
=================================================================================================================================================================================================================
Install 2 Packages (+103 Dependent packages)
Total download size: 36 M
Installed size: 116 M
無事、インストールが完了しました。
Step5. ImageMagickのバージョン確認
magick --version
Version: ImageMagick 7.1.0-62 Q16-HDRI x86_64 20885 https://imagemagick.org
Copyright: (C) 1999 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 gvc heic jbig jng jp2 jpeg lcms ltdl lzma openexr pangocairo png ps raqm raw rsvg tiff webp wmf x xml zip zlib
Compiler: gcc (4.8)
v6の時はconvert --version
でバージョン確認ができ、v7でもできますが、
v7からはmagick
コマンドに集約されたのでこのコマンドを使うのが良いみたいです。
sudo yum list installed | grep ImageMagick
ImageMagick7.x86_64 1:7.1.0.62-1.el7.remi @remi
ImageMagick7-devel.x86_64 1:7.1.0.62-1.el7.remi @remi
ImageMagick7-libs.x86_64 1:7.1.0.62-1.el7.remi @remi
Step6. PHP用のImageMagickモジュール(Imagick)をインストールする
PHPで、Imagickクラスを使って画像変換ができるように、
PHP用のImagickライブラリをインストールします
最終的にインストールするのは「php74-php-pecl-imagick-im7」ですが、
先に依存ライブラリをインストールしていきます
sudo yum install --enablerepo=remi php74-php-devel
=================================================================================================================================================================================================================
Package Arch Version Repository Size
=================================================================================================================================================================================================================
Installing:
php74-php-devel x86_64 7.4.33-2.el7.remi remi 759 k
Installing for dependencies:
libxml2-devel x86_64 2.9.1-6.amzn2.5.6 amzn2-core 1.1 M
xz-devel x86_64 5.2.2-1.amzn2.0.3 amzn2-core 46 k
Transaction Summary
=================================================================================================================================================================================================================
Install 1 Package (+2 Dependent packages)
Total download size: 1.8 M
Installed size: 14 M
sudo yum install libXt libtool-ltdl
既に入ってました
sudo yum install gcc make
既に入ってました
ApacheにImagickモジュールをインストールします
sudo yum install php74-php-pecl-imagick-im7
Step7. サーバを再起動
ApacheとPHP-FPMを再起動します
sudo service httpd graceful
sudo service php-fpm restart
Step8. モジュールのインストール確認
PHPでimagickが使えるようになったことを確認します
php -m | grep imagick
imagick
phpinfoでもImageMagick7系がインストールされたことを確認できました
Step9. ImageMagickのセキュリティ向上
ImageMagickはデフォルトの状態だと、いかなる形式のファイルも読み書きできるそうで、
その多様さが脆弱性を産むのだとか。
一般的に、PNG,JPG,GIF,WEBPぐらいしか画像処理することはないと思いますので、
許可するファイル形式をそのように書き変えます
まずは、policy.xml
の場所を探します
magick -list policy | grep Path
Path: /etc/ImageMagick-7/policy.xml
Path: [built-in]
/etc/ImageMagick-7/policy.xml
にあることが分かりましたので、
このファイルを編集します
sudo cp /etc/ImageMagick-7/policy.xml /etc/ImageMagick-7/policy.xml.org
sudo vi /etc/ImageMagick-7/policy.xml
ファイル末尾のpolicymap
に以下の4行を追加します
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="filter" rights="none" pattern="*" />
<policy domain="coder" rights="none" pattern="*" />
<policy domain="coder" rights="read|write" pattern="{PNG,JPEG,JPG,GIF,WEBP}" />
<policymap>
<policy domain="Undefined" rights="none"/>
<policy domain="delegate" rights="none" pattern="*" />
<policy domain="filter" rights="none" pattern="*" />
<policy domain="coder" rights="none" pattern="*" />
<policy domain="coder" rights="read|write" pattern="{PNG,JPEG,JPG,GIF,WEBP}" />
</policymap>
反映確認します
magick -list policy
Path: /etc/ImageMagick-7/policy.xml
Policy: Undefined
rights: None
Policy: Delegate
rights: None
pattern: *
Policy: Filter
rights: None
pattern: *
Policy: Coder
rights: None
pattern: *
Policy: Coder
rights: Read Write
pattern: {PNG,JPEG,JPG,GIF,WEBP}
Path: [built-in]
Policy: Undefined
rights: None
以上。
参考URL
https://qiita.com/t-kigi/items/f6850abaaee1db2df5a4
https://qiita.com/SHIN_DEVELOP/items/c60eb9cd592f4a6a0f00