Apache
httpd
脆弱性
centos7
Apache2.4

Apacheの脆弱性対応をしたら、Apacheのサービスが停止した(httpd2.4.25→httpd2.4.27)

はじめに

あるWebシステムで使用していたApacheのバージョンで脆弱性が発見されました。
脆弱性対応をしたところ、Apacheが起動しないという事象に陥ってしまった時の話をします。

脆弱性に関する情報は下記を参考に。(英語です)
Apache2.2系
Apache2.4系

前提

  • OS: CentOS7
  • あげる前のバージョン: httpd2.4.25
  • 使用リポジトリ: iusリポジトリ

アップデート手順

1.まずは現状のバージョン確認。

# httpd -v
Server version: Apache/2.4.25 (CentOS)

ふむ。2.4.25なので、脆弱性対応しないといけないですね。。。

2.iusリポジトリに、脆弱性対応後のバージョンを確認します。

ここで、アップデート後に脆弱性対象外のバージョンになっていることを確認します。

# yum check-update --enablerepo=ius | grep httpd
httpd24u.x86_64                        2.4.27-1.ius.centos7              ius    
httpd24u-devel.x86_64                  2.4.27-1.ius.centos7              ius    
httpd24u-filesystem.noarch             2.4.27-1.ius.centos7              ius    
httpd24u-mod_ssl.x86_64                1:2.4.27-1.ius.centos7            ius    
httpd24u-tools.x86_64                  2.4.27-1.ius.centos7              ius

最新バージョン2.4.27が出ましたね。。。
2.4.26からわずか3週間でまた新しいのが出たようです。

3.念のため、設定ファイルのバックアップを取得します。

# cp -rp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.backup_yyyymmdd

4.アップデート!

# yum update --enablerepo=ius httpd


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
更新:
  httpd24u.x86_64 0:2.4.27-1.ius.centos7                                                                                                     

依存性を更新しました:
  httpd24u-devel.x86_64 0:2.4.27-1.ius.centos7                        httpd24u-filesystem.noarch 0:2.4.27-1.ius.centos7                     
  httpd24u-mod_ssl.x86_64 1:2.4.27-1.ius.centos7                      httpd24u-tools.x86_64 0:2.4.27-1.ius.centos7                          

完了しました!

5.バージョン確認!

# httpd -v
Server version: Apache/2.4.27 (CentOS)

やった!バージョン上がってる!

6.あとは動作確認だけ!

# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 水 2017-07-19 22:48:57 JST; 8s ago
     Docs: man:httpd.service(8)
  Process: 22788 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 22788 (code=exited, status=1/FAILURE)

ん??????
起動していないやん!
ブラウザで確認するも、アクセス不可能。そりゃそうだが。。。。
こりゃやばい。。。。。。

エラー調査!!!!

まずはsyslog確認!

# journalctl -xe
7月 19 23:10:34 ip-172-31-14-36.ap-northeast-1.compute.internal httpd[23278]: httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: 
 7月 19 23:10:34 ip-172-31-14-36.ap-northeast-1.compute.internal systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILUR
 7月 19 23:10:34 ip-172-31-14-36.ap-northeast-1.compute.internal systemd[1]: Failed to start The Apache HTTP Server.
-- Subject: Unit httpd.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel

ん???
「httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf」を発見!
設定ファイルの文法ミス???

とりあえず56行目を確認!!

# vi /etc/httpd/conf/httpd.conf

Include conf.modules.d/*.conf

ふむふむ、文法的には合っているはず!(ここはそもそもいじっていない!)
てことは、モジュールを読み込んでエラーが出ているのか!!
何かアップデートで仕様が変わったのか???(推測)

どのモジュールが悪さをしているのか調査

とりあえず、「syntax error」出ているので、Apache設定ファイルの文法チェックしてみます!

# apachectl configtest
httpd: Syntax error on line 56 of /etc/httpd/conf/httpd.conf: Syntax error on line 40 of /etc/httpd/conf.modules.d/00-base.conf: Cannot load modules/mod_http2.so into server: /etc/httpd/modules/mod_http2.so: undefined symbol: nghttp2_session_get_stream_local_window_size

原因のモジュール発見!!(mod_http2)

こいつが悪さをしている!!
なんかよくわからないが、読み込めていない!!

Syntax error on line 40 of /etc/httpd/conf.modules.d/00-base.conf: Cannot load modules/mod_http2.so into server

対応策!!!(mod_http2.soをコメントアウト)

とりあえず、悪さをしているモジュールを読み込まないようにします。

コメントアウトするだけですね。

# vi /etc/httpd/conf.modules.d/00-base.conf
40行目をコメントアウトする!
●変更前
LoadModule http2_module modules/mod_http2.so

●変更後
#LoadModule http2_module modules/mod_http2.so

設定反映!と動作確認

# systemctl restart httpd

# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: active (running) since 水 2017-07-19 23:25:56 JST; 19s ago
     Docs: man:httpd.service(8)
 Main PID: 23666 (httpd)
   Status: "Total requests: 0; Idle/Busy workers 100/0;Requests/sec: 0; Bytes served/sec:   0 B/sec"
   CGroup: /system.slice/httpd.service
           ├─23666 /usr/sbin/httpd -DFOREGROUND
           ├─23667 /usr/sbin/httpd -DFOREGROUND
           ├─23668 /usr/sbin/httpd -DFOREGROUND
           ├─23669 /usr/sbin/httpd -DFOREGROUND
           ├─23670 /usr/sbin/httpd -DFOREGROUND
           └─23671 /usr/sbin/httpd -DFOREGROUND

よっしゃ!起動した!
一応ブラウザでも確認してください!
ログイン機能等があれば、併せて確認しましょう。

原因調査

一体何が起きたのか。。。。
設定ファイルを変えていないのに、「Syntax error」が出たのは何故。。。。

色々調査したところ原因は、
Apache2.4.27から、mod_http2.soが使えなくなったようです。。。
つまり、HTTP/2.0での通信ができなくなったみたいです。
HTTP/2.0だと、ダイジェスト認証での情報流出や、DOS攻撃される可能性がある、とのことです。

参考URL
https://blog.apar.jp/linux/7873/
https://oss.sios.com/security/apache-security-vulnerabiltiy-20170714
http://httpd.apache.org/security/vulnerabilities_24.html

終わりに

今回の事象は、想定外でした。
というのも、Apache2.4.27に上がるとは思っておりませんでした。
上記手順で行った、アップデート後のバージョン確認をしっかりと行いましょう。
脆弱性対応をする前に検証環境で実施した際(Apache2.4.27が出る1日前くらい)に、Apache2.4.26に問題なく上がることは確認ができていました。

脆弱性の対応をする前に、一度公式ホームページ等で最新バージョンを確認しておくことが必要ですね。
「まさか新バージョンが出ているとは、、、知りませんでした。」なんて言えないですからね。。。。。

それにしても、HTTP/2.0はずっと使えないのでしょうか。。。
この辺は詳しくないので、影響がないのか調査する必要がありそうです。。。。。