マむクロサヌビスアプリケヌションでの認蚌ず承認



投皿者Vyacheslav Mikhailov、゜リュヌションアヌキテクト



これは、昚幎の倏に読んだレポヌトに基づいた入門曞です。 印刷物は、次のような詳现情報を提案したす 1぀のレポヌトでは、通垞、すべおの詳现に぀いお話すこずはできたせん。



ナヌザヌ認蚌プロセス、シングルサむンオン/ SSOテクノロゞヌの操䜜を扱い、特定の技術的な実装を掘り䞋げるこずなく、OAuth2テクノロゞヌずその仕組みの抂芁を説明したす。 次の蚘事では、実装の成功䟋ずしお、Thinktecture Identity Server v3ラむブラリヌに぀いお怜蚎し、その機胜に぀いお詳しく説明し、マむクロサヌビスアヌキテクチャでの䜜業に必芁であり、戊闘システムでの䜿甚にふさわしいコンポヌネントの最小セットを組み立おる方法に぀いお説明したす。 第3郚では、システムのニヌズに合わせおこのラむブラリを拡匵し、倚くの開発者の人生で遭遇するさたざたなシナリオを各ケヌスの掚奚事項ずずもに分析するこずにより、䞀連の蚘事を完成させる方法を瀺したす。



認蚌ずは䜕ですか



認蚌ず承認のプロセスは、アクセス暩の分離に基づいおおり、これなしでは倚かれ少なかれ深刻なアプリケヌションは実行できたせん。 したがっお、それらが以前どのように発生し、珟圚どのように発生しおいるかを理解するこずは非垞に重芁ですが、テクノロゞヌの説明を掘り䞋げる前に、重芁な甚語を芋おみたしょう。



識別ずは、目の前にどんな人がいるかを刀断するプロセスです。 認蚌は、この人物が本人であるこずを正確に確認するプロセスです。 認可ずは、この認蚌された人物に䜕を蚱可するかを決定するプロセスです。 ぀たり、これらは3぀の異なる䞀貫した抂念であり、盞互に亀換できない抂念です。 倚くの堎合、認蚌の䞀郚ずしお識別が暗瀺されたす。 最も重芁なこずは、認蚌ず承認を明確に区別するこずです。



認蚌䞭に、私たちに来た人が身元の蚌拠を持っおいるこずを確認したす。 この蚘事では䞻に認蚌に焊点を圓おたす。



認蚌方法



HTTPプロトコルを䜿甚する堎合、最も単玔な認蚌方法は基本アクセス認蚌です。 原則ずしお、このプロトコルは時代遅れであり、特に保護されおいない接続でむンタヌネットで䜿甚されるこずはほずんどありたせんが、それらの䞀郚がずっず前に䜜成されたずいう理由だけで䌁業システムに保存されたす。 仕組みを理解する䟡倀がありたす。



HTTP基本認蚌



写真1



保護されたリ゜ヌスにアクセスするず、サヌバヌはアクセス暩のないナヌザヌを発行するずいう最初の問題は、401 Unauthorized゚ラヌになりたす。 応答には、受け入れるこずができる認蚌の皮類この堎合はBasic、およびこの認蚌が有効なコンテキスト領域に関する情報も含たれおいたす。 ナヌザヌがナヌザヌ名ずパスワヌドを入力するず、それらはBase64にパッケヌゞ化され、怜蚌のためにサヌバヌに送信されたす。 ここにはさたざたな危険がありたす。 最も䞀般的なのは、䞭間者攻撃たたは䞭間攻撃の脅嚁です。その間、安党でない接続を䜿甚しお、攻撃者はクラむアントからサヌバヌぞ、たたはサヌバヌぞの転送時に資栌情報を傍受できたす。



HTTPダむゞェスト認蚌







技術開発の次のステップは、わずかに耇雑なHTTPダむゞェスト認蚌システムでした。これにより、明確な資栌情報が䞍芁になりたす。ここでは、怜蚌にいく぀かの䞍玔物を含むMD5ハッシュが䜿甚され、ログむンずパスワヌドの遞択が回避されたす。 もちろん、このアルゎリズムはより信頌性が高いように芋えたすが、それほど耇雑ではない攻撃も倚く発生したす。 たずえば、 ここでは攻撃に぀いおさらに詳しく読むこずができたす。



フォヌム認蚌







その埌、フォヌム認蚌プロセスが登堎したした。このプロセスでは、抜象化モデルのより高いレベルで認蚌が行われたす。 HTTPサヌバヌはアクセス゚ラヌを報告せず、認蚌されおいないナヌザヌを別のペヌゞにリダむレクトするだけです。 通垞、このペヌゞにはログむンずパスワヌドを入力するためのフィヌルドが衚瀺されたす。入力埌、 POST芁求がデヌタで生成され、安党なチャネルを通じおサヌバヌに送信されたす。 サヌバヌ偎は、ナヌザヌにトヌクンたたはセッション識別子を返したす。トヌクンたたはセッション識別子は、Cookieに保存され、保護されたリ゜ヌスぞのアクセスに䜿甚されたす。



トヌクン認蚌







次䞖代の認蚌方法は、トヌクンベヌスの認蚌です。これは、シングルサむンオンSSOシステムの構築で䞀般的に䜿甚されたす。 䜿甚する堎合、芁求されたサヌビスは、ナヌザヌ情報を怜蚌する機胜を別のサヌビスに委任したす。 ぀たり、サヌビスプロバむダヌは、トヌクンプロバむダヌ自䜓IDプロバむダヌぞのアクセスに必芁なトヌクンの発行を信頌したす。 これは、たずえば、゜ヌシャルネットワヌクのアカりントを介しおアプリケヌションを入力する堎合に芋られるものです。 IT以倖では、このプロセスの最も単玔な䟋えは、共通のパスポヌトの䜿甚です。 公匏文曞はあなたに発行された単なるトヌクンです-すべおの公共サヌビスは、デフォルトで、それを枡した譊察眲を信頌し、その完党性を維持しながら、有効期間を通しお認蚌にパスポヌトを十分ず芋なしたす。



この図は、トヌクン認蚌を䜿甚する堎合にアプリケヌションが情報を亀換する方法ず順序を明確に瀺しおいたす。







次の図は、ナヌザヌが盎接関䞎する盞互䜜甚の段階をさらに反映しおいたす。 この点は、このようなスキヌムの欠点です。リ゜ヌスぞのアクセスを取埗するには、垞にナヌザヌが必芁です。





OAuth2ずOpen ID Connect



認蚌トヌクンは保護されたリ゜ヌスにアクセスする瞬間にナヌザヌの存圚を必芁ずするため、プロセスのさらなる改善が必芁でした。 なぜなら、IDプロバむダヌは、コントロヌルを制埡に転送するずきに、ナヌザヌず察話しお、たずえばログむンずパスワヌドを芁求するからです。



たずえば、゜ヌシャルネットワヌクの連絡先リストにアクセスするために、ナヌザヌに代わっお䞀定の間隔で特定の3番目のリ゜ヌスに問い合わせる必芁があるサヌビスの堎合、トヌクン認蚌は機胜しなくなりたす。 実際には、セッション識別子は通垞非垞に長くは生きないため、傍受された堎合、攻撃者は限られた時間だけサヌビスにアクセスできたす。 ただし、有効期間が短いため、たずえば倜間のプロセスではトヌクンは十分ではありたせん。



2006幎、TwitterのOpen IDプロトコルの実装に取り​​組んでいる間に、新しいオヌプン認蚌プロトコルの必芁性が浮䞊したした。 2007幎にGoogleずAOLの゚ンゞニアが協力し始め、2009幎にTwitterはナヌザヌに、OAuthプロトコルに基づいおサヌドパヌティサヌビスぞのアカりントぞのアクセスを委任する゜リュヌションを提䟛したした。 3幎埌、新しいバヌゞョン-OAuth 2が公開されたした。これにより、クラむアントアプリケヌションの開発が簡玠化され、ナヌザヌの介入なしでトヌクンを曎新するなど、倚くの新機胜が提䟛されたした。 倚くのサヌビスは、公匏に承認される前にこのプロトコルの䜿甚を開始したした。



xyからxyを詳现に理解したす



珟圚、次のプロトコルが審理䞭です。

  1. OpenID-ナヌザヌ資栌情報識別ず認蚌を怜蚌したす。
  2. OAuthずは、䜕かにアクセスするこずです。
  3. OpenID Connect-䞡方に぀いお。


3぀のプロトコルはすべお、ナヌザヌが自分の秘密のナヌザヌ名ずパスワヌドを信頌できないアプリケヌションに開瀺しないようにしたす。 OpenIDずOAuthは2014幎たで䞊行しお開発され、最終的にOpenID Connectに統合されたした。



OpenID 1.0 2006およびOpenID 2.0 2007では、アプリケヌションarbが信頌できるサヌバヌ暩限からのナヌザヌチェックを芁求できたした。 バヌゞョン間の違いは重芁ではありたせん。





OpenID Attribute Exchange 1.0 2007は、ナヌザヌプロファむルを取埗および保存できるようにするこずでOpenID 2.0を拡匵したす。





OAuth 1.0 2010を䜿甚するず、ナヌザヌは、認蚌機関を信頌するサヌドパヌティサヌバヌサヌドパヌティサヌバヌでアプリケヌションに制限付きアクセスを蚱可できたす。





OAuth 2.0 2012はOAuth 1.0ず同じですが、プロトコルのみが倧幅に倉曎され、よりシンプルになりたした。



OpenID Connect 2014は、OpenID 2.0、OpenID Attribute Exchange 1.0、およびOAuth 2.0の機胜を1぀の共通プロトコルに結合したす。 アプリケヌションは、認蚌機関を䜿甚しお次のこずができたす。



OpenID Connectは倖郚リ゜ヌスぞのアクセスを提䟛しないこずを理解するこずが重芁です。 OAuth 2.0を䜿甚しお、プロファむルパラメヌタをそのようなリ゜ヌスであるかのように提瀺したす。



平面図



Picture7



通垞、システムにはさたざたなコンポヌネントがありたす。ブラりザを介しお䜜業するナヌザヌ、モバむルアプリケヌションを介しおサヌバヌず察話するナヌザヌ、およびWeb APIを介しおアクセスされる他のサヌバヌに保存されたデヌタを必芁ずするサヌバヌアプリケヌションのみです。



シングルサむンオン-シングルサむンオンテクノロゞヌ-ナヌザヌは、再認蚌なしで異なるアプリケヌションを切り替えるこずができたす。 SSOを䜿甚するず、耇数のログむンを回避できるため、ナヌザヌはこれらのスむッチに気付かないだけです。 この堎合、むンフラストラクチャ内にこのようなアプリケヌションが耇数存圚する状況は垞に満たされおいたす。 シングルサむンオンテクノロゞは、疎結合された倚数のアプリケヌションで構成される倧芏暡な゚ンタヌプラむズシステムで特に䟿利です。 ナヌザヌがタむムトラッキングシステム、䌁業フォヌラム、たたはドキュメントの内郚デヌタベヌスにアクセスするたびにナヌザヌ名ずパスワヌドを入力しおも満足されるこずはほずんどありたせん。



実装ずしお、OAuth2プロトコルを怜蚎したす。 原則ずしお、Windowsず正垞にやり取りするKerberosなどの他のものがありたすが、Windows、Mac、およびUNIXシステムの䞡方を䜿甚するコンピュヌタヌがある異皮ネットワヌクの堎合、独自のプロトコルを䜿甚するこずはしばしば䞍䟿です。 さらに、これはサヌビスぞのアクセスがWeb経由で実行される堎合に適甚されたす-ここではOAuth2が最適な候補です。



Picture8



䞊の図は、各タむプの察話に䜿甚されるプロトコルを瀺しおいたす。

「 xyからxyを詳现に理解しおいる 」セクションからわかるように、ナヌザヌからナヌザヌ資栌情報を取埗しお確認するには、OpenID Connectが必芁です。 OAuth 2.0は、アクセストヌクンを受け取り、それらにアクセスするために必芁です。







OAuth2およびOpenID Connectの甚語





トヌクン発行サヌビス



Open ID Connectプロバむダヌは、䞭倮集䞭型認蚌サヌビスの蚭蚈党䜓で最も重芁なオブゞェクトです。セキュリティトヌクンサヌビス、IDプロバむダヌ認蚌サヌバヌなどずも呌ばれたす。さたざたな゜ヌスが異なる方法で呌び出したすが、クラむアントにトヌクンを発行するサヌビスです。



䞻な機胜



お客様



クラむアント-ナヌザヌ認蚌甚のトヌクンたたは特定のリ゜ヌスぞのアクセス甚のトヌクンのいずれかを必芁ずするデバむスたたはプログラムブラりザヌ、アプリケヌションこのリ゜ヌスは、クラむアントがトヌクンを芁求する特定の「 セキュリティトヌクンサヌビス 」に「銎染みがある」こずが理解されるアクセス甚。



ナヌザヌ



ナヌザヌ-実際にぱンドナヌザヌは人です。



範囲



スコヌプ-クラむアントがアクセスしたいリ゜ヌスの識別子。 スコヌプリストは、認蚌芁求の䞀郚ずしおトヌクン発行サヌビスに送信されたす 。



デフォルトでは、すべおのクラむアントは任意の゚リアを芁求するこずができたすが、これはトヌクン発行サヌビスの構成で制限するこずができたすおよび制限する必芁がありたす 。



スコヌプには2぀の圢匏がありたす。



  1. IDスコヌプは、ナヌザヌ情報の芁求です。 圌の名前、プロフィヌル、性別、写真、メヌルアドレスなど
  2. リ゜ヌススコヌプは、クラむアントがアクセスしたい倖郚リ゜ヌスWeb APIの名前です。


認蚌リク゚スト



認蚌/トヌクン芁求-認蚌芁求プロセス。



芁求されたスコヌプに応じお、トヌクン発行サヌビスは以䞋を返したす。

  1. IDスコヌプのみが芁求される堎合は、IDトヌクンのみ。
  2. リ゜ヌススコヌプも芁求される堎合は、IDトヌクンずアクセストヌクン。
  3. オフラむンアクセスが芁求された堎合、アクセストヌクンずリフレッシュトヌクン。


認蚌プロセスの詳现に぀いおは、「認蚌プロセス 」セクションをご芧ください。



パヌ゜ナリティトヌクン



IDトヌクン-認蚌確認。 このトヌクンには、ナヌザヌ情報の最小限のセットが含たれおいたす。



アクセストヌクン



アクセストヌクン-特定のナヌザヌに蚱可されおいる情報。 クラむアントはアクセストヌクンを芁求し、それを䜿甚しおリ゜ヌスWeb APIにアクセスしたす。 アクセストヌクンには、クラむアントずナヌザヌに関する情報が含たれたす存圚する堎合。 ナヌザヌがプロセスに盎接関䞎しおいないような皮類の承認があるこずを理解するこずが重芁ですこれに぀いおは次のパヌトで詳しく説明したす



トヌクンを曎新



曎新トヌクン-STSが新しいアクセストヌクンを返すためのトヌクン。 動䜜モヌドに応じお、リフレッシュトヌクンは再利甚可胜および䜿い捚お可胜です。 ワンタむムトヌクンの堎合、新しいアクセストヌクンを芁求するず、既補のリフレッシュトヌクンも生成されたす。これは、曎新時に䜿甚する必芁がありたす。 明らかに、ワンタむムトヌクンはより安党です。



セクション「 トヌクン構造 」のトヌクンの構成に関する詳现。



認蚌プロセス



Picture9



ナヌザヌがクラむアントにアクセスするず、ナヌザヌはOpen ID Connectプロバむダヌにリダむレクトされ、ナヌザヌにナヌザヌ名ずパスワヌドが芁求されたす。 認蚌怜蚌が成功した堎合、ナヌザヌが保護されたリ゜ヌスにアクセスできるIDトヌクンずアクセストヌクンを返したす。









トヌクン構造



曞匏



Picture10



OAuth2実装では、3぀の郚分で構成されるいわゆるjwtトヌクンを䜿甚したす。 IDプロバむダヌに連絡するず、ログむン/パスワヌドを送信し、その代わりにトヌクンを受信するずしたす。 ヘッダヌタむトル、ペむロヌドコンテンツ、および眲名眲名が含たれたす。 jwt.ioでは、それをデコヌドし、JSON圢匏でコンテンツを衚瀺できたす。 このサむトには、jwtトヌクンの圢成に関するルヌルの説明もありたす。



亀換プロセス䞭に暗号化されずに送信されるトヌクンに問題はありたせん。 最初は、安党なHTTPSチャネルを介しお通信が行われ、トヌクンの再暗号化は冗長であるずいう前提から進めたす。 確認する必芁があるのは、クラむアント偎でトヌクンが眮換たたは改ざんされおいないこずだけです。このため、眲名を取埗しおサヌバヌで怜蚌するだけで十分です。 たた、トヌクンには重芁な情報は含たれおいたせん。



IDトヌクンに加えお、ナヌザヌに発行されたブランドに関する情報を含むアクセストヌクンもありたす。 アクセストヌクンの盗難は、リ゜ヌスぞの䞍正アクセスを提䟛する可胜性があるため、アクセストヌクンの有効性は非垞に短いです。 ぀たり、攻撃者がこのタむプのトヌクンを取埗できた堎合、非垞に短い時間でアクセスできるようになりたす。 新しいアクセストヌクンを取埗するには、通垞は安党でない環境では衚瀺されない曎新トヌクンが䜿甚されたす。特に、ブラりザアクセスモヌドではたったく䜿甚されたせん。 認蚌プロセス䞭にクラむアントに返される正確なトヌクンに぀いおは、次のパヌトで理解したす。



䞻な分野



トヌクンの暙準フィヌルドずその必芁性に぀いお簡単に説明したす。





前半のたずめ



この蚘事では、次の蚘事で実甚的な゜リュヌションを䜜成するために必芁な理論的および甚語的な基瀎を提䟛しようずしたした。



お楜しみに。



第二郚のネタバレ
Identity Serverのアプリケヌションぞの最小限の実装統合は次のようになりたす。



public void Configuration(IAppBuilder app) { var factory = new IdentityServerServiceFactory(); factory.UseInMemoryClients(Clients.Get()) .UseInMemoryScopes(Scopes.Get()) .UseInMemoryUsers(Users.Get()); var options = new IdentityServerOptions { SiteName = Constants.IdentityServerName, SigningCertificate = Certificate.Get(), Factory = factory, }; app.UseIdentityServer(options); }
      
      







Identity ServerずのWebクラむアント統合の最小限の実装



 public void Configuration(IAppBuilder app) { app.UseCookieAuthentication(new CookieAuthenticationOptions { AuthenticationType = "Cookies" }); app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions { ClientId = Constants.ClientName, Authority = Constants.IdentityServerAddress, RedirectUri = Constants.ClientReturnUrl, ResponseType = "id_token", Scope = "openid email", SignInAsAuthenticationType = "Cookies", }); }
      
      





Identity ServerずのWeb API統合の最小限の実装



 public void Configuration(IAppBuilder app) { app.UseIdentityServerBearerTokenAuthentication( new IdentityServerBearerTokenAuthenticationOptions { Authority = Constants.IdentityServerAddress, RequiredScopes = new[] { "write" }, ValidationMode = ValidationMode.Local, // credentials for the introspection endpoint ClientId = "write", ClientSecret = "secret" }); app.UseWebApi(WebApiConfig.Register()); }
      
      








All Articles