【ServiceNow】Xanaduリリース新機能!Deny-Unless ACLを検証してみた!

ServiceNow

Xanaduリリース新機能のDeny-Unless ACLについて検証します。

Deny-Unless ACLとは?

Deny-Unless ACLとはXanaduリリースから登場した新機能です。

今まではホワイトリスト型のアクセス許可のみでしたが、ブラックリスト型のアクセス制御を提供します。

これまでのホワイトリスト型のACLはAllow If ACLという機能になっています。

以下はServiceNow公式ドキュメント記載の説明です。

「次の場合を除き却下 (Deny-Unless)」ACL の詳細について説明します。

「次の場合を除き却下 (Deny-Unless)」ACL は「deny-unless」アプローチで評価されます。ACL は却下されないユーザーを定義します。別の言い方をすると、ロール、条件、およびスクリプト要件が満たされない限り、ユーザーはアクセスを拒否されます。

重要: 「次の場合を除き却下 (Deny-Unless)」ACL は、ACL 評価で「次の場合に許可 (Allow-If)」ACL より優先されます。

ServiceNow公式ドキュメントより引用
https://www.servicenow.com/docs/ja-JP/bundle/xanadu-platform-security/page/administer/contextual-security/concept/acl-denial-behavior.html

実際にAllow If ACLとDeny-Unless ACLでどのような挙動の違いがあるかを検証してみます。

Deny-Unless ACLの検証

今回はDeny-ACLの挙動を理解するために、まずは①Allow If ACLのみを設定した状態でデータがどのように参照できるかを検証し、次に②Deny-Unless ACLのみの設定での参照制御を検証します。

最後に③Allow If ACLとDeny-Unless ACLを両方作成した際の挙動を確認します。

検証の準備

検証の準備
  • 検証用のユーザーを作成

    A・B Userを作成し、それぞれA・B Roleを付与します。

  • ACLを設定するためのテーブルを作成

    今回はTaskテーブルを拡張し、「申請」テーブルを作成しました。

  • 申請テーブルにデータを作成

    申請テーブルに、A・B Userをアサイン先とするレコードを一つずつ作成します。

検証①Allow If ACLのみを作成し、A・Bロールを保有する全てのユーザーに参照権限を付与

ACLの設定

A Role, B Roleを保有するユーザーが全てのレコードを参照できるようAllow If ACLを作成します。

Decision TypeNameOperationRequires roleData Condition
Allow If申請.NoneReadA Role, B Role

検証結果①

こちらは通常通りA User, B Userともに申請テーブルの全てのレコードが参照可能となります。

実際の画面ではこのように見えています。

検証②Deny-Unless ACLのみを作成し、自分にアサインされているレコード以外参照不可とする

次にDeny-Unless ACL単独ではどのような挙動をするのかを確認してみます。

ACLの設定

次に、Deny-Unless ACLを作成し、アサイン先が自分以外のレコードが参照不可となるよう設定します。

Decision TypeNameOperationRequires roleData Condition
Deny-Unless申請.NoneReadAssigned to is (dynamic) Me

検証結果②

A User, B Userともにテーブル自体の参照ができなくなってしまいました。

それぞれのユーザーで画面は以下のように見えています。

どうやら、レコードを参照するためにはDeny-Unless ACLだけでなく、Allow If ACLでアクセス許可をしてあげる必要があるみたいです。

検証③Deny-Unless ACLとAllow If ACLを作成し、自分にアサインされているレコード以外参照不可とする

最後に、Allow If ACLとDeny-Unless ACLを組み合わせて、どのような挙動が実現できるかを確認します。

ACLの設定

Allow If ACLを作成し、A Role, B Roleを持つユーザーに申請テーブルの全てのレコードへの参照権限を付与した上で、自分にアサインされているレコード以外参照不可とするDeny-Unless ACLを作成します。

Decision TypeNameOperationRequires roleData Condition
Deny-Unless申請.NoneReadAssigned to is (dynamic) Me
Allow If申請.NoneReadA Role, B Role

検証結果③

こちらは、自分にアサインされているレコードのみが参照可能となりました。

実際の見え方は以下のようになっています。

まとめ

ドキュメントにも記載がありましたが、検証結果よりDeny-Unless ACLはAllow If ACLよりも優先的に評価されます。

Deny-Unless ACLによってアクセスが拒否されているレコードを除外し、残りのレコードに対してAllow If ACLでアクセスが許可されているか判断をしているようです。

評価の順番を図にすると以下のようになります。

また、Deny-Unless ACLがAllow If ACLよりも優先的に評価されるため、たとえAllow If ACLでアクセスが許可されていても、Deny-Unless ACLでアクセスが拒否されていればユーザーは参照することができません。

以下のベン図では赤枠で囲った範囲のみ参照可能となります。

今回の検証で分かったDeny-Unless ACLのポイントは以下2点となります。

①Deny-Unless ACLはあくまでもアクセスを拒否するための設定であり、Allow If ACLでアクセス許可を与えない限りユーザーはデータを参照することができない。

②Deny-Unless ACLはAllow If ACLよりも優先的に評価される。

実際にどのように活用すべきか、どのようなユースケースに適用可能かはもう少し触りながら検討していきます。

読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました