OAuth 2とJWTを使用してマイクロサービスにセキュリティを提供
Part 1-理論関連
作者freewolf
キーワード
10年以上IT業界やプログラムに従事してきたベテランドライバーとして、今日はマイクロサービスが分からないと言ったら、自分のソフトウェアを作るのが耻ずかしいです.SOAは何年も叫んでいて、誰も知らないが、本当のSOAを開発するシステムはどれだけあるのだろうか.しかし、一夜にしてすべての人がマイクロサービスの懐に入ったようだ.
現在最も主流の「マイクロサービスフレームワーク」として、Spring Cloudは急速に発展し、最も包括的なマイクロサービスソリューションとなっている.どんなソフトウェアシステムでも、どんなフレームワークでも、セキュリティは永遠に避けられない話題であり、私も最近のマイクロサービスの研究の冒頭としています.
古い話題!「どのようにしてマイクロサービスシステムで安全を保証することができますか?」という目標を達成するために、
ここで補足して、
マイクロサービスを学ぶのは簡単な探索過程ではなく、DDD(Domain Driven Design)領域駆動設計における領域モデルに従っても、マイクロサービスをより小さな粒度に分割しても、多くの新しい知識を学ぶことはできない.多くの新しい問題と以前からよく解決されていない問題に直面します.絶えず考えるにつれて、
この目標を効率的に達成するために、ここでは
なぜ
マイクロサービスは現代のソフトウェア開発においてまだ新鮮なものであるが、
すべてのアクセス要求が送信されると仮定して、境界サーバまたは認証機能付き逆プロキシサーバを設定できます.認証に合格したら、内部の対応するサーバに転送します.一般的に
その他の方法:私たちはすべてのサービスのために統一的な権限データベースを構築し、要求するたびにユーザーを認証します.いくつかの面では愚かに聞こえますが、実際には実行可能なセキュリティ案です.
より良い方法:ユーザは、認証サービスによって認証を実現し、ユーザアクセスSessionを
これはいい案に聞こえますよね?しかし、
したがって、上記の様々な問題は、
OAuth 2には、プロセス全体で4つの役割があります.リソース所有者(ResourceOwner)-Tom です.リソースサーバ(ResourceServer)-Facebook です.ライセンスサーバ(Authorization Server)-ここではもちろんFacebookです.Facebookには関連データが あるからです.クライアント(Client)-App
これまで、上記の内容を実際の例に直接使用するにはどうすればいいですか? 権限範囲に権限をマッピングするか、クライアントにユーザーをマッピングする必要がありますか? なぜクライアントが必要なのですか? 以前、同様のエンタープライズ開発事例で関連するロールをマッピングしようとしたことがあるかもしれません.これは厄介です!
いずれのタイプのアプリケーションもユーザログインを提供し、ログイン結果は
権限範囲と役割、クライアントとユーザー
1つのオンラインショップでは、フロントエンドは1つのクライアントと見なすことができ、商品、注文、顧客情報にアクセスすることができるが、バックエンドは物流や契約などに関することができる一方、ユーザーは1つのサービスにアクセスすることができるが、すべてのデータではない.これは、ユーザーがWebアプリケーションを使用しているためであり、彼ができない場合、他のユーザーは可能である.サービス間のアクセス時に議論する別の次元.数学に詳しい場合は、
なぜJWTなのか
マイクロサービスについてお話しすると、複雑なタスクであるにもかかわらず、ライセンスサーバが水平に拡張されることを保証するために、
認証サーバが返す情報は次のとおりです. access_token-リソースアクセス 用アクセストークン refresh_token-アクセストークンが無効になった場合、このトークンを使用してアクセストークン を再取得する token_type-トークンタイプ、ここでは である. expire_in-有効期限 jti - JWT ID
興味があれば、あとで実現部分もありますので、お楽しみに~
によってhttp://asciiflow.com/フローチャートは中国語では揃えられませんが、本文のフローチャートはすべて英語です~
作者freewolf
キーワード
、 Spring Cloud
、 OAuth 2.0
、 JWT
、 Spring Security
、 SSO
、 UAA
前に書く10年以上IT業界やプログラムに従事してきたベテランドライバーとして、今日はマイクロサービスが分からないと言ったら、自分のソフトウェアを作るのが耻ずかしいです.SOAは何年も叫んでいて、誰も知らないが、本当のSOAを開発するシステムはどれだけあるのだろうか.しかし、一夜にしてすべての人がマイクロサービスの懐に入ったようだ.
現在最も主流の「マイクロサービスフレームワーク」として、Spring Cloudは急速に発展し、最も包括的なマイクロサービスソリューションとなっている.どんなソフトウェアシステムでも、どんなフレームワークでも、セキュリティは永遠に避けられない話題であり、私も最近のマイクロサービスの研究の冒頭としています.
古い話題!「どのようにしてマイクロサービスシステムで安全を保証することができますか?」という目標を達成するために、
Spring Cloud
のサービスの安全を保護するために、ここでは簡単で実行可能な方法を採用しています.つまり、統一的なユーザー授権センターを構築します.ここで補足して、
Authentication( )
とAuthorization( )
とは何かを言いますが、実は簡単で、認証はあなたが誰なのか、鑑権はあなたが何ができるかに関心を持っています.みんなが一致して言った例を挙げて、もしあなたが空港に行って飛行機に乗ったら、あなたが持っているパスポートはあなたの身分を代表して、これは認証で、あなたの航空券はあなたの権限で、あなたは何ができますか.マイクロサービスを学ぶのは簡単な探索過程ではなく、DDD(Domain Driven Design)領域駆動設計における領域モデルに従っても、マイクロサービスをより小さな粒度に分割しても、多くの新しい知識を学ぶことはできない.多くの新しい問題と以前からよく解決されていない問題に直面します.絶えず考えるにつれて、
Facebook/GitHub/AWS
のこれらの機関がどのように内部資源を保護するかを熟知するにつれて、答えも次第に浮上してきた.この目標を効率的に達成するために、ここでは
OAuth 2
とJWT(JSON Web Tokens)
の技術をソリューションとして採用し、なぜ
OAuth 2
を使うのかマイクロサービスは現代のソフトウェア開発においてまだ新鮮なものであるが、
OAuth 2
はすでに広く使用されているライセンス技術であり、Web開発者が自分でサービスを提供する中で、Google/Facebook/GitHub
プラットフォームのユーザー情報に安全な方法で直接アクセスできるようにしている.しかし、私が詳細を説明する前に、私は本論文の本当のテーマに焦点を当てます:
では、クラウドサービスにおけるユーザーアクセスリソースの制御は、一般的にどのように行われていますか?しかし、私はみんなが使ったようだが、完璧ではない例を挙げます.すべてのアクセス要求が送信されると仮定して、境界サーバまたは認証機能付き逆プロキシサーバを設定できます.認証に合格したら、内部の対応するサーバに転送します.一般的に
Spring MVC Security
開発ではほとんどそうします.しかし、これは安全ではありません.最も重要なのは、誰かが内部から攻撃すると、あなたのデータには安全性がありません.その他の方法:私たちはすべてのサービスのために統一的な権限データベースを構築し、要求するたびにユーザーを認証します.いくつかの面では愚かに聞こえますが、実際には実行可能なセキュリティ案です.
より良い方法:ユーザは、認証サービスによって認証を実現し、ユーザアクセスSessionを
Token
にマッピングする.すべてのリモート・アクセス・リソース・サーバに関連するAPIは、Token
を提供する必要があります.その後、リソースサーバは、認証サービスにアクセスしてToken
を識別し、Token
がどのユーザに属しているかを知り、このTokenを通じてどのリソースにアクセスできるかを知る.これはいい案に聞こえますよね?しかし、
Token
の安全な伝送をどのように保証しますか?ユーザー・アクセスと他のサービス・アクセスの区別方法これは私たちが関心を持っている問題に違いない.したがって、上記の様々な問題は、
OAuth 2
を使用することを選択しました.実際には、Facebook/Google
の機密データにアクセスすることは、私たち自身のバックエンドの保護されたデータにアクセスすることと何の違いもありません.そして、彼らはこのようなソリューションを何年も使用しています.私たちはこれらの方法に従うだけでいいです.OAuth 2
はどのように働いていますか.OAuth 2
に関する原理を知っていれば、OAuth 2
を導入するのは簡単です.「 App
はTom
のFacebook
に関するデータを取得することを望んでいる」というシナリオについて説明します.OAuth 2には、プロセス全体で4つの役割があります.
Tom
がFacebook
App
にログインしようとすると、Facebook
のライセンスサーバにリダイレクトし、Tom
がログインに成功し、自分のEmailと個人情報が App
によって取得されることを許可する.この2つのリソースは、Scope( )
として定義され、許可されると、 App
の開発者は、アクセス権範囲で定義された2つのリソースを申請することができる.+--------+ +---------------+
| |--(A)- Authorization Request ->| Resource |
| | | Owner |
| || Authorization |
| Client | | Server |
| || Resource |
| | | Server |
| |
Tom
は、権限要求を許可し、再びリダイレクトによって App
に戻り、リダイレクトに戻ったときにAccess Token( )
を携帯し、 App
は、Access Token
に関連する認証を再作成することなく、このFacebook
を通じてTom
から関連する認証リソース(すなわち、Emailおよび個人情報)を直接取得することができる.また、Tom
が App
にログインするたびに、以前に取得したAccess Token
を介して、関連するライセンスリソースを直接取得することができる.これまで、上記の内容を実際の例に直接使用するにはどうすればいいですか?
OAuth 2
は非常に友好的で、導入が容易で、すべてのインタラクションはクライアントと権限の範囲に関するものです.OAuth 2
の
と
は、私たちの普段のユーザーと権限と同じですか?いずれのタイプのアプリケーションもユーザログインを提供し、ログイン結果は
Access Token
であり、その後のすべてのAPI呼び出しはこのAccess Token
をHTTP要求ヘッダに追加し、呼び出されたサービスはAccess Token
を認証し、Tokenがアクセス可能な権限情報を取得することをサーバに許可する.これにより、すべてのサービスへのアクセスは、認証を完了するために別のサービスを要求します.権限範囲と役割、クライアントとユーザー
OAuth 2
では、どのアプリケーション(Webサイト、モバイルクライアント、デスクトップアプリケーション、その他)がそれらのリソースにアクセスできるかを定義できます.ここには1つのサイズしかありません.どこから来たユーザーがそれらのデータにアクセスできます.もちろん、どのアプリケーションやサービスがそれらのリソースにアクセスできます.言い換えれば、権限範囲は、エンドポイントがクライアントに表示されるか、またはユーザがその権限に基づいて関連するデータを取得するかを制御することである.1つのオンラインショップでは、フロントエンドは1つのクライアントと見なすことができ、商品、注文、顧客情報にアクセスすることができるが、バックエンドは物流や契約などに関することができる一方、ユーザーは1つのサービスにアクセスすることができるが、すべてのデータではない.これは、ユーザーがWebアプリケーションを使用しているためであり、彼ができない場合、他のユーザーは可能である.サービス間のアクセス時に議論する別の次元.数学に詳しい場合は、
OAuth 2
でクライアント-権限範囲関係はユーザー-権限関係とは線形に独立していると言えます.なぜJWTなのか
OAuth 2
は、Access Token
をどこに探してどこに存在するかに関心を持たず、ランダム文字列を生成し、Token
に関連するデータを保存してこれらの文字列に保存します.1つのトークンエンドポイントを介して、他のサービスは、このToken
が有効であるかどうか、どの権限を通過できるかに関心を持つ可能性があります.これがユーザ情報を取得するためにサーバをリソースサーバに変換するユーザ情報URLメソッドである.マイクロサービスについてお話しすると、複雑なタスクであるにもかかわらず、ライセンスサーバが水平に拡張されることを保証するために、
Token
ストレージを探す必要があります.すべてのマイクロサービスリソースへのアクセス要求はHttp HeaderにToken
を携帯しており、アクセスされたサービスは次にライセンスサーバにToken
の有効性の検証を要求します.現在、この方法では、2回以上の要求が必要ですが、セキュリティのためには他の方法はありません.しかし、Token
ストレージの拡張は、JWT( jot)
を導入した理由で、システムの拡張性に大きな影響を及ぼします.+-----------+ +-------------+
| | 1-Request Authorization | |
| |------------------------------------>| |
| | grant_type&username&password | |--+
| | |Authorization| | 2-Gen
| Client | |Service | | JWT
| | 3-Response Authorization | |
簡単に言えば、1人のユーザ要求に応答するとき、ユーザ情報と許可範囲をシーケンス化してJSON文字列を入れ、Base 64を用いて符号化し、最終的に許可サーバで
でこの文字列に署名し、JSON Web Token
を得、Access Token
を用いるように直接使用することができる.他のすべてのリソースサーバがRSA公開鍵を持っていると仮定します.Http HeaderにToken
が格納されているこの要求をリソースサーバが受信すると、リソースサーバはこのToken
を取得し、正しい秘密鍵署名(認証サーバ署名、すなわち
)が使用されているかどうかを検証することができる.
が通過し、逆シーケンス化されるとOAuth 2
の検証情報が得られる.認証サーバが返す情報は次のとおりです.
Bearer
、すなわち基本HTTP認証Access Token
はBase64
であるため、逆符号化後は以下のフォーマット、標準的なJWTフォーマットである.つまりHeader
、Payload
、Signature
の3つの部分です.{
"alg":"RS256",
"typ":"JWT"
}
{
"exp": 1492873315,
"user_name": "reader",
"authorities": [
"AURH_READ"
],
"jti": "8f2d40eb-0d75-44df-a8cc-8c37320e3548",
"client_id": "web_app",
"scope": [
"FOO"
]
}
&:lƧs)ۡ-[+
F"2"Kآ8ۓٞ:u9ٴ̯ޡ 9Q32Zƌ$ec{3mxJh0DF [!뀭N) knVVĖV| ׄE㍫}Ŝf9>'
JWTを使用すると、Token
を簡単に伝送することができ、RSA
でToken
が偽造されにくいことを保証することができる.Access Token
文字列にはユーザー情報と権限範囲が含まれており、私たちが必要とするすべての情報があるので、Token
のストレージを維持する必要はありません.リソースサーバもToken
のチェックを要求する必要はありません.+-----------+ +-----------+
| | 1-Request Resource | |
| |----------------------------------->| |
| | Authorization: bearer Access Token | |--+
| | | Resource | | 2-Verify
| Client | | Service | | Token
| | 3-Response Resource | |
したがって、OAuth 2
は、マイクロサービスにおいて使用され、全体的なアーキテクチャの拡張性に影響を及ぼさない.特に、Access Token
が期限切れになった後、Refresh Token
を使用して認証サーバにAccess Token
を再取得するなど、具体的な例が後述する.興味があれば、あとで実現部分もありますので、お楽しみに~
によってhttp://asciiflow.com/フローチャートは中国語では揃えられませんが、本文のフローチャートはすべて英語です~