Microservices /w Spring Security OAuth

  • View
    1.433

  • Download
    3

  • Category

    Software

Preview:

Citation preview

Copyright©2016 NTT corp. All Rights Reserved.

Microservices /w Spring Security OAuth

NTT ソフトウェアイノベーションセンタ 角田誠 2016年3月9日

2 Copyright©2016 NTT corp. All Rights Reserved.

•認可フレームワークであるOAuthを,マイクロサービス・アーキテクチャで構築されたアプリケーションを構成する各サービスへのアクセス時に利用することを想定して,OAuthの実装であるSpring Security OAuthを用いて行ったいくつかの実験についての報告。

本日の内容

3 Copyright©2016 NTT corp. All Rights Reserved.

•「In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API.」

• James Lewis, Martin Fowler,

• “Microservices a definition of this new architectual term”,

• http://martinfowler.com/articles/microservices.html

おさらい(Microservices)

4 Copyright©2016 NTT corp. All Rights Reserved.

•単一のアプリケーションを小さなサービス群の組み合わせとして構築する手法。

•個々のサービスは自身のプロセス上で動作する。

おさらい(Microservices)

5 Copyright©2016 NTT corp. All Rights Reserved.

•スケールさせるときは,アプリケーション全体ではなく,個々のサービスごとに多重化できるので効率が良い。

おさらい(Microservices)

6 Copyright©2016 NTT corp. All Rights Reserved.

•サードパーティ製のアプリケーション(≒クライアント)から,Webサービスを提供するサーバ(≒リソース,サービス)への,限定的なアクセスを可能にする認可フレームワーク。

• RFC6749(OAuth2)

おさらい(OAuth)

7 Copyright©2016 NTT corp. All Rights Reserved.

• OAuth以前 - クライアントサーバ型の認証モデル

• エンドユーザは,Webサービスにアクセスするための認証情報をサードパーティ製のアプリケーションに伝える。

おさらい(OAuth)

サードパーティ製の アプリケーション (クライアント)

Webサービス

エンドユーザの権限の範囲内での 無制限のアクセス

8 Copyright©2016 NTT corp. All Rights Reserved.

• OAuthの認証・認可モデル

• エンドユーザは,Webサービスにアクセスするための認証情報をサードパーティ製のアプリケーションに伝える必要がない。

おさらい(OAuth)

Webサービス 限定されたアクセス

アクセスの限定

サードパーティ製の アプリケーション (クライアント)

9 Copyright©2016 NTT corp. All Rights Reserved.

• OAuthの四つのロール

おさらい(OAuth)

クライアント

認可サーバ

リソースサーバ

・リソースオーナの許可を得てリソースサーバにアクセスする,ブラウザ上またはWebサーバ上で動作するアプリケーション。

リソースオーナ

・保護されたリソースをホストするサーバ。

・リソースオーナの認証と,リソースオーナから認可を取得し,クライアントにアクセストークンを発行するサーバ。

・クライアントにリソースサーバへのアクセスを許可する。

・エンドユーザ。

アクセストークン

10 Copyright©2016 NTT corp. All Rights Reserved.

•認可グラント

• リソースオーナによる認可を示す。

• 認可サーバは認可グラントに基づき,クライアントにアクセストークンを発行する。

• 四つのタイプがあり,それぞれでアクセストークン発行手順が異なる。

おさらい(OAuth)

クライアントがリソースサーバに アクセスするときに必要なトークン

11 Copyright©2016 NTT corp. All Rights Reserved.

•四つのグラントタイプ

• 認可コード

• インプリシット

• リソースオーナパスワードクレデンシャル

• クライアントクレデンシャル

おさらい(OAuth)

OAuthといって普通にイメージするのはこのあたり。 エンドユーザはクライアントに対し認可の範囲を限定できる。

12 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラント

• クライアントからリソースサーバへのアクセスを,エンドユーザが認可することで,アクセストークンを発行する。

おさらい(OAuth)

クライアント

認可サーバ ユーザ

エージェント (Webブラウザ)

(1)リソースサーバへのアクセス事象発生

(2)認可サーバへのリダイレクト指示

(3)リダイレクト

(4)認可要求

(5)認可要求

(7)認可

(8)認可コード + クライアントへのリダイレクト指示

(10)認可コードによりアクセストークン要求

(9)リダイレクト /w 認可コード (11)アクセストークン

(6)認可(エンドユーザはクライアントに対して認可の範囲を限定できる。)

リソースサーバ (12)リソースサーバへのアクセス

13 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントクレデンシャルグラント

• エンドユーザとは関係なく,クライアントを認証し,アクセストークンを発行する。

おさらい(OAuth)

クライアント 認可サーバ

(1)リソースサーバへのアクセス事象発生

(2)クライアントの認証情報

(3)アクセストークン

リソースサーバ (4)リソースサーバへのアクセス

14 Copyright©2016 NTT corp. All Rights Reserved.

• Spring Bootによるサービスの実現

• Eurekaによるサービスの登録・発見

SpringとMicroservices

15 Copyright©2016 NTT corp. All Rights Reserved.

• Spring Security OAuth

• Spring Securityの関連プロジェクト

• 認可サーバ,リソースサーバ,クライアントの作成をサポート

• 今回は,Spring Security OAuthの細かな設定などの説明は割愛。

SpringとOAuth

16 Copyright©2016 NTT corp. All Rights Reserved.

• Spring BootやSpring Security OAuthを使ったMicroservicesなアプリケーションで,サービス(リソースサーバ)から他のサービスの呼び出しでも,エンドユーザが認可した範囲に限定したアクセスを行う。

実現したいこと(1)

クライアント

エンドユーザが認可した範囲での限定したアクセス

MicroservicesでいうところのサービスをOAuthのリソースサーバとして実現

17 Copyright©2016 NTT corp. All Rights Reserved.

認可サーバ 認可サーバ

• Spring Security OAuthで作ったクライアントやリソースサーバが,Eurekaサーバに登録された,多重化されたリソースサーバや認可サーバのうちのどれかを選んでアクセスする。

実現したいこと(2)

クライアント

18 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントからリソースサーバへのアクセス

• リソースサーバはクライアントに対して,REST APIを提供する。

• クライアントは,REST APIに普通にアクセスするときに使うRestTemplateの代わりにOAuth2RestTemplateを使って,リソースサーバにアクセスする。

Spring Security OAuth

@RestController public class ClientController { @Value("${config.oauth2.resourceURI}") private String resourceUri; @Autowired private OAuth2RestTemplate restTemplate; @RequestMapping("/") public String home() { return restTemplate.getForObject(resourceUri, String.class); } }

19 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• クライアントからリソースサーバへのアクセスが必要になる。

Spring Security OAuth

クライアント

リソースサーバ

20 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• クライアントからリソースサーバへのアクセスが必要になる。

• クライアントは,OAuth2RestTemplateを使いリソースサーバにアクセスしようとする。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

21 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• クライアントからリソースサーバへのアクセスが必要になる。

• クライアントは,OAuth2RestTemplateを使いリソースサーバにアクセスしようとする。

• UserRedirectRequiredExceptionが投げられる。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller UserRedirect RequiredException

22 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• OAuth2ClientContextFilterがキャッチしてブラウザのロケーションを認可サーバにリダイレクトさせる。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

UserRedirect RequiredException

認可サーバ

23 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• OAuth2ClientContextFilterがキャッチしてブラウザのロケーションを認可サーバにリダイレクトさせる。

• ユーザの認証・認可が行われる。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認証・認可

24 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• OAuth2ClientContextFilterがキャッチしてブラウザのロケーションを認可サーバにリダイレクトさせる。

• ユーザの認証・認可が行われる。

• 元のクライアントのURLにリダイレクトされ,再度コントローラが呼ばれる。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

25 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• 再度,OAuth2RestTemplateを使いリソースサーバにアクセスしようとする。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

26 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• 再度,OAuth2RestTemplateを使いリソースサーバにアクセスしようとする。

• 認可サーバからアクセストークンを取得する。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

認可コード

アクセストークン

27 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラントによるリソースサーバへのアクセスの流れ

• 再度,OAuth2RestTemplateを使いリソースサーバにアクセスしようとする。

• 認可サーバからアクセストークンを取得する。

• リソースサーバにアクセスする。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

認可コード

アクセストークン

アクセストークン

28 Copyright©2016 NTT corp. All Rights Reserved.

• Spring BootやSpring Security OAuthを使ったMicroservicesなアプリケーションで,サービス(リソースサーバ)から他のサービスの呼び出しでも,エンドユーザが認可した範囲に限定したアクセスを行う。

実現したいこと(1)

クライアント

エンドユーザが認可した範囲での限定したアクセス

MicroservicesでいうところのサービスをOAuthのリソースサーバとして実現

29 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

30 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• 認可コードグラント?

• リソースサーバ(A)にアクセスしているのはクライアントや他のリソースサーバであって,エンドユーザではない。

• エンドユーザに認可を求めることができない。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認証・認可 認可サーバ

31 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• クライアントクレデンシャルグラントを使うのが普通(多分)。

• エンドユーザは介入しない。

• リソースサーバ(A)をクライアントとして認可サーバが認証できる。

• リソースサーバ(A)に与えられたスコープで,リソースサーバ(B)にアクセスできる。

• つまり,エンドユーザの認可は反映されない。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

認可サーバ

リソースサーバ(A)の認証情報

アクセストークン

リソースサーバ(B)

リソースサーバ(B)へのアクセス

リソースサーバ(A)

32 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• エンドユーザの認可を反映しつつ,リソースサーバ(A)からリソースサーバ(B)にアクセスしたい。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

33 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• クライアントは,リソースサーバ(A)にアクセスするとき,認可コードグラントで,ユーザの認可が反映されたアクセストークンを受け取ることができる。

• リソースサーバ(A)はこのアクセストークンをクライアントから受け取る。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

34 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• リソースサーバ(A)がクライアントから受け取ったアクセストークンをそのままリソースサーバ(B)へのアクセスに使えば…。

• JWT(JSON Web Token)なアクセストークンを使えば,改ざん防止とリソースサーバ内での検証が可能。

リソースサーバ(A)から他のリソースサーバ(B)へのアクセス

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

アクセストークン

35 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• リソースサーバ(A)がクライアントから受け取ったアクセストークンをそのままリソースサーバ(B)へのアクセスに使えば…。

リソースサーバから他のリソースサーバへのアクセス

@RequestMapping("/") public String resource(OAuth2Authentication principal) { // 認証情報に含まれるアクセストークンを取得し, String tokenValue = ((OAuth2AuthenticationDetails)principal.getDetails()).getTokenValue(); // リソーサーバ(B)へのアクセスに使う // OAuth2RestTemplateのOAuth2ClientContextに埋め込む OAuth2ClientContext context = ((OAuth2RestTemplate)restTemplate).getOAuth2ClientContext(); context.setAccessToken(new DefaultOAuth2AccessToken(tokenValue)); return "resource server! -> " + restTemplate.getForObject(resourceUri, String.class); }

36 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバ(A)(サービス)から他のリソースサーバ(B)へのアクセスにOAuthを使うには…。

• リソースサーバ(A)がクライアントから受け取ったアクセストークンをそのままリソースサーバ(B)へのアクセスに使えば…。

• 期待通りにエンドユーザが認可した権限の範囲で,リソースサーバ(A)からリソースサーバ(B)へのアクセスが可能になる。

リソースサーバから他のリソースサーバへのアクセス

37 Copyright©2016 NTT corp. All Rights Reserved.

認可サーバ 認可サーバ

• Spring Security OAuthで作ったクライアントやリソースサーバが,Eurekaサーバに登録された,多重化されたリソースサーバや認可サーバのうちのどれかを選んでアクセスする。

実現したいこと(2)

クライアント

38 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化されたリソースサーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

39 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化されたリソースサーバにアクセスする。

•クライアントから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

40 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化されたリソースサーバにアクセスする。

•クライアントから多重化された認可サーバにアクセスする。

•リソースサーバから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

41 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化されたリソースサーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

42 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化されたリソースサーバにアクセスする。

• Eurekaに登録されたサービスに普通にアクセスするときとほぼ一緒。

EurekaとSpring Security OAuth

@Autowired private OAuth2RestOperations restTemplate; @Autowired private LoadBalancerClient loadBalancer; @RequestMapping("/") public String home() { // resourceNameに該当するサービスを一つ選択しURIを構築する。 String uri = loadBalancer.choose(resourceName).getUri() + resourcePath; return restTemplate.getForObject(uri, String.class); }

43 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

44 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

あらかじめ設定した内容に基づいてSpring Security OAuthが勝手に認可サーバにアクセスする。

45 Copyright©2016 NTT corp. All Rights Reserved.

•クライアントから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

Spring Security OAuthで提供されているクラスを拡張する必要がある。

あらかじめ設定した内容に基づいてSpring Security OAuthが勝手に認可サーバにアクセスする。

46 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバから多重化された認可サーバにアクセスする。

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

47 Copyright©2016 NTT corp. All Rights Reserved.

•リソースサーバから多重化された認可サーバにアクセスする。

• JWT使用時,リソースサーバから認可サーバにアクセスするのは,起動時の一度のみ。

• アクセストークン検証用の鍵を認可サーバに取りに行く。

• org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerTokenServicesConfigurationの中

• リソースサーバ起動時に,Eurekaで見つけた認可サーバに鍵を取りに行くようにすればOK。

• そもそも,設定ファイル(e.g. application.yml)に鍵を書いておけば,認可サーバにアクセスする必要はない…。

EurekaとSpring Security OAuth

48 Copyright©2016 NTT corp. All Rights Reserved.

• OAuthで,リソースサーバ(A)が他のリソースサーバ(B)にアクセスするときに必要となるアクセストークンは,リソースサーバ(A)がクライアントから受け取ったアクセストークンを流用できる。

• OAuthで,クライアントから多重化されたリソースサーバへのアクセスは,多重化されたサービスに普通にアクセスするときとほぼ一緒。

•クライアントやリソースサーバから多重化された認可サーバへのアクセスは,少し頑張れば可能。

まとめ

Recommended