レコードへのアクセスの制御
学習の目的
この単元を完了すると、次のことができるようになります。
- レコードへのアクセスを制御する 4 種類の方法を挙げる。
- 4 種類あるレコードレベルのセキュリティコントロールを使用する状況をそれぞれ説明する。
- さまざまなレコードコントロールがどのように連携し合うか説明する。
- 組織の共有設定を実行してレコードへのアクセスを制御する。
レコードレベルセキュリティ
データアクセスを厳密に制御するには、特定のユーザーに特定のオブジェクトの特定の項目の参照を許可した上で、ユーザーが参照可能なレコードを個別に制限します。
レコードアクセス権により、プロファイルでアクセス権が付与されている各オブジェクトのうち、ユーザーが参照および編集できる個別のレコードが決まります。まず、次の点を自問します。
- ユーザーがアクセスする必要があるのは、すべてのレコードか、それともサブセットのみか?
- サブセットの場合、ユーザーがアクセスできるかどうかを決定するルールは何か?
サンプルの社員募集アプリケーションで、採用担当者に必要なオブジェクトレベルの権限を付与するために、Recruiter という新しいプロファイルを作成するとします。採用関連のオブジェクトを削除する機能を制限して、採用担当者がこれらのオブジェクトを削除できないようにします。ただし、採用担当者に採用オブジェクトを作成、参照、編集する権限を付与しても、必ずしも採用担当者が採用オブジェクトのすべてのレコードを参照または編集できるわけではありません。それは、次の 2 つの重要な概念があるためです。
- レコードに対する権限は常に、オブジェクトレベル、項目レベル、レコードレベルの権限を組み合わせて評価される。
- オブジェクトレベルの権限とレコードレベルの権限が矛盾する場合は、制限が厳しい方の設定が優先される。
つまり、プロファイルに採用オブジェクトを作成、参照、編集する権限を付与したとしても、さらに厳しい制限が個々の採用レコードのレコードレベルの権限に課されていた場合は、それらが採用担当者のアクセス権を定義するルールとなります。ただし、レコードレベルの権限ではアクセス権が階層状に拡大されているため、ユーザーのアクセス権レベルを知るには、従っているレコードレベルの権限を把握することが重要です。
レコードレベルのアクセス権は、次の 4 つの方法で制御できます。リストの下に行くほどアクセス権が大きくなります。まず、組織の共有設定を使用して制限の最も厳しいレベルにデータをロックダウンした上で、他のレコードレベルセキュリティツールを使用して、必要に応じて選択したユーザーにアクセス権を付与します。
-
組織の共有設定 — 相互のレコードに対するユーザーのデフォルトのアクセスレベルを指定します。
-
ロール階層 — マネージャーには常にその部下と同じレコードへのアクセス権を付与します。階層の各ロールは、ユーザーまたはユーザーグループが必要とするデータアクセスのレベルを表します。
-
共有ルール — 特定のユーザーグループに対して組織の共有設定の例外を自動的に作成して、所有していないレコードや通常は参照できないレコードへのアクセス権を付与します。
-
共有の直接設定 — レコード所有者が、レコードへのアクセス権がないと思われるユーザーに参照および編集権限を付与できるようにします。
各種データの表示およびアクセスは、次の基本原則に従って、上記のセキュリティコントロール間の連携により決定されます。
- オブジェクトに対するユーザーのベースラインの権限は、プロファイルによって決定される。
- ユーザーに権限セットが割り当てられている場合は、権限セットにプロファイルを組み合わせてベースラインの権限が設定される。
- ユーザーが所有しないレコードに対するアクセス権は、まず組織の共有設定によって設定される。
- 組織の共有設定が [公開/参照・更新可能] より低いものである場合は、ロール階層を使用して特定のロールにアクセスを許可できる。
- 共有ルールを使用して、追加のユーザーグループに対してアクセス権を拡張できる。
- 各レコード所有者はレコードの [共有] ボタンを使用して、個別のレコードを直接他のユーザーと共有できる。
プロファイルと権限セットを使用してオブジェクトレベルおよび項目レベルのアクセス権を設定する方法についてはすでに説明しました。次に、各種のレコードレベルのセキュリティコントロールについて詳述します。
組織の共有設定
組織の共有設定では、制限が最も厳しいユーザーに付与されるベースラインのアクセス権を指定します。組織の共有設定を使用してデータをロックダウンした上で、他のレコードレベルセキュリティおよび共有ツール (ロール階層、共有ルール、共有の直接設定) を使用して、必要に応じて他のユーザーにデータを開放します。
オブジェクト権限は、オブジェクトの全レコードに対するベースラインのアクセスレベルを決定します。組織の共有設定は、ユーザーが所有していないレコードに対するこれらの権限を変更します。組織の共有設定は、オブジェクトの種別ごとに個別に設定できます。
組織の共有設定によって、オブジェクト権限で付与されるレベルを超えるアクセス権をユーザーに付与することはできません。
アプリケーションに必要な組織の共有設定を決定するには、オブジェクトごとに次のような自問を立てます。
- このオブジェクトで最も制限されたユーザーは誰か?
- このオブジェクトにこのユーザーに閲覧を許可しないインスタンスがあるか?
- このオブジェクトにこのユーザーに編集を許可しないインスタンスがあるか?
答えに応じて、オブジェクトの共有モデルを次の設定のいずれかにできます。
非公開
レコードの所有者と階層内でそのロールの上位にあるユーザーのみがレコードに対して参照、編集、およびレポートを実行できます。
公開/参照のみ
すべてのユーザーはレコードに対して参照とレポートを実行できますが、レコードの所有者と階層内でそのロールの上位にあるユーザーのみがそのレコードを編集できます。
公開/参照・更新可能
すべてのユーザーがレコードすべてに対して参照、編集、およびレポートを実行できます。
親レコードに連動
ユーザーは、レコードに対して参照、編集、削除を実行できます。この操作ができるかどうかは、ユーザーがそのレコードが属するオブジェクトに対して同様の操作ができるかどうかに基づいています。
オブジェクトの組織の共有設定が [非公開] または [公開/参照のみ] の場合、システム管理者は、ロール階層を設定するか共有ルールを定義することで、ユーザーにレコードに対する追加のアクセス権を付与できます。共有ルールは、追加のアクセス権を付与するためにのみ使用できます。組織の共有設定によって最初に定められた範囲を越えてレコードへのアクセス権を制限するために、共有ルールを使用することはできません。
例として、社員募集アプリケーションの Position (職種) オブジェクトについて上記の質問の答えを考えてみましょう。
このオブジェクトで最も制限されたユーザーは誰か?
標準従業員プロファイルのメンバー。許可されるのは職種の参照のみです。
このオブジェクトにこのユーザーに閲覧を許可しないインスタンスがあるか?
いいえ。標準従業員には、給与の最小値と最大値は表示されませんが、すべての職種レコードを参照できます。
このオブジェクトにこのユーザーに編集を許可しないインスタンスがあるか?
はい。標準従業員は、職種レコードを編集できません。
3 つ目の質問への答えが「はい」ですから、Position (職種) オブジェクトの共有モデルは [Public Read Only (公開/参照のみ)] に設定する必要があります。他の採用オブジェクトについても同じ作業を繰り返すことによって、オブジェクトに適した組織の共有設定を簡単に決定できます。Standard Employee (標準従業員) プロファイルは、各オブジェクトに対する制限が最も厳しいユーザーです。応募者レコード、求人応募レコード、審査レコードを特定の従業員が参照できないようにします。そのため、Candidate (候補者) オブジェクト、Job Application (求人応募) オブジェクト、Review (審査) オブジェクトの共有モデルはすべて [非公開] に設定する必要があります。
組織の共有設定の設定
組織の共有設定は、制限が最も厳しいユーザーに付与されるベースラインのアクセス権を指定します。
- [設定] から、[クイック検索] ボックスに「共有設定」と入力し、[共有設定] を選択します。
- [組織の共有設定] 領域で [編集] をクリックします。一部の標準オブジェクトは、組織の共有設定の異なるオプションを使用します。カスタムオブジェクトの組織の共有設定のオプションには、[非公開]、[公開/参照のみ]、[公開/参照・更新可能] があります。
- オブジェクトごとに、デフォルトの内部アクセス権とデフォルトの外部アクセス権を選択します。
- 階層を使用した自動アクセス権を無効にするには、デフォルトアクセス設定が [親レコードに連動] ではない [階層を使用したアクセス許可] をオフにします。
デフォルトでは、ロール階層に従って、階層内でレコード所有者より上位のユーザーに、そのレコードへのアクセス権が自動的に付与されます。オブジェクトを非公開に設定すると、レコードの所有者とロール階層内でそのロールより上位のユーザーに対してのみレコードが表示されるようになります。カスタムオブジェクトについて、階層内でレコード所有者よりも上位のユーザーのレコードアクセス権を無効にするには、[階層を使用したアクセス許可] チェックボックスを使用します。カスタムオブジェクトのこのチェックボックスの選択を解除すると、レコード所有者と組織の共有設定によってアクセスを許可されたユーザーのみがそのレコードにアクセスできるようになります。
[階層を使用したアクセス許可] がオフになっている場合でも、「すべての参照」や「すべての編集」オブジェクト権限、「すべてのデータの参照」や「すべてのデータの編集」システム権限などを持っているユーザーは、自分が所有していないレコードにもアクセスできます。
組織の共有設定を使用してデータをロックダウンした場合に、一部のユーザーにとっては制限が厳しすぎることがあります。その場合は、他のレコードレベルのセキュリティコントロール (ロール階層、共有ルール、共有の直接設定) を使用して、必要に応じて特定の従業員のみにレコードへのアクセスを許可できます。
もうひとこと...
Apex による共有管理により、開発者はプログラムでカスタムオブジェクトに関連付けられているレコードを共有できます。Apex による共有管理を使用してカスタムオブジェクトを共有した場合は「すべてのデータの編集」権限を持つユーザーのみがそのカスタムオブジェクトのレコードに対する共有を追加または変更できます。共有アクセス権は、レコード所有者が変わってもそのままです。詳細は、「Apex 共有」を参照してください。
リソース