8

現在、プロジェクト管理ソフトウェアを開発中です。また、セキュリティを実装するための正しいアプローチを決定するのに苦労しています。私たちは ACL と RBAC の両方を見てきましたが、特定の理由から、少なくとも両方の組み合わせが必要であることはすでにかなり確信しています。しかし、どちらの世界にも適切な解決策がない問題がいくつかあります。説明させてください:

次のエンティティがあるとします。

  1. さまざまなロールを持つユーザー、つまり
    • プロジェクトリーダー
    • ワーカー
    • 管理者
  2. プロジェクト
  3. 割り当てられたユーザー
  4. プロジェクトのタスク

ここで、次のルールを表現する必要があります:ロールWorkerを持つユーザーは、割り当てられたプロジェクトに関連するTaskのみを表示できます。

これにより、ユーザーはリスト全体の一部のタスクのみを表示できるようになります。

RBAC を使用して、実際に Task を読み取る権限をRolesに付与します。ただし、特定のエンティティが関与しているため、条件は適用されません。ACL を使用することもできますが、ACL エントリを要件と一致させておくことの悪夢を恐れています (ユーザーは変更でき、役割は変更でき、新しいタスクを導入でき、正しいエントリを取得する必要があり、これも複雑です)。

もちろん、特定のプロジェクト ( ) を表示するときに特定のクエリが存在する可能性がありますが、これは「現在のすべてのタスクWHERE project_id = 123の表示」には役立ちません。この場合、基本的にすべてのタスクを表示することができますが、ACL をチェックする必要があります。すべてのエントリ。

また、「現在のユーザーが表示できる最初の 25 個のタスクを取得する」などのことを、DB からすべてのタスクをロードせずに、ACL に基づいてフィルタリングする、つまりページネーションを処理することなく確実に行うにはどうすればよいですか。

4

2 に答える 2

6

ACL と RBAC の先を見据え、属性ベースのアクセス制御 (ABAC - こちらの NIST のガイドを参照) を検討する必要があります。Gartner は、この領域を「外部化された承認管理」と呼んでいます。

ABAC を使用すると、ユーザーが誰であるかだけでなく、ユーザーが何をしたいのか、いつ、どこで、なぜ、どのように行うのかを考慮したルールを簡単に表現できます。属性を使用して承認を定義すると、XACML を使用してポリシーを実装できます。XACMLは OASIS 標準です (SAML と同様)。

XACML を使用すると、質問できる API を取得できます。たとえば、アリスはこのレコードを表示できますか? しかし、あなたの場合、データベースからレコードを除外したいので、それだけでは不十分です。そして、あなたが説明したように、適切な数の承認されたレコードが得られるまでデータベースを行ったり来たりするのではなく、クエリを最初から正しくする必要があります。XACML はテクノロジーに中立であるため、この点で特に興味深いものになります。XACML を Java、C#、およびその他の言語 (Python など) に適用できますが、XACML をさまざまなレイヤー (プレゼンテーション、API、および... データベース) に適用することもできます。逆クエリの方法で XACML をクエリして SQL ステートメントを生成し、それを使用してバックエンド データベースに関連するレコードをクエリすることができます。

  • Alice はどのレコードを表示できますか?
  • アリスは、「SELECT * FROM records WHERE location='CA'」を生成するカリフォルニアのレコードを表示できます。

HTH

于 2013-09-30T16:44:35.633 に答える
1

ええと、私はYii フレームワークとその優れた RBAC レイヤーを使用しています。最近、私は ACL にあまり詳しくありませんし、そうする必要もありませんでした。

Yii RBAC の用語では、ソリューションの鍵は「ビジネス ルール」を使用することです。ビジネスルールは、「パーミッション」または「ロール」 (Yii の用語では「認証項目」) に添付されたコードの小さなスニペットです。このコードは、特定の「権限」へのアクセスを決定する必要があるときに動的に実行されます (たとえば、「役割」に関連付けることもできます)。「問題の項目」(例のタスク) を受け取ります。特定のタスクへの実際のアクセスを決定します。より詳細な例を次に示します。

  • 次の権限が必要だとします。
    • タスクの編集 (「タスク管理者」ロールを持つすべてのユーザーに許可する必要があります)
    • 自分のタスクを編集します (このタスクを送信した人に許可する必要があります)。
  • ここで、「タスクの編集」コード セクションで、まず「タスクの編集」権限を確認します。OK の場合 - 許可します。
  • 許可されていない場合は、「自分のタスクの編集」も確認してください (else-if コンストラクトを使用)。ここで、最後に述べた許可に、「タスク」オブジェクトを受け入れ、その「作成者 ID」を「現在チェックされているユーザー ID」と比較するビズルール (=php コード) を添付する必要があります。等しい場合は true を返し、アクセスを許可する必要があることを意味します。

それは一言で言えばです。さらに興味がある場合は、公式ガイドのこのセクションを参照してください。必要に応じて、他にもたくさんのリソースがあります。

于 2012-11-27T11:09:09.587 に答える