Izin dan AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

Ini adalah Panduan Pengembang AWS CDK v2. CDKV1 yang lebih lama memasuki pemeliharaan pada 1 Juni 2022 dan mengakhiri dukungan pada 1 Juni 2023.

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Izin dan AWS CDK

AWS Construct Library menggunakan beberapa idiom umum yang diimplementasikan secara luas untuk mengelola akses dan izin. IAMModul ini memberi Anda alat yang Anda butuhkan untuk menggunakan idiom ini.

AWS CDK digunakan AWS CloudFormation untuk menyebarkan perubahan. Setiap penyebaran melibatkan aktor (baik pengembang, atau sistem otomatis) yang memulai AWS CloudFormation penerapan. Dalam melakukan ini, aktor akan mengambil satu atau lebih IAM Identitas (pengguna atau peran) dan secara opsional memberikan peran ke. AWS CloudFormation

Jika Anda menggunakannya AWS IAM Identity Center untuk mengautentikasi sebagai pengguna, maka penyedia masuk tunggal menyediakan kredensil sesi berumur pendek yang mengizinkan Anda untuk bertindak sebagai peran yang telah ditentukan sebelumnya. IAM Untuk mempelajari cara AWS CDK memperoleh AWS kredensil dari autentikasi Pusat IAM Identitas, lihat Memahami otentikasi Pusat IAM Identitas di Panduan Referensi Alat dan Alat.AWS SDKs

Pengguna utama

IAMPrincipal adalah AWS entitas yang diautentikasi yang mewakili pengguna, layanan, atau aplikasi yang dapat memanggil AWS APIs. AWS Construct Library mendukung penetapan prinsipal dalam beberapa cara fleksibel untuk memberi mereka akses sumber daya Anda. AWS

Dalam konteks keamanan, istilah “prinsipal” mengacu secara khusus pada entitas yang diautentikasi seperti pengguna. Objek seperti grup dan peran tidak mewakili pengguna (dan entitas lain yang diautentikasi) melainkan mengidentifikasi mereka secara tidak langsung untuk tujuan pemberian izin.

Misalnya, jika Anda membuat IAM grup, Anda dapat memberikan grup (dan dengan demikian anggotanya) akses tulis ke RDS tabel Amazon. Namun, grup itu sendiri bukan prinsipal karena tidak mewakili satu entitas (juga, Anda tidak dapat masuk ke grup).

Di CDK IAM pustaka, kelas yang secara langsung atau tidak langsung mengidentifikasi prinsipal mengimplementasikan IPrincipalantarmuka, memungkinkan objek ini digunakan secara bergantian dalam kebijakan akses. Namun, tidak semua dari mereka adalah kepala sekolah dalam arti keamanan. Benda-benda ini meliputi:

  1. IAMsumber daya sepertiRole,User, dan Group

  2. Prinsipal layanan () new iam.ServicePrincipal('service.amazonaws.com')

  3. Kepala sekolah federasi () new iam.FederatedPrincipal('cognito-identity.amazonaws.com')

  4. Prinsipal akun (new iam.AccountPrincipal('0123456789012'))

  5. Prinsipal pengguna kanonik () new iam.CanonicalUserPrincipal('79a59d[...]7ef2be')

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

  7. ARNPrinsipal sewenang-wenang () new iam.ArnPrincipal(res.arn)

  8. An iam.CompositePrincipal(principal1, principal2, ...) untuk mempercayai banyak prinsip

Izin

Setiap konstruksi yang mewakili sumber daya yang dapat diakses, seperti bucket Amazon S3 atau tabel Amazon DynamoDB, memiliki metode yang memberikan akses ke entitas lain. Semua metode tersebut memiliki nama yang dimulai dengan hibah.

Misalnya, bucket Amazon S3 memiliki metode dan grantRead (grantReadWritePython:grant_read,grant_read_write) untuk mengaktifkan akses baca dan baca/tulis, masing-masing, dari entitas ke bucket. Entitas tidak harus tahu persis IAM izin Amazon S3 mana yang diperlukan untuk melakukan operasi ini.

Argumen pertama dari metode hibah selalu bertipe IGrantable. Antarmuka ini mewakili entitas yang dapat diberikan izin. Artinya, itu mewakili sumber daya dengan peran, seperti IAM objekRole,User, danGroup.

Entitas lain juga dapat diberikan izin. Misalnya, nanti dalam topik ini, kami menunjukkan cara memberikan akses CodeBuild proyek ke bucket Amazon S3. Umumnya, peran terkait diperoleh melalui role properti pada entitas yang diberikan akses.

Sumber daya yang menggunakan peran eksekusi, sepertilambda.Function, juga diterapkanIGrantable, sehingga Anda dapat memberi mereka akses secara langsung alih-alih memberikan akses ke peran mereka. Misalnya, jika bucket adalah bucket Amazon S3, dan function merupakan fungsi Lambda, kode berikut memberikan akses baca fungsi ke bucket.

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

Terkadang izin harus diterapkan saat tumpukan Anda sedang digunakan. Salah satu kasus tersebut adalah ketika Anda memberikan akses sumber daya AWS CloudFormation khusus ke beberapa sumber daya lain. Sumber daya kustom akan dipanggil selama penerapan, sehingga harus memiliki izin yang ditentukan pada waktu penerapan.

Kasus lain adalah ketika layanan memverifikasi bahwa peran yang Anda berikan kepadanya memiliki kebijakan yang tepat diterapkan. (Sejumlah AWS layanan melakukan ini untuk memastikan bahwa Anda tidak lupa untuk menetapkan kebijakan.) Dalam kasus tersebut, penerapan mungkin gagal jika izin diterapkan terlambat.

Untuk memaksa izin hibah diterapkan sebelum sumber daya lain dibuat, Anda dapat menambahkan ketergantungan pada hibah itu sendiri, seperti yang ditunjukkan di sini. Meskipun nilai pengembalian metode hibah biasanya dibuang, setiap metode hibah sebenarnya mengembalikan objekiam.Grant.

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);

Peran

IAMPaket berisi Role konstruksi yang mewakili IAM peran. Kode berikut menciptakan peran baru, mempercayai EC2 layanan Amazon.

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 });

Anda dapat menambahkan izin ke peran dengan memanggil addToPolicy metode peran (Pythonadd_to_policy:), meneruskan PolicyStatement sebuah yang mendefinisikan aturan yang akan ditambahkan. Pernyataan ditambahkan ke kebijakan default peran; jika tidak ada, satu akan dibuat.

Contoh berikut menambahkan pernyataan Deny kebijakan untuk peran untuk tindakan ec2:SomeAction dan s3:AnotherAction sumber daya bucket dan otherRole (Python:other_role), dengan syarat bahwa layanan resmi adalah. 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" } } }));

Pada contoh sebelumnya, kita telah membuat PolicyStatement inline baru dengan panggilan (addToPolicyPython:). add_to_policy Anda juga dapat meneruskan pernyataan kebijakan yang ada atau yang telah Anda modifikasi. PolicyStatementObjek memiliki banyak metode untuk menambahkan prinsip, sumber daya, kondisi, dan tindakan.

Jika Anda menggunakan konstruksi yang membutuhkan peran agar berfungsi dengan benar, Anda dapat melakukan salah satu hal berikut:

  • Lewati peran yang ada saat membuat instance objek konstruksi.

  • Biarkan konstruksi menciptakan peran baru untuk Anda, mempercayai prinsip layanan yang tepat. Contoh berikut menggunakan konstruksi seperti itu: CodeBuild proyek.

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 });

Setelah objek dibuat, peran (apakah peran diteruskan atau peran default yang dibuat oleh konstruksi) tersedia sebagai propertirole. Namun, properti ini tidak tersedia pada sumber daya eksternal. Oleh karena itu, konstruksi ini memiliki metode addToRolePolicy (Pythonadd_to_role_policy:).

Metode ini tidak melakukan apa-apa jika konstruksinya adalah sumber daya eksternal, dan ia memanggil metode addToPolicy (Pythonadd_to_policy:) dari properti sebaliknyarole. Ini menghemat kesulitan menangani kasus yang tidak ditentukan secara eksplisit.

Contoh berikut menunjukkan:

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 }));

Kebijakan sumber daya

Beberapa sumber daya di AWS, seperti bucket dan IAM peran Amazon S3, juga memiliki kebijakan sumber daya. Konstruksi ini memiliki addToResourcePolicy metode (Pythonadd_to_resource_policy:), yang mengambil PolicyStatement sebagai argumennya. Setiap pernyataan kebijakan yang ditambahkan ke kebijakan sumber daya harus menentukan setidaknya satu prinsipal.

Dalam contoh berikut, bucket Amazon S3 bucket memberikan peran dengan s3:SomeAction izin untuk dirinya sendiri.

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 } }));

Menggunakan IAM objek eksternal

Jika Anda telah menetapkan IAM pengguna, prinsipal, grup, atau peran di luar AWS CDK aplikasi, Anda dapat menggunakan IAM objek tersebut di AWS CDK aplikasi. Untuk melakukannya, buat referensi untuk itu menggunakan namanyaARN. (Gunakan nama untuk pengguna, grup, dan peran.) Referensi yang dikembalikan kemudian dapat digunakan untuk memberikan izin atau untuk membuat pernyataan kebijakan seperti yang dijelaskan sebelumnya.

Kebijakan (termasuk kebijakan terkelola) dapat digunakan dengan cara yang sama menggunakan metode berikut. Anda dapat menggunakan referensi ke objek ini di mana pun IAM kebijakan diperlukan.

catatan

Seperti semua referensi ke AWS sumber daya eksternal, Anda tidak dapat memodifikasi IAM objek eksternal di CDK aplikasi Anda.