Cerbosとは #
Cerbosは、ソフトウェアのためのアクセス制御システムで、アプリケーションリソースに対するコンテキスト対応のアクセス制御ポリシーを簡単に実装できるようにするツールです。YAMLでアクセスルールを記述し、APIを通じてアクセス制御を実行します。
主要な概念 #
ポリシー決定ポイント(PDP) #
Cerbosは、ポリシー決定ポイント(PDP)として機能します。アプリケーションからのリクエストを受け取り、定義されたポリシーに基づいてアクセス決定を行い、結果を返します。
リソース #
Cerbosでは、保護したいオブジェクトを「リソース」と呼びます。リソースには種類(kind)とID、そして属性(attributes)があります。例えば:
- 種類:
document
- ID:
doc123
- 属性:
owner: "john"
,status: "published"
,department: "marketing"
プリンシパル #
アクセスを要求するエンティティ(通常はユーザー)を「プリンシパル」と呼びます。プリンシパルにはID、ロール、属性があります:
- ID:
john
- ロール:
["user", "editor"]
- 属性:
department: "marketing"
,region: "europe"
アクション #
リソースに対して実行できる操作を「アクション」と呼びます。例えば:
view
- リソースを表示するedit
- リソースを編集するdelete
- リソースを削除するshare
- リソースを共有する
ポリシー #
ポリシーは、リソースに対するアクセス制御ルールを定義します。Cerbosでは主に以下の種類のポリシーがあります:
- リソースポリシー - 特定の種類のリソースに対するアクセスルールを定義
- プリンシパルポリシー - 特定のプリンシパルに対するアクセスルールを定義
- 派生ロール - リソースやプリンシパルの属性に基づいて動的にロールを割り当てるルールを定義
効果(Effect) #
ポリシー評価の結果として、アクションに対して以下の効果が返されます:
EFFECT_ALLOW
- アクションが許可されるEFFECT_DENY
- アクションが拒否される
Cerbosの仕組み #
- アプリケーションがCerbos PDPにリクエストを送信します。リクエストには、プリンシパル情報、リソース情報、実行したいアクションが含まれます。
- Cerbos PDPは、定義されたポリシーに基づいてリクエストを評価します。
- 評価結果(許可または拒否)がアプリケーションに返されます。
- アプリケーションは、結果に基づいてアクションを許可または拒否します。
Cerbosのメリット #
- コードからポリシーを分離 - アクセス制御ロジックをアプリケーションコードから分離し、ポリシーとして定義できます。
- コンテキスト対応の決定 - リソースとプリンシパルの属性に基づいて、きめ細かいアクセス制御決定を行えます。
- 集中管理 - すべてのポリシーを一元管理でき、一貫性のあるアクセス制御を実現できます。
- 言語に依存しない - 任意のプログラミング言語で書かれたアプリケーションと統合できます。
- 監査とコンプライアンス - アクセス決定の監査証跡を提供し、コンプライアンス要件を満たすのに役立ちます。
サービスとしての認可(Authorization as a Service) #
Cerbosはライブラリではなくサービスとして設計されており、以下の利点があります:
- プログラミング言語やアーキテクチャに関係なく、アプリケーションスタックのどの部分からでも権限チェックを実行可能
- アプリケーションの再コンパイルや再デプロイなしにポリシー更新が即時反映される
- 現代のネットワークスタックでは通信オーバーヘッドは実質的に無視できるレベル
- 軽量でステートレスな設計により、高負荷にも容易に対応可能
マイクロサービスアーキテクチャとの親和性 #
多くの成功したシステムがスケールする鍵となる要素の一つは、各コンポーネントがシステムの正確な要求に合わせてスケールできるマイクロサービスアーキテクチャの採用です。Cerbosはスタンドアロンサービスとして構築されており、このようなアーキテクチャに望ましい特性をいくつか備えています:
- 認可チェックはシステムやアプリケーションスタックのどの部分からでも行うことができます。複雑なルール複製ロジックは不要で、Cerbosへの単一の呼び出しでリクエストに対する単純なALLOWまたはDENY応答が返されます。
- すべてのポリシー決定はCerbosインスタンスに集中しているため、監査ログを収集する単一の場所があります。
- CerbosインスタンスはKubernetesサイドカーなど、他のサービスと一緒にスケールできます。
[出典: https://docs.cerbos.dev/cerbos/latest/index.html]