🤔

Sitecore 「継承アクセス権の拒否(Break Inheritance)」の利用

2022/03/17に公開

サイトコアではアイテムの読み取り権限を設定する際に、主に

  • 読み取り拒否(Explicit Deny)
  • 親から子アイテムへのアクセス件の継承の拒否(Break Inheritance)

のいずれかを利用して、特定のロールからの特定のアイテムへのアクセスを拒否できます。

結論から言うと、アクセス権の拒否設定を行う際はまず「親から子アイテムへのアクセス件の継承の拒否(Break Inheritance)」が利用できるかどうかを最初に検討してみて下さい。理由は「読み取り拒否(Explicit Deny)」を使ってアクセス権拒否を行った場合に、サイトコアの「拒否は許可を上書きする」というアクセス権評価ルールによって、拒否を含んだ複数のロールをアサインした場合に、意図しないセキュリティ設定となってしまう恐れがあるためです。

https://doc.sitecore.com/xp/ja/developers/101/platform-administration-and-architecture/assigning-access-rights.html

以下、例を使って解説していきます。

目的

新しいサイトでは、各リージョンごとにフォルダを作成(Australia,Japan)し、各リージョンのアイテムへは、それぞれのリージョンのManagerロールをアサインされたユーザーのみがアクセスできるようにする。

ロールの設定

  • sitecore\Australia Manager
  • sitecore\Japan Manager

アイテムの設定

  • Home
    • Australia
      • Item1
    • Japan
      • Item1

セキュリティの設定(Explicit Denyの場合)

Australia Managerロールは、Australiaフォルダを読み取り可とし、Japanフォルダへのアクセスを拒否する。

同様に、Japan Managerロールは、Japanフォルダを読み取り可とし、Australiaフォルダへのアクセスを拒否する。

結果

Access Viewerで各ロールのアクセス権限を確認します。

Australia ManagerはJapanフォルダへのアクセス権限を持っていません。

Japan ManagerはAustraliaフォルダへのアクセス権限を持っていません。

ここまでは「読み取り拒否(Explicit Deny)」を利用して、アクセス権をコントロールしてみました。ここまでは特に問題はありません。

新しい要件 - APAC Managerロールの作成

新しい要件として、「APAC Supervisor」ユーザーが必要になりました。このユーザーはスーパーユーザーで、APACリージョン全てのフォルダ(Australia,Japan)へのアクセスを許可したいです。APAC Supervisorユーザーに対して、先程作成した2つのロール(Australia Manager,Japan Manager)の両方をアサインすることで、Supervisorユーザーが2つのリージョンフォルダとその配下のアイテム全てへアクセスできるように設定します。

ユーザーとロールの設定

  • APAC Supervisorユーザー
    • Japan Manager
    • Australia Manager

結果

Access ViewerでAPAC Supervisorユーザーのアクセス権限を確認します。

APAC Supervisorは、AustraliaとJapan両方のフォルダへのアクセス権限を失ってしまっています。

この理由は、一般的に複数のロールのアサインメントによりアクセス権の競合が発生した場合に、「拒否は許可を上書きする」というアクセス権限評価ルールが適用されるためです。今回の場合、各ロールにおける各リージョンへの「読み取り許可」が、他方の「読み取り拒否」によって上書きされてしまうため、結果としてAPAC Supervisorは両方のフォルダへのアクセス権を失ってしまいます。

継承アクセスの拒否(Break Inheritance)を利用する

アクセス権の競合によって本来の意図とは別の設定がされてしまうことを防ぐには、ロールのセキュリティ設定を「Explicit Deny」ではなく「Break Inheritance」に変更する必要があります。

セキュリティの設定(Break Inheritanceの場合)

Australia Managerロールは、Japanフォルダが「親アイテムのアクセス権を継承する」ことを拒否するように設定する。

同様に、Japan Managerロールは、Australiaフォルダが「親アイテムのアクセス権を継承する」ことを拒否するように設定する。

結果

Security Viewerで各ロールのアクセス権限を確認します。

Australia ManagerはJapanフォルダへのアクセス権限を持っていません。

Japan ManagerはAustraliaフォルダへのアクセス権限を持っていません。

これは、各ロールが「親アイテムのアクセス件(読み取り可)を継承する」ことを拒否するような設定になっているため、Explicit Denyのときと同等の効果が得られています。

次はAPAC Supervisorユーザーの権限設定を確認します。

今回はちゃんとAPAC Supervisorが両方のフォルダにアクセスできるようになっています。

まとめ

アイテムへのアクセス権を拒否するためにはまず最初に「親アイテムのアクセス権継承の拒否(Break Inheritance)」を第一オプションとして考えて下さい。こうすることで、複数のロールをアサインする場合に、想定外の事態(許可の上書き)が起こることを防ぐことができます。

レファレンス

https://doc.sitecore.com/xp/ja/developers/101/platform-administration-and-architecture/assigning-access-rights.html
https://haramizu.com/blog/2021/08/25/access-viewer2

Discussion