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*)"
]
}
}
| Pengaturan | Arti |
|---|---|
allow | Jalankan tanpa konfirmasi |
deny | Jangan pernah jalankan (diblokir sepenuhnya) |
ask | Memerlukan 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.
| Ancaman | Tindakan Pencegahan |
|---|---|
| Kebocoran kunci API | .env + .gitignore + Hook pemindaian secret |
| Penghapusan yang tidak diinginkan | Daftar deny + Hook pre-penghapusan |
| Kesalahan produksi | Pengaturan khusus produksi + larangan CLAUDE.md |
| Kontaminasi commit | Hook 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
- Panduan Izin Claude Code
- Kasus Kegagalan Keamanan Claude Code
- Panduan Lengkap Integrasi Claude Code + SaaS
- Praktik Terbaik CLAUDE.md
Referensi
Tingkatkan alur kerja Claude Code kamu
50 template prompt yang sudah teruji, siap copy-paste ke Claude Code sekarang juga.
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.
Tentang Penulis
Masa
Engineer yang aktif menggunakan Claude Code. Mengelola claudecode-lab.com, media teknologi 10 bahasa dengan lebih dari 2.000 halaman.
Artikel Terkait
7 Kasus Keamanan Gagal Claude Code | Insiden Nyata dan Pencegahan
Tujuh insiden keamanan nyata dengan Claude Code: kebocoran .env, penghapusan DB produksi, ledakan tagihan dan lainnya — dengan analisis penyebab dan kode pencegahan.
Panduan Lengkap Izin Claude Code | settings.json, Hooks, dan Allowlist Dijelaskan
Penjelasan lengkap pengaturan izin Claude Code. Pelajari penggunaan allow/deny/ask, otomatisasi dengan Hooks, settings.json per lingkungan, dan pola praktis — dengan kode yang berfungsi.
Panduan Lengkap Harness Engineering: Membangun Agen AI ala Claude Code
Prompt saja tidak cukup untuk menjinakkan LLM. Pelajari cara merangkai tool, konteks, dan control loop menjadi harness, lengkap dengan kode yang bisa dijalankan dan arsitektur Claude Code sebagai panduan.