APIセキュリティ入門:REST・認証・認可
APIの攻撃面を洗い出す
この回でやること
章のまとめとして、OpenAPIの定義やJavaScriptのバンドル、古いバージョンのパスからAPIの攻撃面を洗い出し、一覧にする手順を扱います。
- 読む 約 7 分
- 最後にクイズ 1 問
このレッスンで学ぶこと
攻撃面の洗い出しは、目の前のAPIで呼べる入り口を全部集めて一覧にする作業です。この回は新しい攻撃を足さず、章で見てきた見方を点検の順番に組み替えます。
読み終えるころには、集めた入り口をメソッドごとに行を分けた表に埋め、埋まらない欄を次に調べる場所として残せるようになります。
攻撃面は「呼べる入り口の全体」
入門編で、攻撃面とは外から触れる面のことだと学びました。APIの攻撃面は、呼べるエンドポイントとメソッドの組の全体です。画面から使う数本だけではありません。まず、隠れている入り口を集めます。
- 定義ファイル。
/openapi.jsonや/swaggerのような定義が公開されていると、全エンドポイントとフィールドが一覧で手に入ります。攻撃面の地図がそのまま置いてある状態です - JavaScriptのバンドル。画面のコードには、呼び出し先のURLが埋まっています。Networkに出てこない、条件が揃わないと呼ばれないエンドポイントも、ここから見つかります
- 古いバージョンのパス。
/api/v2/ordersが今の窓口でも、置き換え前の/api/v1/ordersが落とし忘れで生きていることがあります。古い側は認可やチェックが緩いまま放置されがちです
集めたら、一つずつ点検する
入り口を集めたら、この章の観点で一行ずつ見ていきます。点検の並びは次のとおりです。
プレーンテキスト
エンドポイント | メソッド | 認証 | 許す相手 | 気づき
/api/orders/1043 | GET | 要 | 本人のみ | 他人の番号で試す
/api/orders/1043 | DELETE | 要 | 本人のみ | 画面にボタン無し
/api/v1/orders | GET | 不明 | 不明 | 旧版が生存メソッドごとに行を分けるのは、同じURLでも入り口が別だからです。各行について、認証がいるか、いるなら誰に許すか、拒んだときのエラーが存在を漏らさないかを確かめます。埋まらない欄が残ったら、そこがまだ見ていない攻撃面です。
一覧は攻めるためだけの表ではありません。守る側にとっては、認可を書いたか、旧版を落としたか、定義を公開範囲に絞ったかを確かめる在庫表になります。行が漏れていれば、守りも漏れます。
どう直すか
使っていない古いバージョンのパスは落とします。定義ファイルは、社外に見せる必要がなければ公開範囲を絞ります。そして一覧の各行に、認証と認可を書いたかを確かめます。洗い出して終わりにせず、埋めた表を守りの点検に使います。
手を動かすときは、練習用の環境で、Networkとバンドル、定義ファイルから入り口を集め、上の形の表を自分で埋めてください。埋まらない欄が、次に調べる場所です。