安全な委譲の仕組みを理解する(OAuth徹底入門)
OAuth徹底入門 セキュアな認可システムを適用するための原則と実践
Justin Richer、 Antonio Sanso(著)、Authlete Inc.(監修)、須田智之(翻訳)
発売日:2019/1/30
今やインターネットと全く関りが無いソフトウェアは殆ど無いといっていい時代になりました。
そうなるとセキュリティの観点から様々な考慮が必要になります。
特に認証や認可に関する部分はアプリ設計の基礎になるので必須の技術や知識といえます。
実際に、トークンとか、IDaaS、OpenID Connect といった言葉をよく耳にしますが、これらの多くは OAuth 2.0 を基礎にしています。
- RFC 6749:The OAuth 2.0 Authorization Framework
そこで今回は OAuth 2.0 に関する本を取り上げます。
「本書について」の項には以下のように書かれています。
- 本書は OAuth 2.0 のプロトコルとそれに付随する多くのテクノロジー、たとえば、OpenID Connect や JOSE/JWT なども含めて包括的に、そして、徹底的に見ていくことを目的としています。
- 私たちは読者に本書を通じて OAuth で何ができるのか、なぜ機能するのか、そして、安全でないインターネットでどうすれば適切に、そして、安全に OAuth を展開できるのかを深く理解してもらいたいと思っています。
そして「はじめに」の項に著者の思い?が書かれています。
- 本書では、実際に運用されている特定の OAuth プロバイダについて取り上げてはおらず、特定の API や製品についても説明していません。そうではなく、本書は OAuth 自体がどのように機能するのかを中心に取り上げており、OAuth のシステムを稼働すると、すべての OAuth の部品がどのように作用し合うのかを見ていくようになっています。
- 『○○プラットフォームで使える OAuth 2.0 の実装の仕方』のようなものを書きたいのではなく、『どのようなプラットフォームでも適用できるようにするための OAuth 2.0 の仕組み』のようなものを書きたいと思ったのです。
実際この本には、例えば Google や GitHub などの具体的な API やサービスの利用例は出てきません。
その代わり、OAuth のクライアントや認可サーバー、保護対象リソースを実際に実装することで、仕組みや動作を深く理解することができます。
また RFC 6749 のタイトルが「The OAuth 2.0 Authorization Framework」とあるように、OAuth 2.0 は単一のセキュリティプロトコルではなく、選択肢が多いし、他の規格と組み合わせて使う必要もあります。
これは、OAuth 2.0 には柔軟で拡張性が高いメリットもありながら、使い方を誤るとセキュリティのリスクを抱えることにもなります。
本書では、基礎的な概念の説明から始まり、利用上の留意事項や応用、そして規格中のものまで幅広く、かつ深く丁寧に書かれている素晴らしい本だと思います。
ちなみに原著者の Justin Richer さんは、上記 RFC 6749 に関わっている人でもあり、特に OAuth の本質的なことや OAuth ではないもの、などの説明には納得がいきます。
<本の内容>
【目次】
- 第1部 はじめの一歩
- 1 OAuth 2.0 とは何か? そして、なぜ気にかけるべきなのか?
- 2 OAuth ダンス ~ OAuth の構成要素間の相互作用 ~
- 第2部 OAuth 2.0 環境の構築
- 3 シンプルな OAuth クライアントの構築
- 4 シンプルな OAuth の保護対象リソースの構築
- 5 シンプルな OAuth の認可サーバ―の構築
- 6 実際の環境における OAuth 2.0
- 第3部 OAuth 2.0 の実装と脆弱性
- 7 よく狙われるクライアントの脆弱性
- 8 よく狙われる保護対象リソースの脆弱性
- 9 よく狙われる認可サーバ―の脆弱性
- 10 よく狙われる OAuth トークンの脆弱性
- 第4部 さらなる OAuth の活用
- 11 OAuth トークン
- 12 動的クライアント登録
- 13 OAuth 2.0 を使ったユーザー認証
- 14 OAuth 2.0 を使うプロトコルとプロファイル
- 15 Bearer トークンの次にくるもの
- 16 まとめと結論
- 付録
- 付録A 本書で使っているフレームワークについて
- 付録B 演習で使うソースコード集集
第1部では、OAuth とは何か?、そして OAuth ではないものについて、従来手法と対比しながら詳しく書かれています。
そして、権限の委譲としての OAuth の捉え方が書かれています。
- OAuth の威力を発揮する根源となるものは委譲の概念です。OAuth はしばしば認可プロトコルと呼ばれていますが(そして、これは OAuth を定義した RFC によって付けられた名前ですが)、実際には委譲のプロトコルです。
- 基本的に、ユーザの権限の一部が委譲されるようになっていますが、OAuth 自体は権限を渡したり伝えたりはしません。そうではなく、OAuth はユーザの権限の一部をクライアントに委譲するよう、クライアントがユーザーにリクエストするための手段を提供しているのです。
第2部では、OAuth 2.0 のエコシステム全体(クライアント、保護対象リソース、認可サーバ)を、演習形式で構築します。
本記事を書く時に気付いたのですが、原著のタイトルは「OAuth 2.0 in Action」でした。
Node.js による実装コードと動作に関する丁寧な説明があるので理解が進みます。
なお、実際のコードは以下にあります。
- GitHub: OAuth 2 in Action
第3部のはじめに以下のように書かれています。
- OAuth 2.0 はセキュリティのプロトコルでありながら、それさえ使えば安全性が保証されるというものではありません。実際には、すべてが正しく展開され、かつ、管理されなければならないのです。
エコシステムの要素ごとに脆弱性を中心とした解説があり、利用上の注意というだけではなく、プロトコルの構成を深く理解することができます。
さて、6章にはこんな記述がありました。
- OAuth 2.0 は、中核となるプロトコルをひとつのプロトコルではなくフレームワークとして扱うという大きな決断を下しました。そうすることで、プロトコルの中核となるコンセプトをしっかりと保ちつつ、特定の領域については拡張できるようになり、OAuth 2.0 は多くの問題をさまざまな方法で対応できるようになりました。
第4部では、この OAuth 2.0 の拡張にあたる部分が解説されています。
JWT、JOSE などのトークン、動的クライアント登録、OpenID Connect などの認証との関係などはここに書かれています。
加えて、UMA(User Managed Access)、HEART(HEAlth Relationship Trust)、iGov(international Goverment assurance)、PoP(Proof of Possession)トークンなどの一歩進んだ?技術にも触れられています。
<感想>
私がはじめて OAuth に触れたのは、(かなり昔の気がしますが)確か Google カレンダーとアプリの連携方法が新しい方法に変更になる、ということで対応した時だったような気がします。
Google に限らず、昔は他のシステムとAPIなどで連携しようとすると、ユーザが他システムを利用するための秘密情報(IDとパスワードなど)を自システムが仲介する必要が出てきて、実装以前の難しい判断が多かったように思います。
それが OAuth 系APIの導入によって、自システムはトークンの管理に変わり、いくぶん気が楽になったことを思い出します。
実はそのころは OAuth について深堀していなかったのですが、OAuth を調べようとしたきっかけは、アプリの認証や認可に IDaaS(Identity as a Service) を利用してみようと思ったことです。
そして RFC などを読み始めたのですが、私には分かったような、分からないような、煮え切らない理解しかできませんでした。
Google 等のドキュメント化されたサービスを利用する立場であれば、書かれている通りに実装していれば何とかなるものですが、自分が設計あるいは提供する側になると、なぜこれでよいのか?、これをどこに、どのように使うべきか?、などなど、より深い理解がないと、自信をもって設計できません。
そこで書籍を探した結果見つけたのがこの本でした。
この本を読むと、OAuth 2.0 はフレームワークであり、現実の課題に対応するためには、その他の関連するピースを埋めていく必要があることがよくわかりました。(そこが理解できていなかったため、煮え切らない理解だったんだと思います。)
この本で私が特に価値を感じた点をメモしておきます。
- OAuth 2.0 フレームワークと周辺技術の概要が理解できた。
- これはセキュリティ部分に限らず、この考え方はアプリ全体の設計に大きなヒントを与えてくれると思います。
- 実装コードがあり、さらに動かして理解を深めることができる。
- 現場で使えるコードというより、段階的にフレームワークの動きを理解するためのコードになっているので、見通しが良く、理解しやすいです。
- セキュリティ上の留意点が理解できる。
- 脆弱性と対策などが書かれており、ここは非常に勉強になりました。
この本の内容は、実際に Google その他の OAuth 系APIに触れた経験があれば比較的理解しやすいと思いますが、全く知らない人には、入門というには少々内容が深い気がしないでもないです。
本のタイトルは「OAuth 徹底入門」ですが、私の印象としては、入門というよりは「徹底解説」です。(原著のタイトルに入門という言葉はありません。ただ、専門家から見ると入門なのかもしれません。それで徹底入門?)
よって、ざっと API の使い方を知りたいだけの人には向いてない本かもしれませんが、設計や実装に携わるなど、少し認証や認可の基礎、そして委譲の仕組みを知りたい人にとっては、非常に価値がある本だと思います。
(参考)
OAuth 2.0 に関する主なRFCのリンクです。
- RFC 6749:The OAuth 2.0 Authorization Framework
- RFC 6750 :The OAuth 2.0 Authorization Framework: Bearer Token Usage
- RFC 6819:OAuth 2.0 Threat Model and Security Considerations
- RFC 8252:OAuth 2.0 for Native Apps
ちなみに、大変ありがたいことに、上記に加えて以下のサイトで OpenID Connect や JWT など関連する規格を含めた日本語訳が提供されてます。
- OpenIDファウンデーション・ジャパン:公開資料
関連記事
- クエリのような API に入門する:初めてのGraphQL
- アジャイルに一貫したモデリングから実装を維持する方法を知る本(エリック・エヴァンスのドメイン駆動設計)
- REA パターンとオントロジー(ビジネスパターンによるモデル駆動設計)
- ソフトウェア開発の本質的な課題を知る本(人月の神話)
- ソフトウェア開発を社会学的な観点から考える本(ピープルウェア)
- 百科事典のようなAI技術の包括的な教科書(エージェントアプローチ 人工知能/AIMA:Artificial Intelligence: A Modern Approach)
- Pythonでオントロジー指向プログラミング(Ontologies with Python: Programming OWL 2.0 Ontologies with Python and Owlready2)
- RDF, OWLの面白さを知る本(Semantic Web for the Working Ontologist)
- 究極のモデリング(オントロジー工学)
- 法人番号公表サイトのWeb-APIを利用した法人情報の取得と文字の取扱い
コメント
コメントを投稿