Exemples de politiques
Cette section fournit des exemples complets de politiques d'autorisation de Cedar pour un système de gestion des assurances. Ces exemples illustrent les différentes fonctionnalités du langage Cedar et les modèles d'autorisation que vous pouvez adapter à vos propres applications.
Rubriques
Outils disponibles
L'API Insurance fournit cinq outils pour gérer les polices d'assurance et les réclamations :
- API d'assurance ___get_policy
-
Récupérez les détails de la police d'assurance.
Paramètres :
-
policyId(chaîne, obligatoire) - L'identifiant de la politique
-
- API d'assurance ___file_claim
-
Déposer une réclamation d'assurance.
Paramètres :
-
policyId(chaîne, obligatoire) - L'identifiant de la politique -
claimType(chaîne, obligatoire) - Type de réclamation (par exemple, « santé », « propriété », « auto ») -
amount(numéro, obligatoire) - Montant réclamé -
description(chaîne, facultatif) - Description de la réclamation
-
- API d'assurance ___Update_Coverage
-
Mettez à jour la couverture de la police.
Paramètres :
-
policyId(chaîne, obligatoire) - L'identifiant de la politique -
coverageType(chaîne, obligatoire) - Type de couverture (par exemple, « responsabilité », « collision ») -
newLimit(numéro, obligatoire) - Nouvelle limite de couverture
-
- API d'assurance ___get_claim_status
-
Vérifiez l'état de la réclamation.
Paramètres :
-
claimId(chaîne, obligatoire) - L'identifiant de la réclamation
-
- API d'assurance ___Calculate_Premium
-
Calculez la prime d'assurance.
Paramètres :
-
coverageType(chaîne, obligatoire) - Type de couverture -
coverageAmount(numéro, obligatoire) - Montant de la couverture -
riskFactors(objet, facultatif) - Facteurs d'évaluation des risques
-
Politiques d'autorisation
Les politiques suivantes présentent les différentes fonctionnalités linguistiques et modèles d'autorisation de Cedar. Chaque politique inclut une description en langage naturel, un code Cedar et une explication détaillée.
Politique 1 : Multi-action permis
Cette politique explique comment accorder l'accès à plusieurs actions connexes à l'aide d'une seule déclaration de politique.
Langage naturel : Permettez à tous les principaux d'obtenir la police d'assurance et le statut de la réclamation.
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action in [ AgentCore::Action::"InsuranceAPI___get_policy", AgentCore::Action::"InsuranceAPI___get_claim_status" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" );
Explication : Cette politique illustre les autorisations à actions multiples utilisant l'inopérateur. Au lieu d'écrire des politiques distinctes pour chaque opération de lecture, une seule politique donne accès à plusieurs actions connexes. Cela est utile pour regrouper des opérations similaires qui partagent les mêmes exigences d'autorisation.
Politique 2 : Scope-based autorisation
Cette politique indique comment utiliser les étendues OAuth pour contrôler l'accès à des opérations spécifiques.
Langage naturel : autorisez les mandants dont le champ d'application contient « insurance:claim » à déposer des réclamations.
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { principal.hasTag("scope") && principal.getTag("scope") like "*insurance:claim*" };
Explication : Cette politique illustre la validation de la portée OAuth à l'aide de balises. La hasTag méthode vérifie si la balise existe et getTag récupère sa valeur. L'likeopérateur utilisant des caractères génériques (*) effectue une correspondance de modèles, autorisant des formats de portée flexibles tels que « insurance:claim », « insurance:claim:write » ou « admin insurance:claim ».
Politique 3 : Role-based autorisation avec sauf
Cette politique illustre l'utilisation de la unless clause pour créer des exceptions aux restrictions.
Langage naturel : Empêchez le directeur de mettre à jour la couverture, sauf si le directeur a le rôle d' « expert principal » ou de « directeur ».
Politique sur le cèdre :
forbid( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) unless { principal.hasTag("role") && (principal.getTag("role") == "senior-adjuster" || principal.getTag("role") == "manager") };
Explication : Cette politique illustre la unless clause, qui inverse la logique des conditions. L'interdiction s'applique sauf si l'utilisateur possède l'un des rôles spécifiés. Cela est utile pour créer des exceptions aux restrictions. La politique indique également la logique OR pour vérifier plusieurs valeurs acceptables.
Politique 4 : Égalité des chaînes avec la logique OR
Cette politique indique comment valider les paramètres d'entrée et utiliser la logique OR pour plusieurs valeurs acceptables.
Langage naturel : autorisez les mandants à déposer des réclamations lorsque le type de réclamation est lié à la santé, aux biens ou à l'auto.
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has claimType && (context.input.claimType == "health" || context.input.claimType == "property" || context.input.claimType == "auto") };
Explication : Cette politique explique l'accès aux paramètres d'entrée des outils via la logique OR context.input et les contrôles d'égalité des chaînes avec la logique OR. L'hasopérateur vérifie d'abord que le champ existe avant d'y accéder, afin d'éviter les erreurs lorsque des champs facultatifs sont manquants.
Politique 5 : Vérification de l'existence des champs
Cette politique explique comment appliquer les règles commerciales en exigeant des champs facultatifs.
Langage naturel : Empêchez les mandants de déposer des réclamations à moins qu'une description ne soit fournie.
Politique sur le cèdre :
forbid( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___file_claim", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) unless { context.input has description };
Explication : Cette politique montre comment appliquer les champs obligatoires pour les paramètres facultatifs. Le champ de description est facultatif dans le schéma de l'outil, mais cette politique le rend obligatoire en interdisant les demandes qui ne l'incluent pas. Cela montre comment les politiques peuvent ajouter des règles métier au-delà de la validation du schéma.
Politique 6 : Username-based autorisation
Cette politique indique comment accorder l'accès en fonction d'identités utilisateur spécifiques.
Langage naturel : autorisez les principaux dont le nom d'utilisateur est « Clare » à mettre à jour leur couverture.
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { principal.hasTag("username") && principal.getTag("username") == "Clare" };
Explication : Cette politique illustre l'autorisation basée sur le nom d'utilisateur en utilisant une correspondance de chaînes exacte. Combiné à la politique 3, cela crée une autorisation en deux parties : les utilisateurs doivent avoir le nom d'utilisateur « agent d'assurance » ET avoir le rôle « expert en sinistres » ou « directeur » pour mettre à jour la couverture.
Politique 7 : Correspondance des modèles avec des likes
Cette politique illustre une correspondance flexible des modèles à l'aide de caractères génériques pour le contrôle d'accès basé sur les catégories.
Langage naturel : autorisez les mandants à calculer la prime lorsque le type de couverture contient « auto ».
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___calculate_premium", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has coverageType && context.input.coverageType like "*auto*" };
Explication : Cette politique illustre une correspondance flexible avec l'likeopérateur. Le joker * correspond à tous les caractères, donc « auto », « responsabilité automatique », « automatique complète » ou « collision automatique » correspondraient tous. Cela est utile lorsque vous souhaitez faire correspondre une catégorie de valeurs plutôt que des chaînes exactes.
Politique 8 : Conditions combinées avec AND
Cette politique montre comment combiner plusieurs conditions pour créer des règles d'autorisation complexes.
Langage naturel : autorisez les mandants à mettre à jour la couverture lorsque le type de couverture est la responsabilité civile ou la collision et qu'une nouvelle limite est fournie.
Politique sur le cèdre :
permit( principal is AgentCore::OAuthUser, action == AgentCore::Action::"InsuranceAPI___update_coverage", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/insurance" ) when { context.input has coverageType && context.input has newLimit && (context.input.coverageType == "liability" || context.input.coverageType == "collision") };
Explication : Cette politique illustre la combinaison de plusieurs conditions avec la logique AND. Les trois conditions doivent être vraies : coverageType doit exister, newLimit doit exister et coverageType doit être soit « responsabilité », soit « collision ». Cela fonctionne avec la Politique 6 pour créer des autorisations à plusieurs niveaux : qui peut mettre à jour (Politique 6) et ce qu'ils peuvent mettre à jour (Politique 8).
Comprendre la sémantique des autorisations
Ces politiques illustrent la sémantique clé des autorisations de Cedar :
Refus par défaut
Si aucune politique n'autorise explicitement une action, celle-ci est refusée. Par exemple, un utilisateur n'ayant pas le champ « insurance:claim » ne peut pas déposer de réclamation même si aucune politique ne l'interdit explicitement.
Interdire les victoires
Si une politique d'interdiction correspond, la demande est refusée même si les politiques d'autorisation correspondent également. La politique 5 (interdire sans description) remplace la politique 2 (autorisation avec champ d'application) lorsque la description est absente.
Superposition des politiques
Plusieurs politiques peuvent s'appliquer à la même demande :
-
La politique 6 permet à l'agent d'assurance de mettre à jour la couverture
-
La politique 3 interdit les mises à jour à moins que l'utilisateur n'ait un rôle d'expert principal ou de gestionnaire
-
La politique 8 autorise les mises à jour uniquement pour les types de responsabilité ou de collision
Pour qu'une demande soit acceptée, elle doit satisfaire aux trois critères suivants : être agent d'assurance (police 6), avoir un rôle d'expert principal ou de gestionnaire (politique 3) et mettre à jour la responsabilité en cas de collision (police 8).
Scénarios de test
Les scénarios suivants montrent comment les politiques fonctionnent ensemble dans la pratique :
- Scénario 1 : Politique de consultation régulière des utilisateurs
-
Utilisateur : username="john », scope="insurance:view »
Action : get_policy
Prévu : AUTORISER (politique 1)
- Scénario 2 : L'utilisateur dépose une demande de santé accompagnée d'une description
-
Utilisateur : username="jane », scope="insurance:claim »
Action : file_claim avec claimType="health », description="frais médicaux »
Attendu : AUTORISER (la politique 2, la politique 4, la politique 5 n'interdisent pas)
- Scénario 3 : utilisateur déposant une réclamation sans description
-
Utilisateur : username="jane », scope="insurance:claim »
Action : file_claim avec claimType="health », aucune description
Prévu : DENY (politique 5 interdisant les victoires)
- Scénario 4 : mise à jour de la couverture par un agent d'assurance
-
Utilisateur : username="insurance-agent », role="senior-adjuster »
Action : update_coverage avec coverageType="LIABILITY »
Attendu : AUTORISER (politique 6, politique 3 n'interdit pas, politique 8)
- Scénario 5 : Agent d'assurance sans rôle supérieur
-
Utilisateur : username="insurance-agent », role="agent »
Action : update_coverage avec coverageType="LIABILITY »
Prévu : DENY (politique 3 interdisant les victoires)
- Scénario 6 : Calcul de la prime pour la couverture auto
-
Utilisateur : username="anyone », scope="any »
Action : calculate_premium avec coverageType="auto-liability »
Attendu : ALLOW (politique 7, le modèle correspond à « auto »)
IAM-based exemples d'autorisation
Lorsque votre AgentCore passerelle utilise l'authentification AWS_IAM au lieu d'OAuth, le principal dans les politiques de Cedar est représenté par. AgentCore::IamEntity Pour les appelants qui s'authentifient via des rôles assumés, l'identifiant d'entité Cedar utilise le formatarn:aws:sts::<account>:assumed-role/<role-name>, permettant une principal == correspondance stable et une correspondance de principal.id modèles.
Permis d'entité IAM de base
Cette politique permet à tout IAM-authenticated appelant d'utiliser un outil spécifique :
permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___get_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );
Explication : Il s'agit de la forme la plus simple de politique IAM. Il permet à tout appelant authentifié via AWS_IAM d'appeler l'outil get_order. Utilisez-le uniquement lorsque vous devez vérifier que les appelants ne sont IAM-authenticated pas soumis à des restrictions supplémentaires.
Role-based restriction avec correspondance principale exacte
Limitez l'accès à l'outil aux appelants utilisant un rôle IAM spécifique en utilisant : principal ==
permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/MyServiceRole", action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );
Explication : L'ID d'entité Cedar pour les rôles assumés estarn:aws:sts::<account>:assumed-role/<role-name>. Cela permet une principal == correspondance stable quel que soit le nom de session utilisé lors de l'authentification.
Role-based restriction avec correspondance de modèles
Vous pouvez également utiliser principal.id like pour des modèles de correspondance plus larges :
permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ) when { principal.id like "arn:aws:sts::111122223333:assumed-role/MyServiceRole" };
Explication : Cela permet d'obtenir le même résultat que, principal == mais en utilisant une when clause. La correspondance de modèles est utile lorsque vous avez besoin d'une correspondance plus large, par exemple pour faire correspondre n'importe quel rôle dans un compte (principal.id like "arn:aws:sts::111122223333:assumed-role/*").
Account-based restriction
Limitez l'accès à l'outil aux appelants provenant de AWS comptes spécifiques :
permit( principal is AgentCore::IamEntity, action == AgentCore::Action::"OrderAPI___process_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ) when { principal.id like "*:111122223333:*" };
Explication : Le modèle *:111122223333 : * correspond à n'importe quel ARN contenant cet ID de compte. Cela restreint l'accès aux appelants à partir du AWS compte spécifié uniquement.
Multi-agent fédération
Lorsque plusieurs agents dotés de rôles IAM différents accèdent à la même passerelle, créez des politiques distinctes pour contrôler les outils que chaque agent peut utiliser :
// Agent A can only read orders permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/AgentA-Role", action == AgentCore::Action::"OrderAPI___get_order", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" ); // Agent B can read and process orders permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/AgentB-Role", action in [ AgentCore::Action::"OrderAPI___get_order", AgentCore::Action::"OrderAPI___process_order" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );
Explication : Ce modèle est utile pour les architectures multi-agents dans lesquelles les différents agents ont des rôles IAM différents et doivent avoir différents niveaux d'accès aux outils. Chaque politique est utilisée principal == avec l'ID d'entité du rôle spécifique. La tools/list réponse de chaque agent inclut uniquement les outils qu'il est autorisé à utiliser.
IAM avec validation des entrées
Combinez la correspondance principale IAM avec la validation des entrées d'outils :
permit( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/RefundProcessorRole", action == AgentCore::Action::"RefundAPI___process_refund", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/refund-gateway" ) when { context.input has amount && context.input.amount < 1000 };
Explication : Cette politique combine la correspondance exacte des principaux avec la validation des entrées. Seuls les appelants utilisant le RefundProcessorRole compte indiqué peuvent traiter les remboursements, et uniquement lorsque le montant du remboursement est inférieur à 1 000$.
Interdire certains comptes
Empêchez les appelants de AWS comptes spécifiques d'accéder à des outils sensibles :
forbid( principal is AgentCore::IamEntity, action == AgentCore::Action::"AdminAPI___delete_resource", resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/admin-gateway" ) when { principal.id like "*:444455556666:*" };
Explication : Cette politique d'interdiction empêche tous les appelants provenant d'un compte fournisseur tiers (444455556666) d'effectuer des suppressions administratives. En raison de la sémantique prohibid-wins, cela a priorité sur toutes les politiques d'autorisation.
Interdire les rôles spécifiques aux opérations sensibles
Empêchez les appelants utilisant des rôles en lecture seule d'effectuer des opérations d'écriture :
forbid( principal == AgentCore::IamEntity::"arn:aws:sts::111122223333:assumed-role/ReadOnlyAgentRole", action in [ AgentCore::Action::"OrderAPI___process_order", AgentCore::Action::"OrderAPI___cancel_order" ], resource == AgentCore::Gateway::"arn:aws:bedrock-agentcore:us-west-2:123456789012:gateway/order-gateway" );
Explication : Cette politique d'interdiction empêche les appelants utilisant le d'effectuer ReadOnlyAgentRole des opérations d'écriture, quelles que soient les politiques d'autorisation qui pourraient autrement les autoriser.