LoginSignup
1
0

More than 3 years have passed since last update.

Amazon AWS Cloud9環境(EC2)でHTTP/2プロトコルに対応する(Apache)

Last updated at Posted at 2020-05-26

HTTP/2 対応に必要な条件

私のCloud9環境はほぼ全て対応済だったのでだいぶ楽でした。
これからの時代はAWSですね。

Apache Ver 2.4.17以上であること

$ httpd -v

Server version: Apache/2.4.41 (Amazon)
Server built:   Oct 15 2019 22:21:35

OpenSSL Ver 1.0.2以上であること

$ openssl version

OpenSSL 1.0.2k-fips  26 Jan 2017

mod_http2をインストールしていること

$ httpd -M | grep http2

http2_module (shared)

$ less /etc/httpd/conf.modules.d/00-base.conf | grep 'mod_http2'

LoadModule http2_module modules/mod_http2.so

SSL対応していること(任意?)

こちら私の環境は未対応でした。
このためだけにRoute53でドメイン取得したりすんのはだるいので、
オレオレ証明書で対応することにしました。

以下の記事に書いてある通りに進めれば、
特にトラブルもなく対応できました。

もしかすると、SSL対応しなくても
HTTP/2対応できるかもしれませんが試してません。

特筆すべき点

私の環境はmod_sslをインストールしてなかったみたいなので、
yumでインストールしました

sudo yum install mod24_ssl.x86_64

上のモジュールをインストールし、オレオレ証明書でSSL対応して、
curlコマンドでHTTP/2になったかを確認してみたところ、
なってませんでした。

理想
curl -I --http2 --insecure https://XX.XXX.XXX.XX/

HTTP/2 200 <-- これが出るはず
現実
curl -I --http2 --insecure https://XX.XXX.XXX.XX/

HTTP/1.1 200 <-- あれ~~??

「mpmでpreforkモジュールが設定されているとHTTP2が無効化される」らしいです。
自分でも何を言っているのかわかりません。ごめんなさい。

とりあえず以下のサイトにある通り、
00-mpm.conf から mpm_prefork_module をコメントアウトし、
mpm_event_module を有効化して、Apache再起動したらHTTP/2で読み込まれました。

$ sudo vi /etc/httpd/conf.modules.d/00-mpm.conf

#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
LoadModule mpm_event_module modules/mod_mpm_event.so

動作確認

curlコマンドを叩くことで確認できます。
私の環境はオレオレ証明書を使っているので --insecure オプションが必要です

curl -I --insecure --http2 https://XX.XXX.XXX.XX

HTTP/2 200

あるいは、ブラウザからでも簡単に確認することもできます

なぜ対応したのか?

Burp Suiteを用いて自分の開発環境で脆弱性診断を実施したところ、
「HTTPリクエストスマグリング」という脆弱性があることがわかったからです。

そして、その解決策は
「通信プロトコルをHTTP/1.1からHTTP/2にアップグレードすることである」
と書いてあったので、そうした次第です

BurpSuiteに書いてあった文章を翻訳したものを下記します。

問題の背景

HTTP リクエストの密輸の脆弱性は、
ウェブサイトが HTTP のパースが一貫していないウェブサーバを介して
HTTP リクエストをルーティングするときに発生します。

異なるサーバによって異なる長さと解釈されるリクエストを提供することで、
攻撃者はバックエンドの TCP/TLS ソケットを毒し、
次のリクエストに任意のデータを追加することができます。

ウェブサイトの機能にもよりますが、
フロントエンドのセキュリティルールを迂回したり、
内部システムにアクセスしたり、
ウェブキャッシュを毒したり、
サイトを積極的に閲覧しているユーザーに対して
様々な攻撃を仕掛けたりすることができます。

問題の修正

この脆弱性のすべてのバリエーションを解決するには、
フロントエンドサーバがバックエンドシステムとの通信に
HTTP/2 を排他的に使用するように設定するか、
バックエンド接続の再利用を完全に無効にする必要があります。

あるいは、チェーン内のすべてのサーバが同じ設定で
同じウェブサーバソフトウェアを実行していることを確認することもできます。

この脆弱性の特定のインスタンスは、
フロントエンドサーバを再設定して
曖昧なリクエストを正常化してからルーティングするか、
バックエンドサーバが曖昧なリクエストに遭遇したときに
メッセージを拒否して接続を閉じるように設定することで解決できます。

コマンド履歴

未来の自分のために、どんなコマンドを叩いたのかを記します

openssl version
yum list installed | grep openssl
httpd -v
sudo cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.bak
sudo vi /etc/httpd/conf/httpd.conf
sudo service httpd restart
httpd -M | grep http2
less /etc/httpd/conf.modules.d/00-base.conf | grep 'mod_http2'
ls -l /etc/httpd/modules/ | grep ssl
sudo yum list available | grep ssl
sudo yum install mod24_ssl.x86_64 
ls -l /etc/httpd/modules/ | grep ssl
mkdir ~/ssl
cd ~/ssl
openssl genrsa -out ca.key 2048
openssl req -new -key ca.key -out ca.csr
openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt
sudo cp -p ca.crt /etc/pki/tls/certs/
sudo cp -p ca.key /etc/pki/tls/private/
sudo cp -p ca.csr /etc/pki/tls/private/
restorecon -RvF /etc/pki/
sudo cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.bak
sudo vi /etc/httpd/conf.d/ssl.conf
sudo service httpd restart
curl -I --insecure --http2 https://XX.XXX.XXX.XX
sudo less /etc/httpd/logs/error_log
sudo cp /etc/httpd/conf.modules.d/00-mpm.conf /etc/httpd/conf.modules.d/00-mpm.conf.bak
sudo vi /etc/httpd/conf.modules.d/00-mpm.conf
sudo service httpd restart
history

参考URL

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0