マイクロサービス認証認可をAWSサーバーレスで開発した話
はじめに
こんにちは、エアークローゼットでエンジニアをしているNghiaです。
この記事は、エアークローゼット Advent Calendar 2023 の8日目の記事です!よろしくお願いします!
背景
エアークローゼットではイベント駆動アーキテクチャをやっています。システムがモノリシック(monolithic)からマイクロサービスに変化されています。マイクロサービスアーキテクチャを採用したシステムでは、各サービスが正しくアクセス制御を実施できる状態を作るのが難しく感じます。
モノリシックなサービスの場合、外向けのAPIと、そのAPIが触れるリソースは一元的に実装・管理されているため、どの API がどのリソースを触れるか、そのAPI(リソース)にアクセスするためにどのような権限が必要かは比較的に設計しやすいと思います。
またリクエストに付随しているアクセストークンに対して、検証および情報取得は1 回のみ実施すれば、サービス内すべての API がその結果を得られるため、API の実装者は比較的容易にアクセス制御を実装できると考えます。
一方で、マイクロサービスアーキテクチャにおいては、外向けの API を提供するマイクロサービスがすべてのリソースを持っているわけではなく、リソースは複数のマイクロサービスに分散されています。ひとつのリクエストを処理するため、複数のマイクロサービス間で通信が発生し、処理を行い、結果をまとめて返すシナリオが多々あります。
マイクロサービス認証認可の難しさ
マイクロサービスアーキテクチャにおいて、システムは多くの小さなサブシステムに分割され、異なる業務と機能を担当します。各サブシステムも認証と認可が必要であり、モノリシックアーキテクチャの手法で処理すると以下の問題が発生します:
各サービスは自身の認証と認可を実行する必要があります。同じライブラリを各サービスで使用できますが、異なる言語のプラットフォームで共有ライブラリをメンテナンスするコストは非常に高いです。
各サービスは主に自分の業務に焦点を当てるべきであり、認可ロジックを追加することは開発速度を低下させ、サービスの複雑さを増加させます。
サービスはさまざまなアプリケーションや異なる利用対象からアクセスされます。これにはユーザー、ハードウェアデバイス、サードパーティ、クーロンタブ、または他のサービスが含まれます。異なる文脈でのアイデンティティ(識別)と権限(認可)を確立することは非常に複雑です。
対応方針
すべてのリクエストはAPIゲートウェイを通過する際に認証されます。
APIゲートウェイは、すべてのリクエストが識別子を送信するためにトークンを必要とするようにします。
APIゲートウェイは、中央の認証サーバーを介してポリシーを確認して有効かどうかを確認します。
マイクロサービスは認証および権限のレイヤーを実行せず、内部ネットワーク内で自由にアクセスできます。
このモデルは、認証および権限を特定のサービスに配置する点でモノリシックアーキテクチャと類似しています。開発とメンテナンスコストが少なくるメリットがあります。
AWSサーバーレスで実現
サーバー管理コストや運用の手間を削減するために、AWSサーバーレスを採用しています。
cognitoでクライアント情報と権限を管理します。
クライアントがログインする際に、cognito(前述した中央の認証サーバー)によりIAMポリシーを付与されます。
IAMアクセス許可によりAPIゲートウェイへのアクセスを制御します。
各マイクロサービスはECSにデプロイされて、HTTP統合でAPIゲートウェイに繋がります。
cognitoによりIAMポリシー付与フロー
このフローの詳細は次の通りです:
クライアントはユーザープールに対して認証を行います。
ユーザープールはクライアントに3つのJWTトークン(Id、Access、およびRefresh)を割り当てます。
Id JWTはアイデンティティプールに渡され、JWTクレームを介して選択されたロールが割り当てられます。その後、ユーザーはグループにマップされたIAMロールに基づいて権限を持つIAM一時資格情報を受け取ります。
ユーザーはその後、IAMポリシーによって指定される特権に基づいてAPIゲートウェイに対して呼び出しを行うことができます。
サーバーレスのインフラ設定は全部CDKで管理されています。
まとめ
今回は、 マイクロサービス間通信をよりセキュアにするための取り組みを紹介しました。エアクロでは、すべてのマイクロサービスが導入したわけではありませんので、これからも各マイクロサービスへの導入支援しつつ、仕組み自体をよりセキュアで利用しやすいものに進化させたいと考えていますので、もしご興味があれば、ぜひ参加してください。
エアクロでは、エンジニアに多くの新しい経験をさせていただきますので、皆様もぜひぜひ!->採用サイト
さいごに
最後までご覧いただきありがとうございました🙇♂️
エアークローゼット Advent Calendar 2023はまだ続きますので、ぜひ他のエンジニア, デザイナー, PMの記事もご覧いただければと思います。
次はエンジニアの@Cut_programさんです!
よろしくお願いします!