この記事では、SSLストリッピング(stripping)やHSTS(HTTP Strict Transport Security)の仕組みについて解説します。
SEO対策の一環として、セキュリティを高めることが重要視されていますが、その中でセキュリティヘッダーについて理解が浅かったので記事にまとめました。
ただ、私はセキュリティ対策の専門家ではないので、もし解釈で間違いがあればコメントで教えていただけますと幸いです。
目次
SSLストリッピング(stripping)とは
SSL strippingとは、https通信を始める前のユーザーを狙った中間者攻撃です。
HTTPダウングレード攻撃(http downgrade attack)とも呼ばれています。
パスワードなどの情報流出のリスクがある
攻撃者はデータ通信の内容を盗み見ることができるため、パスワード情報が流出する恐れがあります。
犠牲となったユーザーは、見た目は何も変わらずにブラウジングしているだけなので、盗聴に気がつくことができません。
狙われやすいネットワーク
フリーのWifiスポットに接続するなど、攻撃者と同一ネットワーク内に接続すると狙われるきっかけになります。
もしくは、LAN上の通信機器になりすますARP Spoofingなども原因となります。
カフェのfree Wi-Fiなどに接続してブラウジングする際は、むやみにパスワードを入力しない方が良いですね。
SSL strippingの手口
SSL strippingが起きる仕組みについて、接続を1つ1つ順番に解説していきます。
まず、ユーザーがhttpでexmaple.comにアクセスします。
ここで、攻撃者が通信に割って入ります。
攻撃者は、ユーザーの送信したGETリクエストになりすまし、サーバーに接続を試みます。
サーバーはhttpでの通信に対して、httpsで通信するようURL転送を行います。
攻撃者はサーバーからの返答に対して、httpsでサーバに再びアクセスを行います。
攻撃者とサーバーの間でhttps接続が確立されたので、サーバーは攻撃者に対してOKのレスポンスを返します。
攻撃者は、ユーザーに対してOKのレスポンスをhttpで返します。
ここで、ユーザーはhttpでの通信が確立されたと見かけ上誤認してしまいます。
(実際は攻撃者としか通信をしていません。)
ユーザーIDとパスワードなどを入力した、POSTリクエストを送ります。
攻撃者が、ユーザーのPOSTリクエストをhttpsに変換してサーバーに送ります。
この時点で、みかけ上はユーザーとサーバー間で通信が成立してしまっているので、その後もやり取りが継続されていきます。
しかし、ユーザーとサーバー間のやりとりは全てを攻撃者によって盗聴されています。
対策方法のHSTS(HTTP Strict Transport Security)とは
HSTS(HTTP Strict Transport Security)とは、1度通信したブラウザとサーバー間において、サーバーがブラウザに対してセキュリティヘッダーを付与することで、以降の通信を始めからhttpsで始める仕組みです。
HSTSの仕組み
ユーザーとサーバーがhttpsで通信を行った際に、サーバーがブラウザに対してセキュリティヘッダーを付与します。
このセキュリティヘッダーには「有効期間の間なら、必ずhttpsで接続せよ」という命令が記載されています。
セキュリティヘッダーが付与されると、次回以降の通信では自動的にhttpsで接続されるようになります。
これにより、中間者が通信に介入できる余地がなくなるので、盗聴の心配なくブラウジングが可能となります。
HSTSの設定確認方法
Webサイトにセキュリティーヘッダーが実装されているかどうかは、こちらのツールにURLを入力するとわかります。
「Strict-Transport-Security」にチェックが入っていれば、HSTSの設定がされています。
もしくは、Google Chromeのデベロッパーツールのネットワークログからも確認することができます。
確認手順
- 調べたいサイトを開く
- デベロッパーツールでネットワークタブを開く
- リロード
- htmlのGET内容をクリック
- ヘッダーを調べる
脆弱性もあるがPreload HSTSで対策可能
HSTSの仕組みでは、2回目以降の通信からhttpsとなります。
つまり、最初の接続ではhttpでリクエストを送ることも可能なので、最初の接続だけは攻撃者に狙われるリスクがあります。
リスクを回避するために、preload HSTSに事前に登録しておくことで、最初からHTTPS接続することが可能になります。
preload HSTSに登録するためには、以下の内容を.htaccessに追記しておきましょう。
Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload" env=HTTPS