Backend Engineer’s meetup ~マイクロサービスにおける認証認可基盤
マイクロサービスの内部通信における認証について
@pospome
資料
speakerdeck.com
メルペイ認証チーム(メルカリ、メルペイ)
チームに関してはブログあり
では何をしている
OIDC認可の仕組み→今日は説明しない
内部マイクロサービス間の通信認証→こちらを説明
メルカリアプリ Mercari API直接アクセスするパターン
マイクロサービスは Gatewayを介してAuthoriytServiceを利用
AtuhorityServiceは何をしている?
リクエストの検証→アクセストークンを検証 AuthoriytServiceで全てのサービスを検証できてない歴史的経緯
各サービスはトークンで検証
内部トークンと外部トークンは別物らしい
JWTを採用
トークン検証 gRPCのintercepter
gorouting
subjectID
文字列type value 複数のID体系を一つの構成で
メルカリを受け取る場合、typeをチェックして弾く
パース処理は、SDKで実装
内部アクセス制限
内部スコープ 各サービスがもつリソースに持つ
外部スコープをそのまま内部スコープにセットすることができる
AuthoriytServiceでauthトークンを検証したあと内部トークンを生成する
外部、内部スコープが一致しない場合。
内部スコープ→リソースベース
内部トークンのメリット
トークンを1種にできる 直接内部リソースにアクセスできない
外部のアクセストークンを短く設定出来る
できてないこと沢山ある
パネルディスカッション
質問
→関連するマイクロサービスが多ければ多いほど、関わるものが多くなる。ユーザからはどのマイクロ使うかわからないので。ユースケース毎にマッピングテーブルを持たした
→有効期限、保存していない。可用性→サーバを複数台用意して分散しているけど特別なことはしていない
→マイクロサービス間の認証はやっていない。導入しようとは検討している。originのリクエスト権限の範囲で処理できる機能を制限している。
- 外部スコープと内部スコープの管理→各部門が申請して管理している?監査している?
→まだそこは全然考えていない。そのフェーズにはいってない。課題として考えている
→JWTだとデータ量が多くなるからやめたい→CWTの機運
- アカウントの管理は対象外、アカウントの認証はどこでしている?
→リクエストについているアクセストークンで判断。ログイン部分はマイクロサービス化していない
- 1リクエスト1トークン可用性、性能面で意識したこと
→レイテンシ、そこまで気にしない。モノリスにするのが一番早いので考えない。必ず通るとこはなるべく早くするように心がけている。ローカルメモリで完結。memchacheとか使いたいがそこまではしてない
→すごく短く。どんなけ待つ必要があるか目安
→アカウントの種類が増えると増やすけど、アカウントそんな増えない。マスターデータが増えるタイミングは自動化したい
→ある。内部トークンを取得して実施している。秘密鍵を利用している→スコープは現状紐づけていない
- AuthoriytServiceだけでチェックで十分では?
→内部サービス間の通信は必ず大丈夫と認識していないのでそうしている
→pubsub非同期で扱わないといけない時、有効期限が切れた時どうするのか。解決策は特に無い
→内部通信の技術的な課題をどう解決するか?リソースが足りないPOもやっているので精神的に辛い
→複雑な考え方が社内で通じるのか不安だったが、使われて良かった。
→チームが四人しかいない。人手が足りない。DCまたいで通信が切れたら大障害になっちゃう。認可サーバー経験が豊富で無いのでセキュリティ大丈夫か不安