Use Cases (Diperbarui: 3/6/2026)

Claude Code dan AWS IAM: panduan praktis kebijakan hak akses minimum

Rancang dan validasi kebijakan AWS IAM hak akses minimum dengan Claude Code, Access Analyzer, dan CDK.

Claude Code dan AWS IAM: panduan praktis kebijakan hak akses minimum

AWS IAM menentukan siapa boleh melakukan apa pada resource AWS mana. Kebijakan terlihat seperti dokumen JSON biasa, tetapi Action: "*" atau Resource: "*" bisa memberi Lambda, job CI, atau akun manusia akses yang jauh lebih luas dari kebutuhan. Claude Code berguna untuk membuat draf dan meninjau IAM, tetapi tidak boleh menjadi pembuat izin yang langsung dipercaya tanpa pemeriksaan.

Alur yang aman adalah: tulis use case, minta Claude Code membuat draf, validasi dengan IAM Access Analyzer, periksa ARN dan batas bisnis secara manual, jadikan kode dengan CDK, lalu uji aksi yang boleh berhasil dan aksi yang harus ditolak. Untuk pemula, kebijakan adalah aturan izin, role adalah identitas sementara yang diasumsikan workload, dan principal adalah pengguna atau service yang memakai izin tersebut.

Masa mengubah proses ini setelah menemukan izin S3 yang terlalu luas masih menempel pada Lambda produksi beberapa minggu setelah perbaikan darurat. Tidak ada kebocoran, tetapi pelajarannya jelas: Claude Code mengurangi waktu menulis, bukan tanggung jawab peninjauan.

Jadikan dokumentasi AWS sebagai acuan

Panduan ini mengikuti referensi resmi AWS berikut:

Intinya: gunakan kredensial sementara dan role, terapkan hak akses minimum, validasi dengan Access Analyzer, pakai condition dengan hati-hati, dan hapus user, role, izin, serta kredensial yang tidak lagi dipakai.

flowchart LR
  A["Tulis use case"] --> B["Draf Claude Code"]
  B --> C["Review ARN oleh manusia"]
  C --> D["IAM Access Analyzer"]
  D --> E["Implementasi CDK"]
  E --> F["Tes diizinkan dan ditolak"]

Mulai dari use case konkret

Jangan hanya meminta “buatkan kebijakan IAM”. Berikan aktor, resource, operasi yang diizinkan, dan operasi yang harus tetap dilarang.

Skenario penggunaanPrincipalIzin yang diperlukanHindari secara eksplisit
Lambda pembuat thumbnailRole eksekusi LambdaMembaca satu prefix S3, menulis satu prefix S3, menulis satu tabel DynamoDB, publish satu topik SNS, menulis logMenghapus S3, membaca semua bucket, operasi IAM
Bantuan upload adminRole Lambda APIPutObject ke satu prefix S3, GetItem pada satu tabel DynamoDBList seluruh bucket, manajemen key KMS
Deploy dari GitHub ActionsRole CI OIDCMemperbarui satu stack CloudFormation dan Lambda targetAdministratorAccess, operasi semua region
Role baca saja untuk insidenUser federasiMencari CloudWatch Logs, membaca X-Ray, GetItem pada tabel terkaitUpdate, delete, membaca secret

Kolom larangan penting. Tanpa batas negatif yang jelas, alat generatif sering mengisi informasi yang kurang dengan izin terlalu luas.

Kebijakan Lambda siap salin

Kebijakan ini untuk Lambda yang membaca gambar dari S3, menulis thumbnail ke prefix S3 lain, menyimpan metadata di DynamoDB, mengirim alert ke SNS, dan menulis CloudWatch Logs. Log group diasumsikan dibuat lebih dulu oleh kode infrastruktur, sehingga role tidak perlu logs:CreateLogGroup.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "ReadSourceImages",
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::user-uploads-prod/incoming/*"
    },
    {
      "Sid": "WriteThumbnails",
      "Effect": "Allow",
      "Action": ["s3:PutObject"],
      "Resource": "arn:aws:s3:::user-thumbnails-prod/thumbnails/*",
      "Condition": {
        "StringEquals": {
          "s3:x-amz-server-side-encryption": "AES256"
        }
      }
    },
    {
      "Sid": "WriteMetadata",
      "Effect": "Allow",
      "Action": ["dynamodb:PutItem", "dynamodb:UpdateItem"],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/image-metadata"
    },
    {
      "Sid": "PublishAlerts",
      "Effect": "Allow",
      "Action": ["sns:Publish"],
      "Resource": "arn:aws:sns:ap-northeast-1:123456789012:alert-topic"
    },
    {
      "Sid": "WriteLambdaLogs",
      "Effect": "Allow",
      "Action": ["logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/image-worker-prod:*"
    }
  ]
}

Simpan sebagai policy-lambda-image-worker.json, lalu jalankan:

aws accessanalyzer validate-policy \
  --policy-document file://policy-lambda-image-worker.json \
  --policy-type IDENTITY_POLICY \
  --query "findings[?findingType!='SUGGESTION']"

Setelah itu minta peninjauan terstruktur:

claude -p "Review policy-lambda-image-worker.json sebagai kebijakan AWS IAM hak akses minimum.
Konteks: Lambda membaca S3 incoming/, menulis thumbnails/, menulis DynamoDB image-metadata, publish SNS alert-topic, dan menulis CloudWatch Logs.
Periksa: wildcard, izin delete, Resource terlalu luas, Condition benar, dan cakupan log.
Kembalikan tabel Sid / risiko / alasan / perbaikan lebih aman."

Access Analyzer memeriksa tata bahasa, ARN, nama action, condition key, dan temuan keamanan. Namun ia tidak tahu apakah produk Anda benar-benar membutuhkan izin tersebut. Keputusan akhir tetap di engineer.

Implementasikan role dengan CDK

Jangan biarkan izin yang sudah ditinjau hanya hidup di console. Dengan TypeScript CDK, role, log group, dan kebijakan bisa ditinjau dalam perubahan kode yang sama.

import * as cdk from "aws-cdk-lib";
import { Stack, StackProps, aws_iam as iam, aws_logs as logs } from "aws-cdk-lib";
import { Construct } from "constructs";

export class ImageWorkerIamStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);

    const account = Stack.of(this).account;
    const region = Stack.of(this).region;

    new logs.LogGroup(this, "ImageWorkerLogGroup", {
      logGroupName: "/aws/lambda/image-worker-prod",
      retention: logs.RetentionDays.ONE_MONTH,
      removalPolicy: cdk.RemovalPolicy.RETAIN,
    });

    const role = new iam.Role(this, "ImageWorkerRole", {
      assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
      description: "Execution role for image-worker-prod Lambda",
    });

    role.addToPolicy(new iam.PolicyStatement({
      sid: "ReadSourceImages",
      actions: ["s3:GetObject"],
      resources: ["arn:aws:s3:::user-uploads-prod/incoming/*"],
    }));

    role.addToPolicy(new iam.PolicyStatement({
      sid: "WriteThumbnails",
      actions: ["s3:PutObject"],
      resources: ["arn:aws:s3:::user-thumbnails-prod/thumbnails/*"],
      conditions: {
        StringEquals: {
          "s3:x-amz-server-side-encryption": "AES256",
        },
      },
    }));

    role.addToPolicy(new iam.PolicyStatement({
      sid: "WriteMetadataAndAlerts",
      actions: ["dynamodb:PutItem", "dynamodb:UpdateItem", "sns:Publish"],
      resources: [
        `arn:aws:dynamodb:${region}:${account}:table/image-metadata`,
        `arn:aws:sns:${region}:${account}:alert-topic`,
      ],
    }));

    role.addToPolicy(new iam.PolicyStatement({
      sid: "WriteLambdaLogs",
      actions: ["logs:CreateLogStream", "logs:PutLogEvents"],
      resources: [
        `arn:aws:logs:${region}:${account}:log-group:/aws/lambda/image-worker-prod:*`,
      ],
    }));
  }
}

CI memakai OIDC, bukan key jangka panjang

Untuk CI/CD, hindari menyimpan AWS access key jangka panjang di secret repository. GitHub Actions dapat mengasumsikan role IAM melalui OIDC dan menerima kredensial sementara.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::123456789012:oidc-provider/token.actions.githubusercontent.com"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
        },
        "StringLike": {
          "token.actions.githubusercontent.com:sub": "repo:example-org/example-repo:ref:refs/heads/main"
        }
      }
    }
  ]
}

Ini adalah trust policy: menentukan siapa yang boleh mengasumsikan role. Permissions policy menentukan apa yang boleh dilakukan setelah role diasumsikan. Review keduanya secara terpisah.

Kegagalan yang sering muncul

Pertama, akses admin sementara tidak pernah dicabut. Jika keadaan darurat memaksa izin luas, catat pemilik, tanggal kedaluwarsa, pemeriksaan CloudTrail, dan validasi ulang Access Analyzer.

Kedua, ARN bucket dan objek S3 tertukar. s3:ListBucket memakai arn:aws:s3:::bucket-name; s3:GetObject dan s3:PutObject memakai arn:aws:s3:::bucket-name/prefix/*.

Ketiga, condition IP dipasang ke role Lambda tanpa memahami panggilan antar service. aws:SourceIp bisa cocok untuk manusia atau API publik, tetapi dapat memutus alur internal AWS.

Keempat, hanya menguji jalur sukses. Pastikan juga s3:DeleteObject, bucket yang tidak terkait, tabel DynamoDB yang tidak terkait, dan aksi IAM ditolak.

Bacaan terkait dan langkah berikutnya

Untuk detail lain, baca panduan AWS Lambda, panduan AWS S3, panduan AWS CloudWatch, dan praktik keamanan Claude Code.

Jika tim Anda ingin menstandarkan Claude Code, AWS IAM, CDK, dan peninjauan izin CI, mulai dari halaman pelatihan dan konsultasi. Untuk belajar sendiri, gunakan lembar ringkas gratis dan template di halaman produk.

Saya menguji alur ini dengan membuat draf policy lewat Claude Code, memvalidasi JSON, dan meninjau CDK terhadap tabel use case yang sama. Perbaikan terbesar muncul saat operasi terlarang ditulis lebih dulu: izin S3 terlalu luas dan wildcard log yang tidak perlu terlihat sebelum deployment.

#claude-code #aws #iam #security #typescript #infrastructure
Gratis

PDF gratis: cheatsheet Claude Code

Masukkan email dan unduh satu halaman berisi command, kebiasaan review, dan workflow aman.

Kami menjaga datamu dan tidak mengirim spam.

Masa

Tentang penulis

Masa

Engineer yang berfokus pada workflow Claude Code praktis dan adopsi tim.