Dies ist der AWS CDK v2-Entwicklerhandbuch. Das ältere CDK v1 wurde am 1. Juni 2022 in die Wartung aufgenommen 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.
Die AWS Construct-Bibliothek verwendet einige gängige, weit verbreitete Idiome zur Verwaltung von Zugriffen und Berechtigungen. Das IAM-Modul bietet Ihnen die Tools, die Sie zur Verwendung dieser Redewendungen benötigen.
AWS CDK verwendet, AWS CloudFormation um Änderungen bereitzustellen. An jeder Bereitstellung ist ein Akteur beteiligt (entweder ein Entwickler oder ein automatisiertes System), der die AWS CloudFormation Bereitstellung startet. Dabei nimmt der Akteur eine oder mehrere IAM-Identitäten (Benutzer oder Rollen) an und übergibt optional eine Rolle an. AWS CloudFormation
Wenn Sie AWS IAM Identity Center sich als Benutzer authentifizieren, stellt der Single Sign-On-Anbieter kurzlebige Sitzungsanmeldedaten bereit, die Sie berechtigen, als vordefinierte IAM-Rolle zu agieren. Weitere Informationen zum Abrufen von AWS Anmeldeinformationen aus der AWS CDK IAM Identity Center-Authentifizierung finden Sie unter Grundlegendes zur IAM Identity Center-Authentifizierung im Referenzhandbuch und im Tools-Referenzhandbuch.AWS SDKs
Prinzipale
Ein IAM-Prinzipal ist eine authentifizierte AWS Entität, die einen Benutzer, einen Dienst oder eine Anwendung darstellt, die aufrufen kann. AWS APIs Die AWS Construct-Bibliothek unterstützt die Angabe von Prinzipalen auf verschiedene flexible Weise, um ihnen Zugriff auf Ihre Ressourcen zu gewähren. AWS
In Sicherheitskontexten bezieht sich der Begriff „Principal“ speziell auf authentifizierte Entitäten wie Benutzer. Objekte wie Gruppen und Rollen repräsentieren keine Benutzer (und andere authentifizierte Entitäten), sondern identifizieren sie indirekt, um Berechtigungen zu gewähren.
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 Principal, 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 synonym in Zugriffsrichtlinien verwendet werden können. Allerdings sind nicht alle von ihnen Prinzipale im Sinne der Sicherheit. Zu diesen Objekten gehören:
-
Dienstprinzipale ()
new iam.ServicePrincipal('service.amazonaws.com')
-
Föderierte Prinzipale ()
new iam.FederatedPrincipal('cognito-identity.amazonaws.com')
-
Kontoprinzipale (
new iam.AccountPrincipal('0123456789012'))
-
Kanonische Benutzerprinzipale ()
new iam.CanonicalUserPrincipal('79a59d[...]7ef2be')
-
AWS Organizations Prinzipale ()
new iam.OrganizationPrincipal('org-id')
-
Beliebige ARN-Prinzipale ()
new iam.ArnPrincipal(res.arn)
-
Und
iam.CompositePrincipal(principal1, principal2, ...)
um mehreren Prinzipalen zu vertrauen
Gewährungen
Jedes Konstrukt, das eine Ressource darstellt, auf die zugegriffen werden kann, wie z. B. ein Amazon S3 S3-Bucket oder eine Amazon DynamoDB-Tabelle, verfügt über Methoden, die Zugriff auf eine andere Entität gewähren. Alle diese Methoden haben Namen, die mit grant beginnen.
Amazon S3 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 S3-IAM-Berechtigungen für die Ausführung dieser Operationen erforderlich sind.
Das erste Argument einer Grant-Methode ist immer vom Typ IGrantable. Diese Schnittstelle steht für Entitäten, denen Berechtigungen erteilt werden können. Das heißt, sie stellt Ressourcen mit Rollen dar, z. B. die IAM-Objekte Role
User
, undGroup
.
Anderen Entitäten können ebenfalls Berechtigungen erteilt werden. Später in diesem Thema zeigen wir beispielsweise, wie Sie einem CodeBuild Projekt Zugriff auf einen Amazon S3 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 ebenfallsIGrantable
, sodass Sie ihnen direkt Zugriff gewähren können, anstatt Zugriff auf ihre Rolle zu gewähren. Wenn bucket
es sich beispielsweise um einen Amazon S3 S3-Bucket und um eine Lambda-Funktion function
handelt, gewährt der folgende Code der Funktion Lesezugriff auf den Bucket.
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 anderer Fall ist, wenn ein Dienst überprüft, ob für die Rolle, die Sie ihm übergeben, die richtigen Richtlinien angewendet wurden. (Einige AWS Dienste 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 des Grants angewendet werden, bevor eine weitere Ressource erstellt wird, können Sie eine Abhängigkeit vom Grant selbst hinzufügen, wie hier gezeigt. Obwohl der Rückgabewert von Grant-Methoden üblicherweise verworfen wird, gibt jede Grant-Methode tatsächlich ein iam.Grant
Objekt zurück.
const grant = bucket.grantRead(lambda);
const custom = new CustomResource(...);
custom.node.addDependency(grant);
Rollen
Das IAM-Paket enthält ein Role
Konstrukt, das IAM-Rollen repräsentiert. Der folgende Code erstellt eine neue Rolle, die dem EC2 Amazon-Service vertraut.
import * as iam from 'aws-cdk-lib/aws-iam';
const role = new iam.Role(this, 'Role', {
assumedBy: new iam.ServicePrincipal('ec2.amazonaws.com'), // required
});
Sie können einer Rolle Berechtigungen hinzufügen, indem Sie die addToPolicy
Methode der Rolle (Python:add_to_policy
) aufrufen und eine übergeben, PolicyStatement
die die hinzuzufügende Regel definiert. Die Anweisung wird der Standardrichtlinie der Rolle hinzugefügt. Wenn keine Anweisung vorhanden ist, wird eine erstellt.
Das folgende Beispiel fügt der Rolle für die Aktionen ec2:SomeAction
und für die Ressourcen bucket
und s3:AnotherAction
otherRole
(Python:other_role
) eine Deny
Richtlinienanweisung hinzu, unter der Bedingung, dass der autorisierte Dienst autorisiert ist AWS CodeBuild.
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',
}}}));
Im vorherigen Beispiel haben wir eine neue PolicyStatement
Inline mit dem addToPolicy
(Python:add_to_policy
) -Aufruf erstellt. Sie können auch eine bestehende oder eine von Ihnen geänderte Grundsatzerklärung übergeben. Das PolicyStatementObjekt verfügt über zahlreiche Methoden zum Hinzufügen von Prinzipalen, Ressourcen, Bedingungen und Aktionen.
Wenn Sie ein Konstrukt verwenden, für dessen korrekte Funktion eine Rolle erforderlich ist, können Sie einen der folgenden Schritte ausführen:
-
Übergeben Sie eine vorhandene Rolle, wenn Sie das Konstruktobjekt instanziieren.
-
Lassen Sie das Konstrukt eine neue Rolle für Sie erstellen und vertrauen Sie dabei dem entsprechenden Dienstprinzipal. Im folgenden Beispiel wird ein solches Konstrukt verwendet: ein CodeBuild Projekt.
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,
});
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 addToPolicy
(Python:add_to_policy
) -Methode der role
Eigenschaft auf. Das erspart Ihnen die Mühe, den undefinierten Fall explizit zu behandeln.
Das folgende Beispiel zeigt:
// 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
}));
Ressourcenrichtlinien
Für einige Ressourcen in AWS, wie Amazon S3 S3-Buckets und IAM-Rollen, gibt es auch eine Ressourcenrichtlinie. Diese Konstrukte haben eine addToResourcePolicy
Methode (Python:add_to_resource_policy
), die a PolicyStatement
als Argument verwendet. Jede Richtlinienanweisung, die zu einer Ressourcenrichtlinie hinzugefügt wird, muss mindestens einen Prinzipal angeben.
Im folgenden Beispiel bucket
gewährt der Amazon S3 S3-Bucket eine Rolle mit der entsprechenden s3:SomeAction
Berechtigung für sich selbst.
bucket.addToResourcePolicy(new iam.PolicyStatement({
effect: iam.Effect.ALLOW,
actions: ['s3:SomeAction'],
resources: [bucket.bucketArn],
principals: [role]
}));
Verwenden von externen IAM-Objekten
Wenn Sie einen IAM-Benutzer, Prinzipal, Gruppe oder Rolle außerhalb Ihrer AWS CDK App definiert haben, können Sie dieses IAM-Objekt in Ihrer App verwenden. AWS CDK 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 Richtlinienerklärungen zu erstellen, wie zuvor erläutert.
-
Für Benutzer rufen Sie an
User.fromUserArn()
oderUser.fromUserName()
.User.fromUserAttributes()
ist ebenfalls verfügbar, bietet aber derzeit die gleiche Funktionalität wieUser.fromUserArn()
. -
Für Prinzipale instanziieren Sie ein Objekt.
ArnPrincipal
-
Rufen Sie für Gruppen oder an.
Group.fromGroupArn()
Group.fromGroupName()
-
Rufen Sie für Rollen an
Role.fromRoleArn()
oderRole.fromRoleName()
.
Richtlinien (einschließlich verwalteter Richtlinien) können mit den folgenden Methoden auf ähnliche Weise verwendet werden. Sie können Verweise auf diese Objekte überall dort 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.