サーバー上で、テキスト文字を含んだ画像を生成したいことがありました。
ImageMagickのテキスト文字を画像として出力するときは、convertコマンドを使って実行しますが実はこれがうまく動作しない現象が発生していました。
> convert -font "msmincho.ttc" -pointsize 30 -size 240x320 label:@message.txt sample.jpg |
で実行します。
詳細のオプションの内容などはもっと詳しいサイトがあるのでそちらに譲りますが、簡単にご説明。
pointsize : 文字サイズ
size : 精製される画像の縦横のサイズ
label : 書き出したいテキストの内容
そして、最後に出力画像ファイル名
おそらくこれで問題無く出来るだろうと実行したものの、まず pointsize が無視されます。
どんなサイズにしても文字サイズは変わりません
そして、message.txtには、複数行の文字データが書かれているのですが1行しか表示されません
作成対象となるサーバーで使用しているImageMagickのバージョンは、6.0.7 でした。
これが問題でした。
ImageMagick は、6.2.7移行でないと、pointsize命令にバグがあるらしく正しく動作しない様子。
仕方がないので、現在の最新版である 6.7.3 をダウンロードしてインストールをします。
■Image Magick
https://www.imagemagick.org/
しかし、サーバーの環境上ImageMagickが既に多用している為上書きしてしまうのは安直すぎます。
そのとめ、上書きをせずに別の位置にインストールさせることで対応をしてみることにします。
そのためソースコードからコンパイルをします。
上記から取得してきたソースコードを作業用ディレクトリに取得して、展開します。
> wget ftp://ftp.imagemagick.org/pub/ImageMagick/ImageMagick-6.7.3-4.tar.gz > tar zxvf ImageMagick-6.7.3-4.tar.gz > cd ImageMagick-6.7.3-4 |
展開したディレクトリに入って、ソースコードのコンパイルをします。
ここでは、configureを使ってソースコードのMakefileを作ります。
そこで明示的に現在のImageMagickては別の位置にインストールされるように prefix オプションを使いって指定しました。
その他のオプションは基本的にデフォルトで問題なさそうなので、他の設定はデフォルトで問題無いと思います。
> configure –prefix=/usr/local/im
> make
> make install
これで、/usr/local/im の位置に 6.7.3-4 の新しいImageMagick がインストールされました。
最初のコマンド
> convert -font "msmincho.ttc" -pointsize 30 -size 240x320 label:@message.txt sample.jpg |
上記を下記
> /usr/local/im/bin/convert -font "msmincho.ttc" -pointsize 30 -size 240x320 label:@message.txt sample.jpg |
とすることで無事、複数行も文字サイズの変更も出来るようになりました。
少し前にお伝えした、Apacheのほぼ全バージョンにおけるセキュリティーホール(CVE-2011-3192)ですが、無事yumでアップデート可能なバージョンがリリースされていました。
以前の記事では、2.2.20以降が対策バージョンと書きましたが、CentOSに入っているバージョン2.2.3の最終バージョン2.2.3-53.el5で対応となっているようです。
過去の記事:Apacheの広範囲なバージョンにセキュリティーホールを公開、その対策
CentOS 5.6においてはとくにそのままでバージョンアップを確認出来ます。
# yum check-update Loaded plugins: fastestmirror, priorities Loading mirror speeds from cached hostfile * base: rsync.atworks.co.jp * extras: rsync.atworks.co.jp * rpmforge: apt.sw.be * updates: www.ftp.ne.jp 95 packages excluded due to repository priority protections httpd.x86_64 2.2.3-53.el5.centos.1 updates httpd-devel.i386 2.2.3-53.el5.centos.1 updates httpd-devel.x86_64 2.2.3-53.el5.centos.1 updates httpd-manual.x86_64 2.2.3-53.el5.centos.1 updates |
※リストは中略してあります。
httpd 2.2.3-53.el5 以降で Apache KillerなどによるRange攻撃を防ぐことが可能となります。
上記のようにアップデートチェックリスト中にhttpd 2.2.3-53.el5が存在すればアップデート可能です。
念のため httpd.conf などのバックアップを取ってからアップデートを行います。
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak # yum update httpd httpd-devel httpd-manual |
無事アップデートが完了したかどうか確認します。
# rpm -qi httpd Name : httpd Relocations: (not relocatable) Version : 2.2.3 Vendor: CentOS Release : 53.el5.centos.1 Build Date: 2011年09月01日 09時23分54秒 Install Date: 2011年09月15日 16時02分16秒 Build Host: builder10.centos.org Group : System Environment/Daemons Source RPM: httpd-2.2.3-53.el5.centos.1.src.rpm Size : 3488232 License: Apache Software License Signature : DSA/SHA1, 2011年09月01日 19時46分21秒, Key ID a8a447dce8562897 URL : https://httpd.apache.org/ Summary : Apache HTTP Server Description : The Apache HTTP Server is a powerful, efficient, and extensible web server. |
Version : 2.2.3
Release : 53.el5
これで無事バージョンアップがされました。
また以前施しておいた httpd.conf に記述したRange攻撃用の対策を削除しました。
その後httpdを再起動して、念のためApache Killerでサーバーに攻撃してみましたが 、問題無く稼働し続けました。
Apacheほぼすべてのバージョンにセキュリティホールが見つかる
多くの方々が利用していると思われるApacheサーバーですが、大きなセキュリティーホールが発見されました
もちろん当サイトも例外ではなく、Apacheを利用させていただいて運営しております。
抜本的な修正は、最新版の Apahce バージョン 2.2.20 にアップグレードすること。
しかし、それが容易に出来る方ばかりじゃないと思います。
ソースコードからコンパイルして使って居る方や、ソースに手を入れて使用している方なんかは結構厳しいです。
そんな方にもとりあえずの対策もあるようですので、下に載せておきますので是非対策を取っておいてください。
DoS攻撃につながる問題点
RangeヘッダーおよびRequest-Rangeヘッダーに細工を施した内容をサーバーに対して送ることで、サーバーのシステムリソースが大量に消費され、サービスが提供不能な状態に陥る可能性があります。
もちろんサーバー自体の操作も困難になるため、この攻撃を受けた場合はおそらく一度システムリブートが必要になると思われます。
しかも攻撃用のツール(Apache Killer)も既に存在するようで、 ゼロデイ攻撃も確認されているとのことです。
Rangeヘッダーは、コンテンツの一部分を取得したい場合に、その範囲を指定するために使うヘッダー情報です。
対象の範囲
実はこれが一番問題で、今回対象となるApacheはほぼ稼働しているサーバーのすべてのバージョンが対象となります。
具体的には Apache 1.3系、2.0系、2.2系のすべての系統のバージョンにおいて脆弱性があります。
CentOS、RHEL、Fedoraなどで標準に組み込まれているバージョンすべてにおいてこの脆弱性が存在します。
とりあえずの対策
上でも書きましたが、抜本的な修正は2.2.20にバージョンを上げることです。
しかし現在のところCentOS5.5では、yumでのバージョンアップはなされていません。
2011年9月15日追記
yumでのバージョンアップか可能になりました。
対応バージョンは、2.2. 3 53.el5以降となります。
対策記事:Apacheセキュリティホール対策アップデート yum対応可能
そんなことから自分で2.2.20のrpmパッケージをつくってバージョンをアップさせている方もいらっしゃるようです。
Apache 2.2.20をtar.gzからrpmにしてインストールしてみたの巻
ただバージョンアップが容易に出来ない方のために、httpd.confに設定を記述することで対処することも出来る方法もあります。
Advisory: Range header DoS vulnerability Apache HTTPD 1.3/2.x (CVE-2011-3192)
こちらはhttpd.confに記述させればとりあえずの対策が出来るのでまだの方はすぐにでも対処されることをおすすめいたします。
Apache 2.2系
httpd.confに下記を追加してください。
# CVE-2011-3192 SetEnvIf Range (?:,.*?){5,5} bad-range=1 RequestHeader unset Range env=bad-range # We always drop Request-Range; as this is a legacy # dating back to MSIE3 and Netscape 2 and 3. RequestHeader unset Request-Range |
併せてログを記述するには下記も追記してください。
# optional logging. CustomLog logs/range-CVE-2011-3192.log common env=bad-range CustomLog logs/range-CVE-2011-3192.log common env=bad-req-range |
Apache 1.3系 2.0系
httpd.confに下記を追加してください。
# Reject request when more than 5 ranges in the Range: header. # CVE-2011-3192 # RewriteEngine on RewriteCond %{HTTP:range} !(bytes=[^,]+(,[^,]+){0,4}$|^$) # RewriteCond %{HTTP:request-range} !(bytes=[^,]+(?:,[^,]+){0,4}$|^$) RewriteRule .* - [F] # We always drop Request-Range; as this is a legacy # dating back to MSIE3 and Netscape 2 and 3. RequestHeader unset Request-Range |
当面はこれで対応するのがお手軽ですが・・・
サーバー止められるのも面倒なのでCentOSのyumにバージョンアップが早々に出てくると良いのですね。
パッケージインストールしたApacheのSuexecの設定を変えたいときってありますよね。
でも、出来ればソースコードからの再コンパイルは避けたい・・・
そんなときありませんか。
CentOSなどApache(httpd)は、デフォルトでインストール済みですね。
なので出来ればそのデフォルトの状態を維持したままSuexecをどうにかしたいと思う事もあるのではないでしょうか。
# /usr/sbin/suexec -V -D AP_DOC_ROOT="/var/www" -D AP_GID_MIN=100 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/var/log/httpd/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=500 -D AP_USERDIR_SUFFIX="public_html" |
上記の内容を変えたいときですね。
そんなこんなで比較的にリスクを少なく実現する方法です。
といっても、基本的にはソースコードはコンパルし直します。
結局それをしないで実現する方法は、パイナリをいじる以外の方法は無いと思います。
バイナリをいじるのは正常に動いているようで動いていなかったなどの不具合の発生を高めます。
そのため出来るだけその方法を使わずに、suexecの内容の書き換えを行いたいと思います。
当方の環境はCentOS 5です。
まず、インストールされているApacheのバージョンを調べます。
# /usr/sbin/apachectl -v Server version: Apache/2.0.55 Server built: May 8 2006 00:31:16 |
これでバージョンが調べられます。
Apacheのアーカイブから同じバージョンのソースを拾ってきます。
ダウンロードはこちらから
https://www.apache.org/dyn/closer.cgi/httpd/
HTTPミラーサイトを選択すると、最新版へのリンクがありますがその下のページにある
Older Releasesのアーカイブへのリンクをたどります。
すると、アーカイブリストが見られますので自分のバージョンに合ったソースをダウンロードしましょう。
僕の場合は2.0.55でした。
サーバーの適当な場所にダウンロードしたら展開をします。
# tar zxvf httpd-2.0.55.tar.gz |
展開するとhttpd-2.0.55というディレクトリが出来居ていますのでその中に入ります。
そこで希望する設定内容で、configureを実行します。
# cd httpd-2.0.55 # ./configure --prefix=/usr/local/apache --enable-suexec --with-suexec-caller=apache --with-suexec-docroot=/home --with-suexec-logfile=/var/log/httpd/suexec.log --with-suexec-userdir=public_html --with-suexec-uidmin=1000 --with-suexec-gidmin=1000 --with-suexec-userdir=public_html |
僕は上記のようなコンフィグを実行しました。
prefixは無くても問題ありませんが、誤ってインストールしたときなどに対応しやすいので既存のディレクトリにかぶらなければ何でもかまいません。
基本的にインストールは実行しませんので、安全のための設定です。
あとはsuexec以外は使わないのでapacheの設定なんかはデフォルトで。
# make # cd support # ./suexec -V -D AP_DOC_ROOT="/home" -D AP_GID_MIN=1000 -D AP_HTTPD_USER="apache" -D AP_LOG_EXEC="/var/log/httpd/suexec.log" -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin" -D AP_UID_MIN=1000 -D AP_USERDIR_SUFFIX="www" |
はい、ご希望のsuexecが出来上がりました。
ポイントは上記のところで、makeの後、make installを実行しないことです。
これを実行しますとインストールが実行されてしまいます。
もし、これが現在動いているApacheを上書きすると目も当てられないためprefixを指定しておきました。
出来上がったsuexecだけを自分の稼働中のsuexecと置き換えるだけです。
置き換える前に元々のsuexecはバックアップ取る対策はしておいてください。
# cp /usr/sbin/suexec /usr/sbin/suexec_bak # cp suexec /usr/sbin/ cp: `/usr/sbin/suexec' を上書きしてもよろしいですか(yes/no)? y |
はい、これでご希望のsuexecが出来上がりました。
これで実質apacheのコンパイルは実行しますがapache自体の上書きは実行されずsuexecだけの書き換えが出来ました。
実際セキュリティーホールとかもあるとおもいますので、旧バージョンのまま設定のみを変えるということが本当に必要かどうかを見極めてください。
ただ、既存の稼働している物を置き換えるというのは色々勇気がいると思いますのでこの方法ですと設定変えられると思うので比較的安全に書き換えることが出来ます。