48
Copyright©2016 NTT corp. All Rights Reserved. Microservices /w Spring Security OAuth NTT ソフトウェアイノベーションセンタ 角田誠 2016年3月9日

Microservices /w Spring Security OAuth

Embed Size (px)

Citation preview

Page 1: Microservices /w Spring Security OAuth

Copyright©2016 NTT corp. All Rights Reserved.

Microservices /w Spring Security OAuth

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

Page 2: Microservices /w Spring Security OAuth

2 Copyright©2016 NTT corp. All Rights Reserved.

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

本日の内容

Page 3: Microservices /w 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)

Page 4: Microservices /w Spring Security OAuth

4 Copyright©2016 NTT corp. All Rights Reserved.

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

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

おさらい(Microservices)

Page 5: Microservices /w Spring Security OAuth

5 Copyright©2016 NTT corp. All Rights Reserved.

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

おさらい(Microservices)

Page 6: Microservices /w Spring Security OAuth

6 Copyright©2016 NTT corp. All Rights Reserved.

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

• RFC6749(OAuth2)

おさらい(OAuth)

Page 7: Microservices /w Spring Security OAuth

7 Copyright©2016 NTT corp. All Rights Reserved.

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

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

おさらい(OAuth)

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

Webサービス

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

Page 8: Microservices /w Spring Security OAuth

8 Copyright©2016 NTT corp. All Rights Reserved.

• OAuthの認証・認可モデル

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

おさらい(OAuth)

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

アクセスの限定

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

Page 9: Microservices /w Spring Security OAuth

9 Copyright©2016 NTT corp. All Rights Reserved.

• OAuthの四つのロール

おさらい(OAuth)

クライアント

認可サーバ

リソースサーバ

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

リソースオーナ

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

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

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

・エンドユーザ。

アクセストークン

Page 10: Microservices /w Spring Security OAuth

10 Copyright©2016 NTT corp. All Rights Reserved.

•認可グラント

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

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

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

おさらい(OAuth)

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

Page 11: Microservices /w Spring Security OAuth

11 Copyright©2016 NTT corp. All Rights Reserved.

•四つのグラントタイプ

• 認可コード

• インプリシット

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

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

おさらい(OAuth)

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

Page 12: Microservices /w Spring Security OAuth

12 Copyright©2016 NTT corp. All Rights Reserved.

•認可コードグラント

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

おさらい(OAuth)

クライアント

認可サーバ ユーザ

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

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

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

(3)リダイレクト

(4)認可要求

(5)認可要求

(7)認可

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

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

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

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

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

Page 13: Microservices /w Spring Security OAuth

13 Copyright©2016 NTT corp. All Rights Reserved.

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

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

おさらい(OAuth)

クライアント 認可サーバ

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

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

(3)アクセストークン

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

Page 14: Microservices /w Spring Security OAuth

14 Copyright©2016 NTT corp. All Rights Reserved.

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

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

SpringとMicroservices

Page 15: Microservices /w Spring Security OAuth

15 Copyright©2016 NTT corp. All Rights Reserved.

• Spring Security OAuth

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

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

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

SpringとOAuth

Page 16: Microservices /w Spring Security OAuth

16 Copyright©2016 NTT corp. All Rights Reserved.

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

実現したいこと(1)

クライアント

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

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

Page 17: Microservices /w Spring Security OAuth

17 Copyright©2016 NTT corp. All Rights Reserved.

認可サーバ 認可サーバ

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

実現したいこと(2)

クライアント

Page 18: Microservices /w Spring Security OAuth

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); } }

Page 19: Microservices /w Spring Security OAuth

19 Copyright©2016 NTT corp. All Rights Reserved.

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

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

Spring Security OAuth

クライアント

リソースサーバ

Page 20: Microservices /w Spring Security OAuth

20 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

Page 21: Microservices /w Spring Security OAuth

21 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

• UserRedirectRequiredExceptionが投げられる。

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller UserRedirect RequiredException

Page 22: Microservices /w Spring Security OAuth

22 Copyright©2016 NTT corp. All Rights Reserved.

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

UserRedirect RequiredException

認可サーバ

Page 23: Microservices /w Spring Security OAuth

23 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認証・認可

Page 24: Microservices /w Spring Security OAuth

24 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

Page 25: Microservices /w Spring Security OAuth

25 Copyright©2016 NTT corp. All Rights Reserved.

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

Page 26: Microservices /w Spring Security OAuth

26 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

認可コード

アクセストークン

Page 27: Microservices /w Spring Security OAuth

27 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

Spring Security OAuth

クライアント

リソースサーバ OAuth2 RestTemplate

Controller

OAuth2 ClientContextFilter

認可サーバ 認可コード

認可コード

アクセストークン

アクセストークン

Page 28: Microservices /w Spring Security OAuth

28 Copyright©2016 NTT corp. All Rights Reserved.

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

実現したいこと(1)

クライアント

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

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

Page 29: Microservices /w Spring Security OAuth

29 Copyright©2016 NTT corp. All Rights Reserved.

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

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

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

Page 30: Microservices /w Spring Security OAuth

30 Copyright©2016 NTT corp. All Rights Reserved.

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

• 認可コードグラント?

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

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

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

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認証・認可 認可サーバ

Page 31: Microservices /w Spring Security OAuth

31 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

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

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

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

認可サーバ

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

アクセストークン

リソースサーバ(B)

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

リソースサーバ(A)

Page 32: Microservices /w Spring Security OAuth

32 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

Page 33: Microservices /w Spring Security OAuth

33 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

Page 34: Microservices /w Spring Security OAuth

34 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

クライアント

リソースサーバ(B)

リソースサーバ(A)

アクセストークン

アクセストークン

認可サーバ

アクセストークン

Page 35: Microservices /w Spring Security OAuth

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); }

Page 36: Microservices /w Spring Security OAuth

36 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

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

Page 37: Microservices /w Spring Security OAuth

37 Copyright©2016 NTT corp. All Rights Reserved.

認可サーバ 認可サーバ

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

実現したいこと(2)

クライアント

Page 38: Microservices /w Spring Security OAuth

38 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 39: Microservices /w Spring Security OAuth

39 Copyright©2016 NTT corp. All Rights Reserved.

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

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 40: Microservices /w Spring Security OAuth

40 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 41: Microservices /w Spring Security OAuth

41 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 42: Microservices /w 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); }

Page 43: Microservices /w Spring Security OAuth

43 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 44: Microservices /w Spring Security OAuth

44 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

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

Page 45: Microservices /w Spring Security OAuth

45 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

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

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

Page 46: Microservices /w Spring Security OAuth

46 Copyright©2016 NTT corp. All Rights Reserved.

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

EurekaとSpring Security OAuth

認可サーバ 認可サーバ

クライアント

Page 47: Microservices /w 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

Page 48: Microservices /w Spring Security OAuth

48 Copyright©2016 NTT corp. All Rights Reserved.

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

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

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

まとめ