Tips & Tricks

Panduan Lengkap Keamanan Claude Code: Kunci API, Izin, dan Perlindungan Produksi

Panduan keamanan praktis untuk menggunakan Claude Code dengan aman. Dari manajemen kunci API hingga pengaturan izin, otomasi berbasis Hooks, dan perlindungan lingkungan produksi — dengan contoh kode yang berfungsi.

Claude Code memiliki kemampuan manipulasi file dan eksekusi perintah yang powerful — tetapi konfigurasi yang salah dapat menyebabkan kecelakaan yang tidak dapat diperbaiki. Melakukan commit file .env, menghapus database produksi secara tidak sengaja, mencetak kunci API ke log — ini semua adalah insiden nyata yang disebabkan oleh penggunaan Claude Code tanpa perlindungan yang memadai.

Artikel ini memberikan penjelasan tingkat implementasi tentang praktik terbaik keamanan untuk Claude Code. Fokusnya bukan pada teori, melainkan pada konfigurasi siap pakai dan kode preventif yang bisa langsung Anda salin dan terapkan.

Mengapa Claude Code Membutuhkan Langkah Keamanan

Tidak seperti editor teks biasa, Claude Code memiliki kemampuan berikut:

  • Membaca, menulis, dan menghapus file apa pun (Read / Write / Edit / Bash(rm))
  • Menjalankan perintah shell (Bash)
  • Akses jaringan (WebFetch / panggilan API)
  • Posting ke layanan eksternal (GitHub, Slack, dll.)

Semua ini dapat dieksekusi dengan persetujuan pengguna. Masalahnya adalah menyetujui setiap prompt secara mekanis membiarkan operasi yang tidak diinginkan lolos. Langkah keamanan berarti menghilangkan ruang untuk kesalahan secara struktural.

Langkah 1: Manajemen Kunci API — .env + .gitignore sebagai Fondasi

Yang TIDAK Boleh Dilakukan

// ❌ Ditulis langsung di kode sumber
const client = new Anthropic({ apiKey: "sk-ant-api03-..." });

// ❌ Ditulis di CLAUDE.md atau file konfigurasi
// ANTHROPIC_API_KEY=sk-ant-api03-...

// ❌ Disertakan dalam prompt claude -p
// Gunakan QIITA_TOKEN=abc123 untuk posting

Pendekatan yang Benar

# .env (dikecualikan dari git, disimpan hanya di mesin lokal)
ANTHROPIC_API_KEY=sk-ant-api03-...
QIITA_TOKEN=06b4441b...
SLACK_BOT_TOKEN=xoxb-...
DATABASE_URL=postgresql://...
# Selalu tambahkan ke .gitignore
.env
.env.*
.env.local
!.env.example   # ← File contoh boleh di-commit
*.pem
*.key
credentials.json
*-service-account.json
# .env.example (aman untuk di-commit, nilai dikosongkan)
ANTHROPIC_API_KEY=
QIITA_TOKEN=
SLACK_BOT_TOKEN=
DATABASE_URL=

Membaca Variabel dalam Kode

// ✅ Baca dari environment variables
import { config } from "dotenv";
config();

const token = process.env.QIITA_TOKEN;
if (!token) throw new Error("QIITA_TOKEN belum diset. Harap periksa file .env Anda.");

Dokumentasikan Larangan di CLAUDE.md

## Larangan Keamanan
- Jangan pernah menyertakan kunci API atau token dalam prompt
- Jangan pernah membaca dan menampilkan isi file .env
- Jangan pernah menulis nilai environment variable di log atau komentar
- Jangan pernah console.log isi process.env

Langkah 2: Pemindaian Secret Sebelum Commit

Bahkan dengan .env di .gitignore, entri yang tidak sengaja di file lain atau kesalahan copy-paste masih bisa terjadi. Tambahkan pemindaian otomatis pre-commit.

Pemeriksaan Pre-Commit dengan Hooks

.claude/settings.json:

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash(git commit*)",
        "hooks": [
          {
            "type": "command",
            "command": "node scripts/secret-scan.mjs"
          }
        ]
      }
    ]
  }
}

scripts/secret-scan.mjs:

import { execSync } from "child_process";

// Dapatkan perubahan yang di-staging
const diff = execSync("git diff --cached").toString();

const PATTERNS = [
  { name: "Kunci API Anthropic", re: /sk-ant-api\d+-[A-Za-z0-9_-]{80,}/ },
  { name: "Kunci API OpenAI", re: /sk-[A-Za-z0-9]{48}/ },
  { name: "Kunci Akses AWS", re: /AKIA[0-9A-Z]{16}/ },
  { name: "Token Slack", re: /xox[baprs]-[0-9A-Za-z-]{10,}/ },
  { name: "Secret Generik", re: /[Ss]ecret[_-]?[Kk]ey\s*[:=]\s*['"][^'"]{10,}['"]/ },
];

const found = PATTERNS.filter(({ re }) => re.test(diff));

if (found.length > 0) {
  console.error("🚨 Secret terdeteksi! Membatalkan commit:");
  found.forEach(({ name }) => console.error(`  - ${name}`));
  console.error("\nSolusi: jalankan `git reset HEAD <file>` untuk unstage file tersebut");
  process.exit(1);  // Exit code 1 → Hook memblokir perintah
}

console.log("✓ Pemindaian secret: tidak ada masalah ditemukan");
process.exit(0);

Ini berarti saat Claude Code mencoba menjalankan git commit, pemindaian otomatis langsung berjalan dan kebocoran yang terdeteksi akan diblokir.

Langkah 3: Konfigurasi Mode Izin

Pengaturan izinkan/tolak Claude Code dapat dikontrol secara granular di tingkat file.

Pengaturan Izin di .claude/settings.json

{
  "permissions": {
    "allow": [
      "Read(**)",
      "Glob(**)",
      "Grep(**)"
    ],
    "deny": [
      "Bash(rm -rf*)",
      "Bash(git push --force*)",
      "Bash(git reset --hard*)",
      "Bash(DROP TABLE*)",
      "Bash(truncate*)",
      "Bash(curl * | bash)",
      "Bash(wget * | sh)"
    ],
    "ask": [
      "Write(**)",
      "Edit(**)",
      "Bash(git commit*)",
      "Bash(git push*)",
      "Bash(npm publish*)",
      "Bash(wrangler pages deploy*)"
    ]
  }
}
PengaturanArti
allowJalankan tanpa konfirmasi
denyJangan pernah jalankan (diblokir sepenuhnya)
askMemerlukan persetujuan setiap kali

Prinsip utama: Perintah destruktif masuk deny, operasi tulis masuk ask, operasi baca masuk allow.

File Konfigurasi Khusus Produksi

Untuk lingkungan produksi, membatasi hanya baca adalah pendekatan paling aman.

// .claude/settings.production.json
{
  "permissions": {
    "allow": ["Read(**)", "Glob(**)", "Grep(**)", "Bash(git log*)", "Bash(git diff*)"],
    "deny": ["Write(**)", "Edit(**)", "Bash(git push*)", "Bash(rm*)", "Bash(*deploy*)"],
    "ask": []
  }
}
# Tentukan secara eksplisit saat bekerja di produksi
CLAUDE_SETTINGS=.claude/settings.production.json claude

Langkah 4: Perlindungan Lingkungan Produksi

Pisahkan Target Koneksi Secara Eksplisit

## CLAUDE.md — Aturan Lingkungan Produksi

## Deteksi Lingkungan
- Jika DATABASE_URL mengandung 'prod' atau 'production', ini adalah **lingkungan produksi**
- Di produksi, jangan pernah jalankan:
  - DROP / TRUNCATE / DELETE (tanpa klausa WHERE)
  - Migrasi (memerlukan konfirmasi sebelumnya)
  - Penghapusan file massal

## Alur Konfirmasi
Semua perubahan produksi harus:
1. Diuji dulu di lingkungan staging
2. Mendapatkan konfirmasi pengguna
3. Melaporkan hasil setelah eksekusi

Kontrol Koneksi dengan Environment Variables

// scripts/db-query.mjs
const env = process.env.NODE_ENV ?? "development";
const dbUrl = process.env.DATABASE_URL;

if (env === "production" && process.argv.includes("--write")) {
  console.error("❌ Menulis ke produksi memerlukan flag --force-production");
  process.exit(1);
}

Langkah 5: Pengaman Operasi File

Otomasi Backup Sebelum Penghapusan

// Hooks di .claude/settings.json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash(rm *)",
        "hooks": [
          {
            "type": "command",
            "command": "echo '⚠️  Perintah hapus akan segera dijalankan. Tekan Ctrl+C untuk membatalkan.' && sleep 3"
          }
        ]
      }
    ]
  }
}

Lindungi File Penting dari Pengeditan yang Tidak Sengaja

## CLAUDE.md — File yang Tidak Boleh Dimodifikasi

File-file berikut **tidak boleh pernah diedit**:
- .env (berisi environment variables dan kunci rahasia)
- wrangler.toml (konfigurasi produksi Cloudflare)
- scripts/deploy.sh (skrip deployment)
- .github/workflows/*.yml (konfigurasi CI/CD)

Jika perubahan diperlukan, konfirmasi dulu dengan pengguna.

5 Jebakan Umum

1. Menambahkan .gitignore setelah fakta sudah terlambat File .env yang sudah di-commit tetap ada di riwayat git meskipun kemudian ditambahkan ke .gitignore.

# Penghapusan lengkap dari riwayat (perhatian: memerlukan force push)
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch .env" \
  --prune-empty --tag-name-filter cat -- --all

# Atau gunakan BFG Repo Cleaner

Jika file sudah di-push ke GitHub, selalu rotasi kunci API Anda terlebih dahulu sebelum membersihkan riwayat.

2. Menyimpan file JSON service account di repositori Kunci service account untuk Google Cloud atau AWS sering didistribusikan sebagai file .json, tetapi menyimpannya di repositori berbahaya. Konversikan ke environment variables atau migrasikan ke Secret Manager (AWS Secrets Manager / GCP Secret Manager).

3. Menjalankan perintah interaktif dengan tool Bash Selama eksekusi headless dengan claude -p, perintah yang memerlukan input interaktif seperti sudo atau vim akan menyebabkan proses hang. Gunakan hanya perintah non-interaktif.

4. Menyertakan kredensial dalam pesan error

// ❌ Berbahaya: kunci API muncul di log
throw new Error(`Autentikasi gagal: token=${process.env.TOKEN}`);

// ✅ Aman: jangan tampilkan nilainya
throw new Error(`Autentikasi gagal: harap periksa environment variable TOKEN`);

5. Menggunakan ulang pengaturan izin yang sama di semua proyek Menggunakan settings.json yang sama untuk proyek pribadi dan pekerjaan berarti pengaturan longgar dari proyek pribadi dapat menimpa persyaratan yang lebih ketat dari proyek pekerjaan. Kelola .claude/settings.json secara terpisah untuk setiap proyek.

Daftar Periksa Keamanan

Daftar periksa untuk menyiapkan proyek Claude Code:

### Pengaturan Dasar
- [ ] .env dibuat dan ditambahkan ke .gitignore
- [ ] .env.example dibuat dan dibagikan ke tim
- [ ] Diverifikasi via git log bahwa commit yang ada tidak mengandung secret

### Pengaturan Izin
- [ ] Daftar deny dikonfigurasi di .claude/settings.json
- [ ] Perintah destruktif (rm -rf, DROP TABLE, dll.) ditambahkan ke deny
- [ ] Perintah deploy produksi diset ke ask

### Otomasi
- [ ] Hook pemindaian secret pre-commit dikonfigurasi
- [ ] Larangan keamanan didokumentasikan di CLAUDE.md

### Operasi
- [ ] Jadwal rotasi kunci API ditetapkan (direkomendasikan: setiap 90 hari)
- [ ] settings.production.json khusus digunakan untuk produksi
- [ ] Alur respons insiden didokumentasikan

Ringkasan

Keamanan Claude Code bukan tentang “menerapkan pembatasan” — ini tentang membangun struktur di mana kecelakaan tidak dapat terjadi secara struktural.

AncamanTindakan Pencegahan
Kebocoran kunci API.env + .gitignore + Hook pemindaian secret
Penghapusan yang tidak diinginkanDaftar deny + Hook pre-penghapusan
Kesalahan produksiPengaturan khusus produksi + larangan CLAUDE.md
Kontaminasi commitHook PreToolUse untuk pemindaian pre-commit

Setelah dikonfigurasi, pengaturan ini praktis bebas pemeliharaan. Meluangkan 30 menit hari ini dapat mencegah insiden besar di masa mendatang.

Artikel Terkait

Referensi

#claude-code #security #api-key #permissions #devops #best-practices

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.