View
1.433
Download
3
Category
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