Berechtigungen - AWS Cloud Development Kit (AWS CDK) v2

Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 gewartet und der Support wurde am 1. Juni 2023 eingestellt.

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Berechtigungen

Die AWS Construct Library verwendet einige gängige, weit verbreitete Ausdrücke, um den Zugriff und die Berechtigungen zu verwalten. Das IAM-Modul stellt Ihnen die Tools zur Verfügung, die Sie für die Verwendung dieser Ausdrücke benötigen.

AWS CDK verwendet AWS CloudFormation , um Änderungen bereitzustellen. Jede Bereitstellung umfasst einen Akteur (entweder einen Entwickler oder ein automatisiertes System), der eine AWS CloudFormation Bereitstellung startet. In diesem Fall übernimmt der Akteur eine oder mehrere IAM-Identitäten (Benutzer oder Rollen) und übergibt optional eine Rolle an AWS CloudFormation.

Wenn Sie verwenden, AWS IAM Identity Center um sich als Benutzer zu authentifizieren, stellt der Single-Sign-On-Anbieter kurzlebige Sitzungsanmeldeinformationen bereit, mit denen Sie als vordefinierte IAM-Rolle fungieren können. Informationen dazu, wie die AWS Anmeldeinformationen von der IAM-Identity-Center-Authentifizierung AWS CDK erhält, finden Sie unter Grundlegendes zur IAM-Identity-Center-Authentifizierung im AWS Referenzhandbuch für SDKs und Tools.

Auftraggeber

Ein IAM-Prinzipal ist eine authentifizierte AWS Entität, die einen Benutzer, Service oder eine Anwendung darstellt, die - AWS APIs aufrufen kann. Die AWS Construct Library unterstützt die Angabe von Prinzipalen auf verschiedene flexible Weisen, um ihnen Zugriff auf Ihre - AWS Ressourcen zu gewähren.

Im Sicherheitskontext bezieht sich der Begriff „Prinzipal“ speziell auf authentifizierte Entitäten wie Benutzer. Objekte wie Gruppen und Rollen stellen keine Benutzer (und andere authentifizierte Entitäten) dar, sondern identifizieren sie indirekt, um Berechtigungen zu erteilen.

Wenn Sie beispielsweise eine IAM-Gruppe erstellen, können Sie der Gruppe (und damit ihren Mitgliedern) Schreibzugriff auf eine Amazon-RDS-Tabelle gewähren. Die Gruppe selbst ist jedoch kein Prinzipal, da sie keine einzelne Entität darstellt (Sie können sich auch nicht bei einer Gruppe anmelden).

In der IAM-Bibliothek des CDK implementieren Klassen, die Prinzipale direkt oder indirekt identifizieren, die IPrincipal Schnittstelle, sodass diese Objekte in Zugriffsrichtlinien austauschbar verwendet werden können. Nicht alle sind jedoch Prinzipale im Sicherheitsbereich. Zu diesen Objekten gehören:

  1. IAM-Ressourcen wie Role, Userund Group

  2. Service-Prinzipale (new iam.ServicePrincipal('service.amazonaws.com'))

  3. Verbundprinzipale (new iam.FederatedPrincipal('cognito-identity.amazonaws.com'))

  4. Kontoprinzipale (new iam.AccountPrincipal('0123456789012'))

  5. Kanonische Benutzerprinzipale (new iam.CanonicalUserPrincipal('79a59d[...]7ef2be'))

  6. AWS Organizations -Prinzipale (new iam.OrganizationPrincipal('org-id'))

  7. Beliebige ARN-Prinzipale (new iam.ArnPrincipal(res.arn))

  8. Ein iam.CompositePrincipal(principal1, principal2, ...) , um mehreren Prinzipalen zu vertrauen

Gewährungen

Jedes Konstrukt, das eine Ressource darstellt, auf die zugegriffen werden kann, z. B. ein Amazon S3-Bucket oder eine Amazon-DynamoDB-Tabelle, verfügt über Methoden, die einer anderen Entität Zugriff gewähren. Alle diese Methoden haben Namen, die mit der Erteilung beginnen.

AmazonAmazon S3-Buckets verfügen beispielsweise über die Methoden grantRead und grantReadWrite (Python: grant_read, grant_read_write), um Lese- bzw. Lese-/Schreibzugriff von einer Entität auf den Bucket zu ermöglichen. Die Entität muss nicht genau wissen, welche Amazon S3-IAM-Berechtigungen für diese Operationen erforderlich sind.

Das erste Argument einer Erteilungsmethode ist immer vom Typ IGrantable. Diese Schnittstelle stellt Entitäten dar, denen Berechtigungen erteilt werden können. Das heißt, es stellt Ressourcen mit Rollen dar, z. B. die IAM-RoleObjekte User, und Group.

Anderen Entitäten können auch Berechtigungen erteilt werden. Später in diesem Thema zeigen wir beispielsweise, wie Sie einem CodeBuild Projekt Zugriff auf einen Amazon S3-Bucket gewähren. Im Allgemeinen wird die zugehörige Rolle über eine role Eigenschaft der Entität abgerufen, der Zugriff gewährt wird.

Ressourcen, die Ausführungsrollen verwenden, wie z. B. lambda.Function, implementieren auch , sodass Sie ihnen Zugriff direkt gewähren könnenIGrantable, anstatt Zugriff auf ihre Rolle zu gewähren. Wenn beispielsweise bucket ein Amazon S3-Bucket und eine Lambda-Funktion function ist, gewährt der folgende Code der Funktion Lesezugriff auf den Bucket.

TypeScript
bucket.grantRead(function);
JavaScript
bucket.grantRead(function);
Python
bucket.grant_read(function)
Java
bucket.grantRead(function);
C#
bucket.GrantRead(function);

Manchmal müssen Berechtigungen angewendet werden, während Ihr Stack bereitgestellt wird. Ein solcher Fall ist, wenn Sie einer AWS CloudFormation benutzerdefinierten Ressource Zugriff auf eine andere Ressource gewähren. Die benutzerdefinierte Ressource wird während der Bereitstellung aufgerufen, daher muss sie zum Zeitpunkt der Bereitstellung über die angegebenen Berechtigungen verfügen.

Ein weiterer Fall ist, wenn ein Service überprüft, ob auf die Rolle, die Sie ihm übergeben, die richtigen Richtlinien angewendet wurden. (Eine Reihe von AWS Services tun dies, um sicherzustellen, dass Sie nicht vergessen haben, die Richtlinien festzulegen.) In diesen Fällen schlägt die Bereitstellung möglicherweise fehl, wenn die Berechtigungen zu spät angewendet werden.

Um zu erzwingen, dass die Berechtigungen der Erteilung angewendet werden, bevor eine andere Ressource erstellt wird, können Sie eine Abhängigkeit von der Erteilung selbst hinzufügen, wie hier gezeigt. Obwohl der Rückgabewert von Erteilungsmethoden häufig verworfen wird, gibt jede Erteilungsmethode tatsächlich ein iam.Grant Objekt zurück.

TypeScript
const grant = bucket.grantRead(lambda); const custom = new CustomResource(...); custom.node.addDependency(grant);
JavaScript
const grant = bucket.grantRead(lambda); const custom = new CustomResource(...); custom.node.addDependency(grant);
Python
grant = bucket.grant_read(function) custom = CustomResource(...) custom.node.add_dependency(grant)
Java
Grant grant = bucket.grantRead(function); CustomResource custom = new CustomResource(...); custom.node.addDependency(grant);
C#
var grant = bucket.GrantRead(function); var custom = new CustomResource(...); custom.node.AddDependency(grant);

Rollen

Das IAM-Paket enthält ein RoleKonstrukt, das IAM-Rollen darstellt. Der folgende Code erstellt eine neue Rolle, die dem Amazon EC2-Service vertraut.

TypeScript
import * as iam from 'aws-cdk-lib/aws-iam'; const role = new iam.Role(this, 'Role', { assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), // required });
JavaScript
const iam = require('aws-cdk-lib/aws-iam'); const role = new iam.Role(this, 'Role', { assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com') // required });
Python
import aws_cdk.aws_iam as iam role = iam.Role(self, "Role", assumed_by=iam.ServicePrincipal("ec2.amazonaws.com")) # required
Java
import software.amazon.awscdk.services.iam.Role; import software.amazon.awscdk.services.iam.ServicePrincipal; Role role = Role.Builder.create(this, "Role") .assumedBy(new ServicePrincipal("ec2.amazonaws.com")).build();
C#
using Amazon.CDK.AWS.IAM; var role = new Role(this, "Role", new RoleProps { AssumedBy = new ServicePrincipal("ec2.amazonaws.com"), // required });

Sie können einer Rolle Berechtigungen hinzufügen, indem Sie die -addToPolicyMethode der Rolle (Python: add_to_policy) aufrufen und eine übergebenPolicyStatement, die die hinzuzufügende Regel definiert. Die Anweisung wird der Standardrichtlinie der Rolle hinzugefügt. Wenn sie keine enthält, wird eine erstellt.

Im folgenden Beispiel wird der Rolle eine Deny Richtlinienanweisung für die Aktionen ec2:SomeAction und s3:AnotherAction für die Ressourcen bucket und otherRole (Python: other_role) unter der Bedingung hinzugefügt, dass der autorisierte Service ist AWS CodeBuild.

TypeScript
role.addToPolicy(new iam.PolicyStatement({ effect: iam.Effect.DENY, resources: [bucket.bucketArn, otherRole.roleArn], actions: ['ec2:SomeAction', 's3:AnotherAction'], conditions: {StringEquals: { 'ec2:AuthorizedService': 'codebuild.amazonaws.com', }}}));
JavaScript
role.addToPolicy(new iam.PolicyStatement({ effect: iam.Effect.DENY, resources: [bucket.bucketArn, otherRole.roleArn], actions: ['ec2:SomeAction', 's3:AnotherAction'], conditions: {StringEquals: { 'ec2:AuthorizedService': 'codebuild.amazonaws.com' }}}));
Python
role.add_to_policy(iam.PolicyStatement( effect=iam.Effect.DENY, resources=[bucket.bucket_arn, other_role.role_arn], actions=["ec2:SomeAction", "s3:AnotherAction"], conditions={"StringEquals": { "ec2:AuthorizedService": "codebuild.amazonaws.com"}} ))
Java
role.addToPolicy(PolicyStatement.Builder.create() .effect(Effect.DENY) .resources(Arrays.asList(bucket.getBucketArn(), otherRole.getRoleArn())) .actions(Arrays.asList("ec2:SomeAction", "s3:AnotherAction")) .conditions(java.util.Map.of( // Map.of requires Java 9 or later "StringEquals", java.util.Map.of( "ec2:AuthorizedService", "codebuild.amazonaws.com"))) .build());
C#
role.AddToPolicy(new PolicyStatement(new PolicyStatementProps { Effect = Effect.DENY, Resources = new string[] { bucket.BucketArn, otherRole.RoleArn }, Actions = new string[] { "ec2:SomeAction", "s3:AnotherAction" }, Conditions = new Dictionary<string, object> { ["StringEquals"] = new Dictionary<string, string> { ["ec2:AuthorizedService"] = "codebuild.amazonaws.com" } } }));

Im vorherigen Beispiel haben wir eine neue PolicyStatement Inline mit dem Aufruf addToPolicy (Python: add_to_policy) erstellt. Sie können auch eine vorhandene oder eine von Ihnen geänderte Richtlinienanweisung übergeben. Das -PolicyStatementObjekt verfügt über zahlreiche Methoden zum Hinzufügen von Prinzipalen, Ressourcen, Bedingungen und Aktionen.

Wenn Sie ein Konstrukt verwenden, für das eine Rolle ordnungsgemäß funktioniert, können Sie einen der folgenden Schritte ausführen:

  • Übergeben Sie beim Instanziieren des Konstruktobjekts eine vorhandene Rolle.

  • Lassen Sie das Konstrukt eine neue Rolle für Sie erstellen und vertrauen Sie dem entsprechenden Service-Prinzipal. Im folgenden Beispiel wird ein solches Konstrukt verwendet: ein CodeBuild Projekt.

TypeScript
import * as codebuild from 'aws-cdk-lib/aws-codebuild'; // imagine roleOrUndefined is a function that might return a Role object // under some conditions, and undefined under other conditions const someRole: iam.IRole | undefined = roleOrUndefined(); const project = new codebuild.Project(this, 'Project', { // if someRole is undefined, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal role: someRole, });
JavaScript
const codebuild = require('aws-cdk-lib/aws-codebuild'); // imagine roleOrUndefined is a function that might return a Role object // under some conditions, and undefined under other conditions const someRole = roleOrUndefined(); const project = new codebuild.Project(this, 'Project', { // if someRole is undefined, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal role: someRole });
Python
import aws_cdk.aws_codebuild as codebuild # imagine role_or_none is a function that might return a Role object # under some conditions, and None under other conditions some_role = role_or_none(); project = codebuild.Project(self, "Project", # if role is None, the Project creates a new default role, # trusting the codebuild.amazonaws.com service principal role=some_role)
Java
import software.amazon.awscdk.services.iam.Role; import software.amazon.awscdk.services.codebuild.Project; // imagine roleOrNull is a function that might return a Role object // under some conditions, and null under other conditions Role someRole = roleOrNull(); // if someRole is null, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal Project project = Project.Builder.create(this, "Project") .role(someRole).build();
C#
using Amazon.CDK.AWS.CodeBuild; // imagine roleOrNull is a function that might return a Role object // under some conditions, and null under other conditions var someRole = roleOrNull(); // if someRole is null, the Project creates a new default role, // trusting the codebuild.amazonaws.com service principal var project = new Project(this, "Project", new ProjectProps { Role = someRole });

Sobald das Objekt erstellt wurde, ist die Rolle (unabhängig davon, ob die übergebene Rolle oder die vom Konstrukt erstellte Standardrolle) als Eigenschaft verfügbarrole. Diese Eigenschaft ist jedoch nicht für externe Ressourcen verfügbar. Daher haben diese Konstrukte eine addToRolePolicy (Python: add_to_role_policy)-Methode.

Die -Methode tut nichts, wenn das Konstrukt eine externe Ressource ist, und ruft andernfalls die -Methode addToPolicy (Python: add_to_policy) der -roleEigenschaft auf. Dadurch haben Sie die Möglichkeit, den nicht definierten Fall explizit zu behandeln.

Das folgende Beispiel zeigt:

TypeScript
// project is imported into the CDK application const project = codebuild.Project.fromProjectName(this, 'Project', 'ProjectName'); // project is imported, so project.role is undefined, and this call has no effect project.addToRolePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, // ... and so on defining the policy }));
JavaScript
// project is imported into the CDK application const project = codebuild.Project.fromProjectName(this, 'Project', 'ProjectName'); // project is imported, so project.role is undefined, and this call has no effect project.addToRolePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW // ... and so on defining the policy }));
Python
# project is imported into the CDK application project = codebuild.Project.from_project_name(self, 'Project', 'ProjectName') # project is imported, so project.role is undefined, and this call has no effect project.add_to_role_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, # ... and so on defining the policy )
Java
// project is imported into the CDK application Project project = Project.fromProjectName(this, "Project", "ProjectName"); // project is imported, so project.getRole() is null, and this call has no effect project.addToRolePolicy(PolicyStatement.Builder.create() .effect(Effect.ALLOW) // .. and so on defining the policy .build();
C#
// project is imported into the CDK application var project = Project.FromProjectName(this, "Project", "ProjectName"); // project is imported, so project.role is null, and this call has no effect project.AddToRolePolicy(new PolicyStatement(new PolicyStatementProps { Effect = Effect.ALLOW, // ... and so on defining the policy }));

Ressourcenrichtlinien

Einige Ressourcen in AWS, wie Amazon S3-Buckets und IAM-Rollen, verfügen ebenfalls über eine Ressourcenrichtlinie. Diese Konstrukte haben eine -addToResourcePolicyMethode (Python: add_to_resource_policy), die ein PolicyStatement als Argument verwendet. Jede Richtlinienanweisung, die einer Ressourcenrichtlinie hinzugefügt wird, muss mindestens einen Prinzipal angeben.

Im folgenden Beispiel bucket erteilt der Amazon S3-Bucket eine Rolle mit der -s3:SomeActionBerechtigung für sich selbst.

TypeScript
bucket.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['s3:SomeAction'], resources: [bucket.bucketArn], principals: [role] }));
JavaScript
bucket.addToResourcePolicy(new iam.PolicyStatement({ effect: iam.Effect.ALLOW, actions: ['s3:SomeAction'], resources: [bucket.bucketArn], principals: [role] }));
Python
bucket.add_to_resource_policy(iam.PolicyStatement( effect=iam.Effect.ALLOW, actions=["s3:SomeAction"], resources=[bucket.bucket_arn], principals=role))
Java
bucket.addToResourcePolicy(PolicyStatement.Builder.create() .effect(Effect.ALLOW) .actions(Arrays.asList("s3:SomeAction")) .resources(Arrays.asList(bucket.getBucketArn())) .principals(Arrays.asList(role)) .build());
C#
bucket.AddToResourcePolicy(new PolicyStatement(new PolicyStatementProps { Effect = Effect.ALLOW, Actions = new string[] { "s3:SomeAction" }, Resources = new string[] { bucket.BucketArn }, Principals = new IPrincipal[] { role } }));

Verwenden externer IAM-Objekte

Wenn Sie einen IAM-Benutzer, Prinzipal, eine Gruppe oder Rolle außerhalb Ihrer AWS CDK App definiert haben, können Sie dieses IAM-Objekt in Ihrer AWS CDK App verwenden. Erstellen Sie dazu einen Verweis darauf mit seinem ARN oder seinem Namen. (Verwenden Sie den Namen für Benutzer, Gruppen und Rollen.) Die zurückgegebene Referenz kann dann verwendet werden, um Berechtigungen zu erteilen oder Richtlinienanweisungen zu erstellen, wie zuvor erläutert.

Richtlinien (einschließlich verwalteter Richtlinien) können mit den folgenden Methoden auf ähnliche Weise verwendet werden. Sie können Verweise auf diese Objekte überall verwenden, wo eine IAM-Richtlinie erforderlich ist.

Anmerkung

Wie bei allen Verweisen auf externe AWS Ressourcen können Sie externe IAM-Objekte in Ihrer CDK-App nicht ändern.