APIセキュリティ
提供しているAPI Essentialワークショップでは攻撃者側の視点でAPIを観察する内容をお届けしているんですが、ここではスタンダードを解説することのみにとどめたいと思います。
2023/12/7 OWASP API Security Top 10を2023年バージョンに差し替えました。
認証認可: OAuth, OpenID Connect (OIDC)
ベーシック認証などの従来の認証方式と比較してOAuthやOpenID Connectが何が良いかと言いますと、APIクライアント、APIクライアントのユーザーの2つのアイデンティティに配慮している点です。
最近触っていませんが、リリース当初私はポケモンGOをインストールしてみてしばらく遊んでいました。あれはOpenID Connectが使われているかと思います。アイデンティティプロバイダにはGoogleやNintendo IDがあったように記憶しています。
指示通りGoogleを選択してログインすると、Googleの表示名などを使ってポケモンGOのユーザーが作成されていたように思います。
もしこれがポケモンGOに対してGoogleのIDとパスワードを直接渡すようにという作りになっていた場合、あなたはポケモンGOで遊ぶでしょうか。
Googleのアカウントにはアドレス帳やドキュメント、Gmailのデータやカレンダー情報が入っていますよね。IDやパスワードをそのままポケモンGOに渡すということは、ゲーム内で必要かどうかに関わらず、それらにアクセスできる状態を作ってしまうことになります。
OAuthの認可コードやOIDCはゲームに必要な基本情報やメールアドレスを取得可能にするが、それ以外にはアクセスできない状態を作っています。
ユーザーの認証の前提として、ポケモンGOのアプリケーションがGoogle側に登録されており、必要なスコープ (基本情報とメールアドレス) を取得するものだとして設定されている必要があります。
その上でユーザーの認証が始まった際に、ユーザーに「基本情報とメールアドレスに対してアクセスを許可して良いか」の確認画面を出すことで、ユーザーの同意のもとGoogleはポケモンGOのアプリに許可された範囲のデータにアクセスを許可してあげることができます。
OAuthやOIDCのシーケンスはOAuth Playgroundでの確認をお勧めします。英語ですが、パラメータやレスポンスなどを一手順ずつ確認できる仕組みになっており、わかりやすいです。
ただし現在OAuth2.0の次のプロトコルとしてGNAPが検討されています。元々はOAuth 3.0の検討をされたそうなのですが、OAuth 2.0の仕組みをベースとするのではなく、より良い仕組みを作ろうということで、3.0ではなく別プロトコルの検討に入ったのだそうです。
将来的にはOAuth 2.0を置き換える可能性があります。数年はスタンダードの動向に気を配ることをお勧めします。
設計の落とし穴に気をつけよう
追加としてバックエンドAPIの設計の落とし穴に気をつけましょう。API GatewayやWAFでセキュリティが完成するわけではありません。
多くのプロジェクトでAPIのセキュリティをWebアプリケーションサーバーと同じ仕組みをベースとして考えてしまうようですが、APIとAPIクライアント、およびWebアプリケーションサーバーはそもそも仕組みが違い、セキュリティの担保の仕方も違います。
詳しくはOWASP API Security Top 10の解説をご参照ください。
API側だけで守れるかというとだいぶ心もとなく、APIクライアント側も意識をしないといけません。
APIクライアント側の設計の落とし穴はMobile Security Top 10をご参照ください。SPAなどブラウザ上のJavaスクリプトクライアントでも参考にできます。