Use Cases

Claude Code × AWS IAM Panduan Lengkap | Buat Kebijakan Hak Akses Minimum Secara Otomatis

Optimalkan desain kebijakan AWS IAM dengan Claude Code. Pembuatan kebijakan least-privilege otomatis, tinjauan keamanan kebijakan yang ada, dan implementasi CDK—dengan contoh kode nyata.

Desain kebijakan IAM adalah pekerjaan yang “tidak mencolok tapi bisa fatal kalau salah”. Kebijakan dengan penyalahgunaan wildcard (*) menjadi sarang insiden keamanan. Namun menulis kebijakan least-privilege dari awal membutuhkan waktu.

Saya mengoperasikan arsitektur serverless yang menggabungkan Lambda, S3, DynamoDB, dan CloudWatch di lingkungan produksi. Dengan mendelegasikan desain dan tinjauan kebijakan IAM ke Claude Code, saya berhasil mengurangi waktu kerja sekitar 70%. Artikel ini menjelaskan langkah-langkah praktisnya.


Dasar IAM dalam 3 Menit

Struktur Kebijakan

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": "arn:aws:s3:::my-bucket/*",
      "Condition": {
        "StringEquals": {
          "s3:prefix": ["uploads/"]
        }
      }
    }
  ]
}
  • Effect: Allow (Izinkan) atau Deny (Tolak)
  • Action: Tindakan API yang diizinkan/ditolak
  • Resource: ARN dari resource target (lebih spesifik = lebih aman)
  • Condition: Kondisi tambahan (pembatasan IP, MFA diperlukan, dll.)

Prinsip Hak Akses Minimum

“Izinkan hanya operasi yang diperlukan, hanya pada resource yang diperlukan” adalah aturan emas IAM.

❌ Berbahaya: Penyalahgunaan wildcard
Action: "*"
Resource: "*"

✅ Aman: Tentukan secara konkret
Action: ["s3:GetObject", "s3:PutObject"]
Resource: "arn:aws:s3:::my-uploads-bucket/user-files/*"

Step 1: Jelaskan Kasus Penggunaan dan Buat Kebijakan Secara Otomatis

Membuat Kebijakan untuk Lambda

claude -p "
Buat kebijakan IAM minimum yang diperlukan dalam JSON untuk fungsi Lambda berikut.

[Pemrosesan Lambda]
- Membaca gambar dari bucket S3 'user-uploads-prod'
- Menyimpan gambar yang telah diproses ke 'user-thumbnails-prod'
- Mencatat hasil ke tabel DynamoDB 'image-metadata'
- Memberitahu topik SNS 'alert-topic' saat terjadi error
- Menulis log ke CloudWatch Logs

[Batasan]
- Operasi penghapusan tidak diperlukan
- Gunakan ID akun 123456789012, region ap-northeast-1 untuk ARN resource
- Tidak ada pembatasan IP melalui Condition (tidak diperlukan untuk Lambda)
"

Contoh yang dihasilkan:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "S3ReadSourceBucket",
      "Effect": "Allow",
      "Action": ["s3:GetObject"],
      "Resource": "arn:aws:s3:::user-uploads-prod/*"
    },
    {
      "Sid": "S3WriteThumbnailBucket",
      "Effect": "Allow",
      "Action": ["s3:PutObject"],
      "Resource": "arn:aws:s3:::user-thumbnails-prod/*"
    },
    {
      "Sid": "DynamoDBWriteMetadata",
      "Effect": "Allow",
      "Action": ["dynamodb:PutItem", "dynamodb:UpdateItem"],
      "Resource": "arn:aws:dynamodb:ap-northeast-1:123456789012:table/image-metadata"
    },
    {
      "Sid": "SNSPublishAlert",
      "Effect": "Allow",
      "Action": ["sns:Publish"],
      "Resource": "arn:aws:sns:ap-northeast-1:123456789012:alert-topic"
    },
    {
      "Sid": "CloudWatchLogs",
      "Effect": "Allow",
      "Action": [
        "logs:CreateLogGroup",
        "logs:CreateLogStream",
        "logs:PutLogEvents"
      ],
      "Resource": "arn:aws:logs:ap-northeast-1:123456789012:log-group:/aws/lambda/*"
    }
  ]
}

Step 2: Tinjauan Keamanan Kebijakan yang Ada

Minta Claude Code meninjau kebijakan yang ada untuk menemukan masalah.

claude -p "
Tinjau kebijakan IAM berikut dari sudut pandang keamanan.
Identifikasi masalah spesifik dan berikan saran remediasi yang konkret.

$(cat policy.json)
"

Masalah umum yang ditemukan Claude Code:

Masalah 1: Resource: "*" memberikan akses penuh ke S3
  → Tentukan bucket target dan prefix secara eksplisit

Masalah 2: s3:DeleteObject disertakan tetapi tidak diperlukan oleh proses
  → Hapus operasi penghapusan

Masalah 3: iam:PassRole diizinkan dengan resource wildcard
  → Batasi PassRole hanya pada ARN role tertentu (risiko privilege escalation)

Masalah 4: Aktivasi CloudTrail tidak dapat dikonfirmasi
  → Rekomendasikan mengaktifkan pencatatan operasi IAM

Step 3: Otomatisasi Desain Role

Desain Role yang Meliputi Beberapa Layanan

claude -p "
Rancang semua role IAM yang diperlukan untuk arsitektur berikut:

[Arsitektur]
- API Gateway → Lambda (autentikasi)
- Lambda → DynamoDB (baca/tulis data pengguna)
- Lambda → S3 (penyimpanan file)
- Lambda → SES (pengiriman email)
- CloudWatch Events → Lambda (pemrosesan batch)
- CodePipeline → S3, CodeBuild, Lambda (deployment)

[Format output]
- Nama dan tujuan setiap role
- Trust Policy
- Access Policy
- Output sebagai kode TypeScript AWS CDK
"

Implementasi CDK untuk Role

// lib/iam-stack.ts
import * as cdk from "aws-cdk-lib";
import * as iam from "aws-cdk-lib/aws-iam";
import * as lambda from "aws-cdk-lib/aws-lambda";

export class IamStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // Role eksekusi Lambda (hak akses minimum)
    const lambdaRole = new iam.Role(this, "ApiLambdaRole", {
      assumedBy: new iam.ServicePrincipal("lambda.amazonaws.com"),
      roleName: "api-lambda-role",
      description: "Role hak akses minimum untuk API Lambda",
    });

    // Izin baca/tulis DynamoDB (hanya tabel tertentu)
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        sid: "DynamoDBAccess",
        effect: iam.Effect.ALLOW,
        actions: [
          "dynamodb:GetItem",
          "dynamodb:PutItem",
          "dynamodb:UpdateItem",
          "dynamodb:Query",
        ],
        resources: [
          `arn:aws:dynamodb:${this.region}:${this.account}:table/users`,
          `arn:aws:dynamodb:${this.region}:${this.account}:table/users/index/*`,
        ],
      })
    );

    // Izin tulis S3 (hanya bucket dan prefix tertentu)
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        sid: "S3FileUpload",
        effect: iam.Effect.ALLOW,
        actions: ["s3:PutObject", "s3:GetObject"],
        resources: [
          `arn:aws:s3:::user-files-${this.account}/uploads/*`,
        ],
      })
    );

    // Izin kirim email SES
    lambdaRole.addToPolicy(
      new iam.PolicyStatement({
        sid: "SESSendEmail",
        effect: iam.Effect.ALLOW,
        actions: ["ses:SendEmail", "ses:SendRawEmail"],
        resources: ["*"],
        conditions: {
          StringEquals: {
            "ses:FromAddress": "[email protected]",
          },
        },
      })
    );

    // Izin tulis ke CloudWatch Logs
    lambdaRole.addManagedPolicy(
      iam.ManagedPolicy.fromAwsManagedPolicyName(
        "service-role/AWSLambdaBasicExecutionRole"
      )
    );
  }
}

Step 4: Meninjau Hasil IAM Access Analyzer

Minta Claude Code meninjau output IAM Access Analyzer.

# Ambil hasil Access Analyzer
aws accessanalyzer list-findings --analyzer-arn arn:aws:access-analyzer:... \
  --output json > analyzer-findings.json

claude -p "
Baca hasil IAM Access Analyzer berikut dan:
1. Klasifikasikan berdasarkan tingkat keparahan (HIGH/MEDIUM/LOW)
2. Identifikasi item yang memerlukan remediasi segera
3. Berikan langkah remediasi spesifik untuk setiap item

$(cat analyzer-findings.json)
"

Step 5: Desain SCP (Pagar Pembatas Seluruh Organisasi)

Saat menggunakan AWS Organizations, gunakan SCP (Service Control Policies) untuk menetapkan pagar pembatas untuk seluruh akun.

claude -p "
Rancang SCP untuk diterapkan pada akun AWS produksi.
Harus memenuhi persyaratan berikut:

1. Nonaktifkan semua region kecuali ap-northeast-1 (Tokyo) dan us-east-1 (Virginia)
2. Larang operasi API oleh akun root
3. Larang menonaktifkan atau menghapus CloudTrail
4. Larang menonaktifkan GuardDuty
5. Larang perubahan pada role IAM tertentu ('OrganizationAdminRole')
"
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "DenyUnsupportedRegions",
      "Effect": "Deny",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringNotEquals": {
          "aws:RequestedRegion": ["ap-northeast-1", "us-east-1"]
        },
        "ArnNotLike": {
          "aws:PrincipalARN": [
            "arn:aws:iam::*:role/OrganizationAdminRole"
          ]
        }
      }
    },
    {
      "Sid": "DenyCloudTrailModification",
      "Effect": "Deny",
      "Action": [
        "cloudtrail:DeleteTrail",
        "cloudtrail:StopLogging",
        "cloudtrail:UpdateTrail"
      ],
      "Resource": "*"
    }
  ]
}

4 Jebakan Umum

1. iam:PassRole dengan hak berlebihan

// ❌ Berbahaya: role apa pun bisa dilewatkan
{
  "Action": "iam:PassRole",
  "Resource": "*"
}

// ✅ Aman: hanya role tertentu
{
  "Action": "iam:PassRole",
  "Resource": "arn:aws:iam::123456789:role/MyLambdaRole",
  "Condition": {
    "StringEquals": {
      "iam:PassedToService": "lambda.amazonaws.com"
    }
  }
}

2. Penggunaan berlebihan AWS Managed Policies

Kebijakan terkelola seperti AmazonS3FullAccess memang praktis tapi mencakup jauh lebih banyak izin dari yang diperlukan. Jika Lambda hanya membaca dari S3, gunakan kebijakan kustom dengan hanya s3:GetObject.

3. Mencampur Inline Policy dan Custom Managed Policy

Inline policy tidak dapat digunakan ulang dan sulit dilacak. Standarkan ke managed policy dan kelola versinya.

4. Persyaratan MFA yang hilang melalui Conditions

Selalu wajibkan MFA saat beralih ke role administrator.

{
  "Condition": {
    "BoolIfExists": {
      "aws:MultiFactorAuthPresent": "true"
    }
  }
}

Ringkasan

TugasKontribusi Claude Code
Pembuatan kebijakanMenghasilkan kebijakan least-privilege hanya dari deskripsi
Tinjauan keamananMengidentifikasi masalah dan menyarankan perbaikan untuk kebijakan yang ada
Desain roleMerancang struktur role untuk seluruh arsitektur
Implementasi CDKMenghasilkan kode TypeScript IAM secara otomatis
Desain SCPMenghasilkan kebijakan guardrail tingkat organisasi

IAM bukan “atur sekali lalu lupakan”—tinjauan berkala sangat penting. Membiasakan Claude Code meninjau kebijakan yang ada setiap bulan adalah cara sederhana untuk terus mengurangi risiko keamanan.

Artikel Terkait

Referensi

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

Tingkatkan alur kerja Claude Code kamu

50 template prompt yang sudah teruji, siap copy-paste ke Claude Code sekarang juga.

Gratis

PDF Gratis: Cheatsheet Claude Code dalam 5 Menit

Cukup masukkan emailmu dan kami akan langsung mengirim cheatsheet PDF A4 satu halaman.

Kami menjaga data pribadimu dengan aman dan tidak pernah mengirim spam.

Masa

Tentang Penulis

Masa

Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.