初めに
OWASPからWAFの勉強をしようと思った際、アクセス制御の不備で、早速わからないことが・・・
CORSの誤設定によって認可されていない/信用されていないオリジンからのAPIアクセスが許可されてしまう。
CORS?なにそれ?聞いたこともない・・・
CORS
ってことでCORS MDNを見てみた。
オリジン間リソース共有 (Cross-Origin Resource Sharing, CORS) は、追加の HTTP ヘッダーを使用して、あるオリジンで動作しているウェブアプリケーションに、異なるオリジンにある選択されたリソースへのアクセス権を与えるようブラウザーに指示するための仕組みです。ウェブアプリケーションは、自分とは異なるオリジン (ドメイン、プロトコル、ポート番号) にあるリソースをリクエストするとき、オリジン間 HTTP リクエストを実行します。
なるほどと言いたいところだが、ちんぷんかんぷん・・・
ということで、もう少し深堀して調べてわかったことをアウトプットします。
調べてわかったこと
CORSとは
JavaScriptからXMLHttpRequestなどを使って異なるオリジンにアクセスすること。
(ブラウザからWebAPIをキックする際に使われる技術)
オリジンとは、ドメイン、プロトコル、ポート番号のこと。
例えば、送信元がhttp://hogehoge:80/sample
だとします。
そこから下記URLに対してWebAPIをキックした際、異なるオリジン/同一オリジンの判定は以下の表のようになります。
オリジン | URL |
---|---|
異なる | http://hoge:80/sample |
異なる | http://hogehoge:8080/sample |
異なる | https://hogehoge:80/sample |
同一 | http://hogehoge:80/sample/list |
同一 | http://hogehoge:80/list |
また、単純なアクセス(※1)と単純でないアクセスで、仕組みが異なります。
単純でないアクセスの場合、プリフライトと呼ばれる事前にOPTIONメソッドのリクエストを送信し、実際のリクエストを送信して問題ないか確認します。
※1 単純なアクセスは、以下のすべてを満たす場合と定義されています。
- リクエストのHTTPメソッドがPOST、GET、HEADのいずれかになっている
- HTTPヘッダーに、以下を含んでいる。
Accept、Accept-Language、Content-Language、Content-Type(application/x-www-form-urlencoded
、multipart/form-data、
text/plainのいずれか)
処理イメージ(プリフライトあり)
プリフライトなしは、単純にサーバーにリクエスト送信してレスポンスを返すだけなので割愛。
- 【クライアント】実際のリクエスト前に相手側サーバーへのアクセスが可能か確認を行う(プリフライトリクエスト)
- 【サーバー】アクセス許可され、HTTPステータス200を返す(レスポンスに許可するHTTPメソッドなどの情報を返します)
- 【クライアント】アクセス許可された場合は、実際のリクエストを送信する
- 【サーバー】通常と同様に応答を返す
アクセス許可設定
Access-Control-Allow-Credentials
、Access-Control-Max-Age
も関連する設定ですが、今回は割愛。
Access-Control-Allow-Origin
許可するオリジンを設定します。
制限を必要としない場合、ワイルドカード(*)を設定します。
Header set Access-Control-Allow-Origin "http://hogehoge:80"
Header set Access-Control-Allow-Origin "*"
Access-Control-Allow-Method
許可するHTTPメソッド(POST、PUTなど)を指定します。
Access-Control-Allow-Headers
許可するHTTPヘッダーを指定します。
最後に
マイクロサービスが流行っている昨今なら気を付けておくべき事柄と思いました。
現職では、APIを扱う機会があまりありませんでしたが、今後の触れる機会がある技術として良い勉強になりました。
また、今回は技術を調べるだけになってしまったので、検証もやってみようと思います。