もうご存知だと思いますが、とうとうapache2.2系がEOL(End Of Life)を迎え、2017年12月が最後のセキュリティアップデートとなります。
[ANNOUNCE] Apache HTTP Server 2.4.25 Released
世の中のオンプレ案件や個人サイトではapache2.2を使っているケースが多いと思うので、2.4との違いやアップグレード時のエラー対応について、少しだけ手順をまとめてみようと思います。
- 概要
- 2.2から2.4へ
- エラー集
- Ignoring deprecated use of DefaultType
- Either all Options must start with + or -, or no Option may.
- DocumentRoot must be a directory
- Invalid command 'SSLMutex', perhaps misspelled or defined by a module not included in the server configuration
- NameVirtualHost has no effect and will be removed in the next release
- Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
- allow deny等の権限の設定方法
- OpenSSLをLibreSSLに変更?
- 2.2の構成を再現する
- 雑感
概要
現在apache2.2系を使っていて、これから2.4にアップグレードする人向けの記事となります。
既にある2.2系の設定ファイルを2.4向けに修正していきます。
この記事ではバージョン2.4.6へ移行する記事となります。
2.2から2.4へ
インストール後に2.2と2.4のディレクトリ構成等でかなり戸惑うと思うので、順番にまとめていきます。
2.4をインストール
repoを入れてyumでインストールします。
cd /etc/yum.repos.d
sudo wget https://repos.fedorapeople.org/repos/jkaluza/httpd24/epel-httpd24.repo
sudo yum install httpd24
ディレクトリ構成等の違い
2.2と2.4で全然違うので、比較してみましょう。(yumでインストールした場合)
内容 | 2.2 | 2.4 |
---|---|---|
ServerRoot | /etc/httpd | /opt/rh/httpd24/root/etc/httpd |
システム設定 | /etc/sysconfig/httpd | /opt/rh/httpd24/root/etc/sysconfig/httpd |
httpd | /usr/sbin/httpd | /opt/rh/httpd24/root/usr/sbin/httpd |
apachectl | /usr/sbin/apachectl | /opt/rh/httpd24/root/usr/sbin/apachectl |
起動スクリプト | /etc/init.d/httpd | /etc/init.d/httpd24-httpd |
ログ | /etc/httpd/logs | /opt/rh/httpd24/root/etc/httpd/logs |
modules | /etc/httpd/modules | /opt/rh/httpd24/root/etc/httpd/modules |
DocumentRoot | /var/www/html/ | /opt/rh/httpd24/root/var/www/html |
pid | /var/run/httpd/httpd.pid | /opt/rh/httpd24/root/var/run/httpd/httpd.pid |
lock | /var/lock/subsys/httpd | /opt/rh/httpd24/root/var/lock/subsys/httpd |
2.4のデフォルトServer MPMについて
[vagrant@node1 sbin]$ /opt/rh/httpd24/root/usr/sbin/apachectl -V AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message Server version: Apache/2.4.6 (Red Hat) Server built: Sep 25 2013 05:25:46 Server's Module Magic Number: 20120211:23 Server loaded: APR 1.4.8, APR-UTIL 1.5.2 Compiled using: APR 1.4.8, APR-UTIL 1.5.2 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... -D APR_HAS_SENDFILE -D APR_HAS_MMAP -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled) -D APR_USE_SYSVSEM_SERIALIZE -D APR_USE_PTHREAD_SERIALIZE -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT -D APR_HAS_OTHER_CHILD -D AP_HAVE_RELIABLE_PIPED_LOGS -D DYNAMIC_MODULE_LIMIT=256 -D HTTPD_ROOT="/opt/rh/httpd24/root/etc/httpd" -D SUEXEC_BIN="/opt/rh/httpd24/root/usr/sbin/suexec" -D DEFAULT_PIDLOG="/opt/rh/httpd24/root/var/run/httpd/httpd.pid" -D DEFAULT_SCOREBOARD="logs/apache_runtime_status" -D DEFAULT_ERRORLOG="logs/error_log" -D AP_TYPES_CONFIG_FILE="conf/mime.types" -D SERVER_CONFIG_FILE="conf/httpd.conf"
実はデフォルトがpreforkなのです。これでは勿体無いので、nginxのようにevent mpmに変更したいですね。
2.2のServer MPMの変更方法
以下のようにhttpd.workerのコメントを外してhttpdを再起動します。
vi /etc/sysconfig/httpd #HTTPD=/usr/sbin/httpd.worker HTTPD=/usr/sbin/httpd.worker
2.4のServer MPMの変更方法
2.4では/etc/sysconfig/httpdで設定しません。
更に言うと、/opt/rh/httpd24/root/etc/sysconfig/httpdでも設定しません。
以下のように、00-mpm.confで設定する形に変わりました。
vi /opt/rh/httpd24/root/etc/httpd/conf.modules.d/00-mpm.conf #LoadModule mpm_prefork_module modules/mod_mpm_prefork.so #LoadModule mpm_worker_module modules/mod_mpm_worker.so LoadModule mpm_event_module modules/mod_mpm_event.so
デフォルトではpreforkのコメントが外れている状態なので、ここをmod_mpm_event.soのみコメントが外れている状態に変更すると、Server MPMがeventになります。
エラー集
2.2の設定ファイルの状態で2.4を起動した際に起きたエラーから、それぞれの対応策についてまとめます。
Ignoring deprecated use of DefaultType
DefaultTypeは廃止されたので削除します。
Either all Options must start with + or -, or no Option may.
2.2の頃は、以下のような記述をしていました。これが2.4になって、Optionsの部分は必ずプラスかマイナスを付ける必要があります。
<Directory "/var/www/html">
Options -Indexes FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
</Directory>
↓
Options -Indexes +FollowSymLinks
DocumentRoot must be a directory
DocumentRootの実体(ディレクトリ)が存在しないと、起動時にエラーになります。DocumentRootのフォルダを生成して下さい。
Invalid command 'SSLMutex', perhaps misspelled or defined by a module not included in the server configuration
以前は以下のように記述していましたが、記述方法が変わりました。
SSLMutex "file:/etc/httpd/logs/ssl_mutex"
↓
Mutex default ssl-cache
NameVirtualHost has no effect and will be removed in the next release
まだエラー扱いではありませんが、時期バージョンで削除されるぞ〜、と言われています。
単純にNameVirtualHostを削除します。
Invalid command 'RewriteLog', perhaps misspelled or defined by a module not included in the server configuration
これはちょっと嫌な仕様変更です。
今まではrewriteのログは以下のように出力していましたが、2.4になって記述方法が変わりました。
RewriteLog logs/rewrite.log RewriteLogLevel 2
↓
# see https://httpd.apache.org/docs/2.4/ja/mod/core.html#loglevel
LogLevel rewrite:info
ドキュメントにかかれていますが、2.4になって仕様が変わり、エラーログの中に混ぜ込む形でrewriteログが出力されるようになります。(誰得なんですかね・・・)
実質デバッグ用途でしか使えないものとなったと言えると思います。
allow deny等の権限の設定方法
今までの書き方は、以下でした。
order deny,allow deny from all allow from 192.168. 127.0.0.1
↓
Require all denied Require ip 192.168. 127.0.0.1
しかし、この変更は mod_access_compat.so モジュールが有効かどうかで変わります。
mod_access_compat.so はデフォルトで有効になっており(v2.4.6)、有効な場合、2.2の古い書き方と2.4の新しい書き方の両方で書けるようになります。
恐らくここが最も修正量が多い項目だと思うので、最初は mod_access_compat.so を有効にしておき、最後に少しづつ新しい書き方に直していく方が安全と思われます。
なお、将来的に2.2の書き方は完全に廃止される可能性が高いので、極力2.4の書き方に頑張って書き換えた方がいいです。
OpenSSLをLibreSSLに変更?
脆弱性祭りでお馴染みのOpenSSLですが、できればLibreSSLに移行したいですね。
しかし、CentOSだと5,6系ではyum repoが無く、7系にしかありません。Amazon LinuxはCentOS6系がベースと思われ、yumでインストールできません。
残念ながらソースからコンパイルするのが定石っぽいので、コンパイルしましょう。
しかしコンパイルとなると、アップグレードがちょっと嫌ですよね。こういう時「Dockerだったらお手軽で簡単だったのに・・・」と思いますね。
2.2の構成を再現する
あまりに構成が異なって戸惑う問題があるのと、パスが長すぎる問題があるので、レガシーな2.2の構成を再現してみます。
# ServerRoot sudo ln -sfn /opt/rh/httpd24/root/etc/httpd /etc/httpd # log sudo ln -sfn /opt/rh/httpd24/root/var/log/httpd /var/log/httpd # sysconfig sudo ln -sfn /opt/rh/httpd24/root/etc/sysconfig/httpd /etc/sysconfig/httpd # DocumentRoot sudo ln -sfn /opt/rh/httpd24/root/var/www /var/www # pid sudo ln -sfn /opt/rh/httpd24/root/var/run/httpd /var/run/httpd # lock sudo ln -sfn /opt/rh/httpd24/root/var/lock/subsys/httpd /var/lock/subsys/httpd # 起動スクリプト sudo ln -sfv /etc/init.d/httpd24-httpd /etc/init.d/httpd
大体こんな感じで2.2の頃のパスが再現できると思います。
雑感
2.4をインストールすると、絶対みんなこう思うことでしょう・・・
/opt/rh/httpd24/root/etc/httpdってなんだ・・・
/etc/httpd24/ でいいじゃねえか!とか思いませんか?
それにしても、apache2.2系は世の中に死ぬ程沢山稼働している筈なので、2017/12を過ぎた後、悪い人達に真っ先に狙われるのではないかと思われます。
そのままapache2.2が脆弱性祭りになって第2のOpenSSLになってしまうと、私達開発者にとっては悩みの種になってしまうので、可能な限り速く2.4にするか、lighttpdにするか、いっそnginxにするか、等で移行した方がよさそうですね。
ついでにOpenSSLとも決別してLibreSSLに移行できると最高なのですが、なかなか政治的な理由でそれが難しかったりするのが悩みどころです。