Erweiterte Policy-Features

In diesem Abschnitt werden die Features der Policy-Sprache beschrieben, mit denen Sie granulareren Zugriff erteilen können.

Bedingungen

Als Teil einer Policy-Anweisung können Sie eine oder mehrere Bedingungen angeben, die erfüllt werden müssen, damit der Zugriff erteilt werden kann.

Jede Bedingung besteht aus einer oder mehreren vordefinierten Variablen, für die Sie Werte in der Policy-Anweisung angeben. Wenn ein Benutzer später Zugriff auf die betreffende Ressource anfordert und die Bedingung in der Policy erfüllt ist, ergibt sie true, und die Anforderung ist zulässig. Wenn die Bedingung nicht erfüllt wird, ergibt sie false, und die Anforderung ist nicht zulässig.

Es gibt zwei Variablentypen: Variablen, die für die Anforderung selbst relevant sind, und Variablen, die für die Ressource relevant sind, die in der Anforderung bearbeitet wird, auch als Ziel ("target") bezeichnet. Dem Namen der Variablen wird das Präfix request oder target gefolgt von einem Punkt vorangestellt. Beispiel: Eine Anforderungsvariable mit dem Namen request.operation gibt den angeforderten API-Vorgang an. Mit dieser Variablen können Sie eine umfassende Policy-Anweisung schreiben, aber auch eine Bedingung basierend auf dem jeweiligen API-Vorgang hinzufügen. Ein Beispiel finden Sie unter Schreiben von Objekten in Objektspeicher-Buckets durch Benutzer zulassen.

Wichtig

Beim Bedingungsabgleich wird die Groß-/Kleinschreibung nicht beachtet. Dies ist wichtig, wenn Sie Bedingungen für Ressourcentypen schreiben, bei deren Namen die Groß-/Kleinschreibung beachtet wird. Mit dem Object Storage-Service können Sie beispielsweise einen Bucket mit dem Namen "BucketA" und einen Bucket mit dem Namen "bucketA" in demselben Compartment erstellen. Wenn Sie eine Bedingung schreiben, in der "BucketA" angegeben ist, wird sie auch auf "bucketA" angewendet, weil beim Bedingungsabgleich die Groß-/Kleinschreibung nicht beachtet wird.

Variablen, die nicht auf ein Anforderungsergebnis in einer abgelehnten Anforderung anwendbar sind

Wenn die Variable auf die eingehende Anforderung nicht anwendbar ist, ergibt die Bedingung false, und die Anforderung wird abgelehnt. Beispiel: Dies sind die grundlegenden Policy-Anweisungen, mit denen Sie Benutzer für eine beliebige Gruppe hinzufügen oder entfernen können, außer für die Gruppe "Administratoren":

Allow group GroupAdmins to use users in tenancy 
 where target.group.name != 'Administrators'

Allow group GroupAdmins to use groups in tenancy 
 where target.group.name != 'Administrators'

Wenn "GroupAdmins" in der oben dargestellten Policy versuchen würde, einen allgemeinen API-Vorgang für Benutzer aufzurufen, wie ListUsers oder UpdateUser (mit dem Sie die Beschreibung des Benutzers ändern können), würde die Anforderung abgelehnt werden, auch wenn diese API-Vorgänge durch use-users abgedeckt sind. Das liegt daran, dass die oben dargestellte Policy-Anweisung für use-users auch die Variable target.group.name enthält, in der Anforderung ListUsers oder UpdateUser jedoch keine Gruppe angegeben wird. In diesen Anforderungen fehlt die Variable target.group.name, daher wird die Anforderung abgelehnt.

Wenn Sie auch Zugriff auf allgemeine Benutzer-API-Vorgänge erteilen möchten, die keine bestimmte Gruppe umfassen, benötigen Sie eine zusätzliche Anweisung, die die gewünschte Zugriffsebene erteilt, jedoch ohne die Bedingung. Beispiel: Wenn Sie Zugriff auf ListUsers erteilen möchten, benötigen Sie diese zusätzliche Anweisung:

Allow group GroupAdmins to inspect users in tenancy

Wenn Sie den Zugriff auf UpdateUser erteilen möchten, benötigen Sie diese zusätzliche Anweisung (die auch ListUsers abdeckt, da das Verb use die Funktionen des Verbs inspect beinhaltet):

Allow group GroupAdmins to use users in tenancy

Dieses allgemeine Konzept gilt auch für Gruppen (z.B. ListGroups und UpdateGroup) und alle anderen Ressourcentypen mit Zielvariablen.

Weitere Informationen zur Syntax von Bedingungen finden Sie unter Bedingungen. Eine Liste aller Variablen, die Sie in Policys verwenden können, finden Sie in den Tabellen in der Policy-Referenz.

Tagbasierte Zugriffskontrolle

Mit Bedingungen und einer Gruppe von Tagvariablen können Sie Policys schreiben, um den Geltungsbereich des Zugriffs basierend auf den Tags einzuschränken, die auf eine Ressource angewendet wurden. Der Zugriff kann basierend auf einem Tag kontrolliert werden, das in der anfordernden Ressource (der Gruppe oder dynamischen Gruppe in der Policy) oder dem Ziel der Anforderung (Ressource oder Compartment) vorhanden ist. Die tagbasierte Zugriffskontrolle bietet zusätzliche Flexibilität für Ihre Policys, indem Sie den Zugriff über Compartments, Gruppen und Ressourcen hinweg definieren können. Ausführliche Informationen zum Schreiben von Policys, um den Geltungsbereich des Zugriffs mithilfe von Tags einzuschränken, finden Sie unter Zugriff mit Tags verwalten.

Berechtigungen

Berechtigungen sind die atomaren Autorisierungseinheiten, die die Möglichkeit eines Benutzers kontrollieren, Vorgänge für Ressourcen auszuführen. Oracle definiert alle Berechtigungen in der Policy-Sprache. Wenn Sie eine Policy schreiben, mit der eine Gruppe Zugriff auf ein bestimmtes Verb und einen bestimmten Ressourcentyp erhält, erteilen Sie dieser Gruppe eigentlich Zugriff auf eine oder mehrere vordefinierte Berechtigungen. Mithilfe von Verben wird das Erteilen mehrerer zugehöriger Berechtigungen vereinfacht, die einen umfassenden Zugriff oder ein bestimmtes betriebsbedingtes Szenario abdecken. Die nächsten Abschnitte enthalten weitere Details und Beispiele.

Beziehung zu Verben

Um die Beziehung zwischen Berechtigungen und Verben zu verstehen, sehen wir uns ein Beispiel an. Mit einer Policy-Anweisung, die einer Gruppe Zugriff auf inspect volumes erteilt, erhält die Gruppe eigentlich Zugriff auf eine Berechtigung mit dem Namen "VOLUME_INSPECT" (Berechtigungen werden immer in Großbuchstaben und mit Unterstrichen geschrieben). Im Allgemeinen kann der Benutzer mit dieser Berechtigung Informationen zu Block-Volumes abrufen.

Bei den Verben inspect > read > use > manage wird die Zugriffsebene im Allgemeinen immer weiter erhöht, und die erteilten Berechtigungen sind kumulativ. In der folgenden Tabelle werden die Berechtigungen angezeigt, die jedes Verb für den Ressourcentyp volumes umfasst. Beachten Sie, dass keine zusätzlichen Berechtigungen von inspect bis read erteilt werden.

"Inspect Volumes" (Volumes prüfen) "Read Volumes" (Volumes lesen) "Use Volumes" (Volumes verwenden) "Manage Volumes" (Volumes verwalten)
VOLUME_INSPECT VOLUME_INSPECT

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_INSPECT

VOLUME_UPDATE

VOLUME_WRITE

VOLUME_CREATE

VOLUME_DELETE

In der Policy-Referenz werden die Berechtigungen aufgelistet, die jedes Verb für jeden angegebenen Ressourcentyp umfasst. Informationen zu Block-Volumes und anderen Ressourcen, die von Coreservices abgedeckt werden, finden Sie beispielsweise in den Tabellen unter Details für Kombinationen aus Verb + Ressourcentyp. In der linken Spalte jeder dieser Tabellen werden die Berechtigungen aufgeführt, die jedes Verb umfasst. Die anderen Abschnitte der Policy-Referenz enthalten dieselben Informationen für die anderen Services.

Beziehung zu API-Vorgängen

Für jeden API-Vorgang muss der Aufrufer Zugriff auf mindestens eine Berechtigung haben. Beispiel: Um ListVolumes oder GetVolume zu verwenden, müssen Sie Zugriff auf eine einzelne Berechtigung haben: VOLUME_INSPECT. Damit Sie ein Volume an eine Instanz anhängen können, müssen Sie Zugriff auf mehrere Berechtigungen haben. Einige Berechtigungen beziehen sich auf den Ressourcentyp volumes, einige auf den Ressourcentyp volume-attachments und einige auf den Ressourcentyp instances:

  • VOLUME_WRITE
  • VOLUME_ATTACHMENT_CREATE
  • INSTANCE_ATTACH_VOLUME

In der Policy-Referenz ist aufgeführt, welche Berechtigungen für die einzelnen API-Vorgänge erforderlich sind. Informationen zu den API-Vorgängen für Coreservices finden Sie beispielsweise in der Tabelle unter Für jeden API-Vorgang erforderliche Berechtigungen.

Benutzerzugriff

Die Policy-Sprache ist so konzipiert, dass Sie einfache Anweisungen schreiben können, die nur Verben und Ressourcentypen umfassen, ohne die gewünschten Berechtigungen in der Anweisung angeben zu müssen. Es gibt jedoch Situationen, in denen ein Mitglied des Sicherheitsteams oder ein Auditor die spezifischen Berechtigungen verstehen möchte, die ein bestimmter Benutzer hat. In den Tabellen in der Policy-Referenz werden jedes Verb und die zugehörigen Berechtigungen angezeigt. Sie können die Gruppen, denen der Benutzer angehört, und die Policys prüfen, die für diese Gruppen anwendbar sind. Hier können Sie eine Liste der erteilten Berechtigungen kompilieren. Mit einer Liste der Berechtigungen ist jedoch noch nicht das komplette Konzept abgedeckt. Bedingungen in einer Policy-Anweisung können den Geltungsbereich des Benutzerzugriffs über einzelne Berechtigungen hinaus einschränken (siehe nächster Abschnitt). Außerdem gibt jede Policy-Anweisung ein bestimmtes Compartment an und kann Bedingungen enthalten, die den Zugriff nur auf bestimmte Ressourcen in diesem Compartment einschränken können.

Zugriff mit Berechtigungen oder API-Vorgängen einschränken

In einer Policy-Anweisung können Sie Bedingungen in Kombination mit Berechtigungen oder API-Vorgängen verwenden, um den Geltungsbereich des Zugriffs einzuschränken, der durch ein bestimmtes Verb erteilt wurde.

Beispiel: Nehmen wir an, die Gruppe "XYZ" soll Gruppen auflisten, abrufen, erstellen oder aktualisieren (d.h. die Beschreibung ändern), jedoch nicht löschen können. Um Gruppen aufzulisten, abzurufen, zu erstellen und zu aktualisieren, benötigen Sie eine Policy mit manage groups als Verb und einem Ressourcentyp. Gemäß der Tabelle unter Details für Kombinationen aus Verb + Ressourcentyp werden folgende Berechtigungen abgedeckt:

  • GROUP_INSPECT
  • GROUP_UPDATE
  • GROUP_CREATE
  • GROUP_DELETE

Um den Zugriff nur auf die gewünschten Berechtigungen einzuschränken, können Sie eine Bedingung hinzufügen, die die Berechtigungen explizit angibt, die Sie zulassen möchten:

Allow group XYZ to manage groups in tenancy

 where any {request.permission='GROUP_INSPECT',
            request.permission='GROUP_CREATE',
            request.permission='GROUP_UPDATE'}

Alternativ können Sie eine Policy schreiben, die alle Berechtigungen außer "GROUP_DELETE" zulässt:

Allow group XYZ to manage groups in tenancy where request.permission != 'GROUP_DELETE'

Beachten Sie jedoch, dass bei dieser Policy der Gruppe "XYZ" automatisch alle neuen Berechtigungen erteilt werden, die für den Service zukünftig hinzugefügt werden. Nur "GROUP_DELETE" wird dabei ausgelassen.

Eine weitere Möglichkeit wäre, eine Bedingung basierend auf den spezifischen API-Vorgängen schreiben. Beachten Sie, dass entsprechend der Tabelle unter Für jeden API-Vorgang erforderliche Berechtigungen sowohl ListGroups als auch GetGroup nur die Berechtigung "GROUP_INSPECT" benötigen. Dies ist die Policy:

Allow group XYZ to manage groups in tenancy

 where any {request.operation='ListGroups',  
            request.operation='GetGroup',
            request.operation='CreateGroup',
            request.operation='UpdateGroup'}

Es kann von Vorteil sein, Berechtigungen anstelle von API-Vorgängen in Bedingungen zu verwenden. Wenn zukünftig ein neuer API-Vorgang hinzugefügt wird, für den eine der in der berechtigungsbasierten Policy oben aufgeführten Berechtigungen erforderlich ist, kontrolliert diese Policy bereits den Zugriff der Gruppe "XYZ" auf diesen neuen API-Vorgang.

Beachten Sie jedoch, dass Sie den Zugriff eines Benutzers auf eine Berechtigung weiter einschränken können, indem Sie auch eine Bedingung basierend auf dem API-Vorgang angeben. Beispiel: Sie können einem Benutzer Zugriff auf "GROUP_INSPECT" erteilen, jedoch nur für ListGroups.

Allow group XYZ to manage groups in tenancy

 where all {request.permission='GROUP_INSPECT',  
            request.operation='ListGroups'}

Geltungsbereich der Policy durch die IP-Adresse des Anforderers einschränken

Sie können den Geltungsbereich des Zugriffs nur auf eine Gruppe zulässiger IP-Adressen einschränken. Beispiel: Sie können eine Policy schreiben, mit der nur Anforderungen von einem bestimmten öffentlichen IP-Bereich für den Zugriff auf einen bestimmten Object Storage-Bucket zulässig sind. Sie können aber auch nur Anforderungen von bestimmten Subnetzen eines bestimmten VCN über ein Servicegateway zulassen.

So schränken Sie den Zugriff auf eine Gruppe von IP-Adressen ein:

  1. Erstellen Sie ein Netzwerkquellobjekt, das die zulässigen IP-Adressen angibt. Weitere Einzelheiten finden Sie unter Netzwerkquellen verwalten.
  2. Schreiben Sie eine Policy, in der das Netzwerkquellobjekt in einer Bedingung verwendet wird.

Verwenden Sie die folgende Variable in Ihrer Policy:

request.networkSource.name='<network_source_name>'

Beispiel:

allow group GroupA to manage object-family in tenancy where request.networkSource.name='corpnet'

Zugriff auf Ressourcen basierend auf Zeitrahmen einschränken

Sie können zeitbasierte Variablen in Ihren Policys verwenden, um den Zugriff, der in der Policy erteilt wird, auf bestimmte Zeitrahmen zu beschränken. Mit diesem Feature können Sie Aktionen für Ressourcen auf bestimmte Zeiten beschränken. Beispiel: Sie können eine Policy erstellen, die den Zugriff nur bis zu einem angegebenen Datum zulässt. Eine solche Policy ist hilfreich, wenn Ihr Unternehmen Auftragnehmer einstellt und Sie sicherstellen möchten, dass der Zugriff nicht nach dem Vertragsende zulässig ist. Alternativ können Sie den Zugriff auf Ressourcen nur während der Geschäftszeiten zulassen (z.B. Montag bis Freitag 9:00 Uhr bis 17:00 Uhr). Diese Einschränkung kann das Risiko verringern, dass ein Angreifer Änderungen vornimmt, wenn diese unbemerkt bleiben können.

Variablen, mit denen Sie den Zugriff basierend auf Zeit einschränken können:

  • request.utc-timestamp
  • request.utc-timestamp.month-of-year
  • request.utc-timestamp.day-of-month
  • request.utc-timestamp.day-of-week
  • request.utc-timestamp.time-of-day

Die Verwendung dieser Variablen wird in den folgenden Abschnitten ausführlicher beschrieben.

Informationen zum Arbeiten mit zeitbasierten Variablen

Sie müssen die Zeit für die Variablen im ISO 8601-Format angeben: YYYY-MM-DDThh:mm:ssZ. Beispiele für dieses Format:

  • Datum und Uhrzeit mit Sekunden: "2020-04-01T15:00:00Z"
  • Datum und Uhrzeit mit Minuten: "2020-04-01T05:00Z"
  • Nur Datum: "2020-04-01Z"
  • Nur Uhrzeit: "05:00:00"

Auch wenn Sie eine Zeit mit Sekundengenauigkeit angeben können, sollten Sie einen 5-minütigen Zeitunterschied zwischen dem Zeitstempel der Anforderung und dem Zeitpunkt der Auswertung der Anforderung durch den IAM-Service zulassen. Dieser Zeitunterschied kann durch mehrere Faktoren verursacht werden. Achten Sie daher auf diese potenzielle Abweichung, wenn Sie zeitbasierte Policys planen und implementieren.

Die angegebene Zeit wird als koordinierte Weltzeit (UTC) ausgewertet. Das bedeutet, dass Sie die richtige UTC-Zeit für die Zeitzone berechnen müssen, in der die Policy ausgewertet wird. Beispiel: Um 9:00 Uhr Pacific Standard Time für den Wert einer Variablen anzugeben, geben Sie "17:00:00" ein. Wenn Ihr Gebietsschema die Sommer-/Winterzeitumstellung nutzt, müssen Sie alle Policys aktualisieren, die eine bestimmte Stunde referenzieren, wenn die Zeitänderung in Kraft tritt.

Details für jede zeitbasierte Variable

Die Verwendung für jede Variable wird in den folgenden Abschnitten beschrieben:

request.utc-timestamp

Beschreibung: Der Zeitpunkt, zu dem die Anforderung zur Autorisierung empfangen wurde. Sie können eine Policy schreiben, die den Zugriff nur vor oder nach einem bestimmten Datums-/Uhrzeitstempel zulässt. Der Zeitstempel muss dem ISO 8601-Format (YYYY-MM-DDThh:mm:ssZ) folgen und in koordinierter Weltzeit (UTC) angegeben sein.

Unterstützte Operatoren: before | after

Zulässige Werte: Zeitstempel in koordinierter Weltzeit (UTC) im ISO 8601-Format: YYYY-MM-DDThh:mm:ssZ

Beispielwerte:
  • "2020-04-01T00:00:00Z"
  • "2020-04-01T00:00Z"

Beispiel-Policy: Zugriff auf die instance-family-Ressourcen durch die Gruppe "Contractors" bis zu einem bestimmten Datum zulassen:

Allow group Contractors to manage instance-family in tenancy where request.utc-timestamp before '2022-01-01T00:00Z'

Der von der Policy gewährte Zugriff für die Gruppe "Contractors" läuft am 1. Januar 2022 um 12:00 Uhr UTC ab.

request.utc-timestamp.month-of-year

Beschreibung: Der Monat des Jahres, in dem die Anforderung zur Autorisierung eingegangen ist. Sie können eine Policy schreiben, die den Zugriff nur in bestimmten Monaten zulässt.

Unterstützte Operatoren: = | != | in

Zulässige Werte: Numerischer Monat (im ISO 8601-Format)

Beispielwerte: "1", "2", "3", ... "12"

Beispiel-Policy: Zugriff der Gruppe "SummerInterns" auf die instance-family-Ressourcen nur im Juni, Juli und August zulassen:

Allow group SummerInterns to manage instance-family in tenancy where ANY {request.utc-timestamp.month-of-year in ('6', '7', '8')}

Der von der Policy gewährte Zugriff für die Gruppe "SummerInterns" ist nur im Juni, Juli und August jedes Jahres gültig.

request.utc-timestamp.day-of-month

Beschreibung: Der Tag des Monats, an dem die Anforderung zur Autorisierung eingegangen ist. Sie können eine Policy schreiben, die den Zugriff nur für bestimmte Tage des Monats zulässt. Beachten Sie, dass Beginn und Ende des Tages auf Basis von UTC berechnet werden. Beispiel: Sie befinden sich in Miami, FL, USA, und geben "1" ein, um den ersten Tag des Monats anzugeben. Für den Monat Februar gilt die Richtlinie von 12:00 Uhr bis 23:59 Uhr UTC am 1. Februar. Das ist in Miami von 19:00 Uhr am 31. Januar bis 18:59 Uhr am 1. Februar.

Unterstützte Operatoren: = | != | in

Zulässige Werte: Numerischer Tag des Monats

Beispielwerte: "1", "2", "3", ... "31"

Beispiel-Policy: Lesen aller Ressourcen (all-resources) durch die Gruppe "ComplianceAuditors" nur am ersten Tag des Monats zulassen.

Allow group ComplianceAuditors to read all-resources in tenancy where request.utc-timestamp.day-of-month = '1'

Der von der Policy gewährte Zugriff für die Gruppe "ComplianceAuditors" ist nur am ersten Tag jedes Monats gültig (der Tag wird durch UTC-Zeit definiert).

request.utc-timestamp.day-of-week

Beschreibung: Der Wochentag, an dem die Anforderung zur Autorisierung eingegangen ist. Sie können eine Policy schreiben, die den Zugriff nur für bestimmte Wochentage zulässt. Beachten Sie, dass Beginn und Ende des Tages auf Basis von UTC berechnet werden. Beispiel: Sie befinden sich in Miami, FL, USA und geben "monday" ein. Die Policy gilt dann von 12:00 Uhr bis 23:59 Uhr UTC am Montag. Das ist in Miami 19:00 Uhr (EST) am Sonntag bis 18:59 Uhr am Montag.

Unterstützte Operatoren: = | != | in

Zulässige Werte: Name des Wochentags auf Englisch

Beispielwerte: "Monday", "Tuesday", "Wednesday" usw.

Beispiel-Policy: Verwalten von instance-family durch die Gruppe "WorkWeek" nur während der Arbeitswoche des Unternehmens zulassen.

Allow group WorkWeek to manage instance-family where ANY {request.utc-timestamp.day-of-week in ('monday', 'tuesday', 'wednesday', 'thursday', 'friday')}

Der von der Policy gewährte Zugriff für die Gruppe "WorkWeek" ist nur an den angegebenen Tagen gültig (der Tag wird durch UTC-Zeit definiert).

request.utc-timestamp.time-of-day

Beschreibung: Die Uhrzeit, zu der die Anforderung zur Autorisierung eingegangen ist. Sie können eine Policy schreiben, die den Zugriff nur für einen bestimmten Zeitraum während des Tages zulässt. Beachten Sie, dass die Tageszeit auf Basis von UTC berechnet wird. Wenn Sie in einer Zeitzone leben, die die Sommer-/Winterzeitumstellung nutzt, müssen Sie die Policy aktualisieren, wenn sich die Zeit ändert.

Unterstützte Operatoren: between

Zulässige Werte: UTC-Zeitintervall im ISO 8601-Format: hh:mm:ssZ

Beispielwerte: "01:00:00Z" AND "2:01:00Z"

Beispiel-Policys: Verwalten von Instanzen und zugehörigen Ressourcen durch die Gruppe "DayShift" zwischen 9:00 Uhr und 17:00 Uhr Pacific Standard Time (PST) zulassen.

Beachten Sie, dass die Zeiten in UTC konvertiert werden:

Allow group DayShift to manage instance-family where request.utc-timestamp.time-of-day between '17:00:00Z' and '01:00:00Z'

Ich möchte der Gruppe "NightShift" erlauben, Instanzen und zugehörige Ressourcen zwischen 17:00 Uhr und 9:00 Uhr PST zu verwalten.

Allow group NightShift to manage instance-family where request.utc-timestamp.time-of-day between '01:00:00Z' and '17:00:00Z'

In beiden Beispielen wird die aktuelle Zeit berechnet und getestet, um festzustellen, ob sie innerhalb des angegebenen Bereichs liegt oder nicht (dabei wird der Tag ignoriert).