web-dev-qa-db-ja.com

Spring SecurityとABAC(属性ベースのアクセス制御)

中規模のビジネスアプリがあり、Spring Securityの役割と権限(RBAC)を多用し、特定のインスタンスの役割のオンとオフを切り替えたり、@ PreAuthorizeタグ内のSpELにルールを隠したりしています。

私たちが実際に実装したものだと思います(それがABACであることを知らずに)。 XACMLは非常に複雑で肥大化しているように見えるので、ここでの答えには熱心ではありません。

コンテキストによってSpring Securityの役割を変更する方法は?

XACMLなしで軽量のABAC実装を行った人はいますか?ドメインオブジェクトは@PreAuthorize(WRITE)などを実行し、承認ポリシーはそれから切り離されるため、関心の分離が得られることを期待しています。

私が読んだことから、ABACの基本原則は非常に単純です。アクション(パーミッションと非常によく似ています)と、現在のプリンシパルが特定のサブジェクトに対してそのパーミッションを持っているかどうかを解決するメカニズムがあります。

私はAccessDecisionVoterがおおよそ正しい種類のインターフェースであることを知っていますが、それが許可に投票することを意図したものではないと思います。ただし、そのようなインスタンスを使用して承認ポリシーを実装することは非常に魅力的です。

とりとめのない質問でごめんなさい!基本的に私はABACに興味がありますが、自家醸造は避けたいのですが、セスナが必要なときにXACMLがジャンボジェット機であるか心配しています。

13
salk31

あなたが目指していることは2つあるようです。

  1. 外部化された承認。アクセス制御ポリシーをコードから(または少なくともコードの中央の場所に移動し、Springコード全体に分散しないように)移動します。
  2. 役割や権限よりも豊富な属性を使用する属性ベースの承認

(2)あなたがやりたいと言っていること、「現在の校長がその許可を持っているかどうかを解決するための行動とメカニズム」は、私の本ではまだRBACであるため、私にはよくわかりません。アクセス許可の決定に基づく必要がある他の条件はありますか?ユーザーの場所、時刻、データベース内の特定のデータの値、操作対象のリソースのプロパティなど。もしそうなら、私たちはABACの世界に迷い込んでいます。いずれにせよ、役割は1つの属性にすぎないため、RBACはABACのサブセットであると言えます。

ここで、(1)の場合、一般的なパターンは、最初に承認エンジンを一元化し、Springアノテーションを使用してこのauthzを呼び出すことです。アクセス決定のためのエンジン。ここでは2つの選択肢があります。

  • 埋め込まれた認証。エンジン:ライブラリがエンジンを実装し、Java関数と同じようにコードによって呼び出されます。XACMLエンジンの場合もあれば、独自のRBAC/ABAC実装の場合もあります。
  • ネットワークサービスとして:ネットワークベースの(マイクロ)サービスがアクセス制御の決定に関する質問に答えます。 XACMLエンジンの場合もあれば、独自のRBAC/ABAC実装の場合もあります。

Springベースのコードを取得してこのauthzを呼び出すため。エンジン、1つのアプローチは、独自のSpringSecurity有権者を作成することです。私がはるかに簡単だと思った別の方法は、既存の@ PreAuthorize、@ PostAuthorize、@ PreFilter、@ PostFiler、sec:authorizeタグ、さらにはintercept-urlから呼び出すことができる独自のSpring式言語ベースの式を作成することです。条件。

これは、私が Spring Security XACML PEP SDK で作業したときに使用したものです。アクセス決定ポリシーまたは要求/応答通信にXACMLを使用しないことにした場合でも、このアプローチは同様にうまく機能するはずです。

13
Srijith Nair

XACMLを使用しない非常に優れたアプローチはここにあります。それは基本的にあなたが望んでいたものです。 XACMLを実装しないABACの軽量アプローチ。 https://dzone.com/articles/simple-attribute-based-access-control-with-spring

1
Aceonline