# Keamanan dan Privasi

## Data dan akses
Inventarisasikan data identitas, akademik, keuangan, dokumen, dan kredensial; tetapkan tujuan, pemilik, akses, retensi, dan prosedur penghapusan/arsip. Batasi akses berdasar [RBAC](08-rbac.md); minimalkan data yang ditampilkan dan diekspor.

## Kontrol aplikasi
- HTTPS produksi; password hashing bawaan framework; proteksi CSRF, validasi input, escaping output, rate limit autentikasi, serta sesi dengan cookie Secure/HTTP-only/SameSite dan enkripsi pada production.
- Policy server-side, prinsip least privilege pada DB dan akun hosting, MFA untuk administrator bila tersedia.
- Upload divalidasi tipe/ukuran, disimpan privat, nama file acak, akses melalui otorisasi.
- Secret di environment/secret manager, `.env` di luar web root, tidak masuk Git, tiket, tangkapan layar, atau log.
- Audit perubahan nilai, status mahasiswa, keuangan, akses, ekspor, dan sinkronisasi. Log tidak menyimpan secret atau data pribadi berlebihan.
- Patch dependency rutin, lockfile ditinjau, backup terenkripsi dan aksesnya dibatasi. Sebelum rilis, audit paket terkunci dengan `composer audit --locked` dan `npm audit --package-lock-only`; perbarui paket yang terdampak pada patch kompatibel, lalu ulangi audit. Jangan mengabaikan advisory atau memakai pembaruan major otomatis tanpa meninjau dampaknya.

## Status implementasi awal
- Halaman aplikasi dan pengaturan wajib login; login membatasi percobaan per email dan alamat IP, meregenerasi sesi saat berhasil, dan logout menginvalidasi sesi. Setiap permintaan pada route terlindungi memeriksa akun masih aktif; sesi akun yang dinonaktifkan dicabut dan dicatat sebagai logout.
- Formulir PMB publik menerima data kontak dan pilihan prodi pada siklus yang sedang dibuka, memakai rate limit, mencatat waktu persetujuan, dan menerima maksimal lima dokumen PDF/JPG/PNG masing-masing hingga 5 MB. Berkas menggunakan nama acak dan disk privat; unduhan memerlukan `admission.view` serta pemeriksaan kepemilikan aplikasi. Login pendaftar, verifikasi email, jadwal retensi, dan kanal permintaan koreksi/penghapusan belum tersedia; tetapkan kebijakan privasi kampus sebelum membuka pendaftaran produksi. Tidak ada kredensial admin bawaan. Buat akun awal dengan `php artisan siakad:make-admin`; kata sandi minimal 12 karakter dengan huruf besar/kecil dan angka, dimasukkan melalui prompt tersembunyi.
- Pemulihan kata sandi akun staf memakai token broker Laravel berumur terbatas, pembatasan pengiriman dan endpoint, jawaban umum yang tidak mengungkap keberadaan akun, dan hanya mengirim ke akun aktif. Reset memakai aturan kata sandi minimal 12 karakter dengan huruf besar/kecil dan angka; event reset dicatat tanpa merekam email atau nilai kata sandi. Pada driver sesi database, reset juga mencabut sesi aktif akun. SMTP harus dikonfigurasi dan diuji sebelum fitur ini dipakai di produksi.
- Pengguna yang sudah masuk dapat mengganti kata sandi dari menu akun dengan verifikasi kata sandi lama, aturan kata sandi yang sama, pencabutan sesi database lain, dan audit tanpa nilai rahasia; sesi aktif yang sedang digunakan dipertahankan.
- Akun lama yang ada ketika migrasi akses diterapkan dinonaktifkan sebagai default aman; hanya aktifkan akun yang telah diverifikasi. Akun baru yang dibuat melalui perintah admin aktif dan diberi peran superadmin.
- Akun role dosen harus ditautkan ke satu record dosen; portal memfilter kelas melalui jadwal dengan `lecturer_id` milik akun dan hanya memuat pendaftar KRS yang disetujui. Endpoint presensi/nilai memeriksa ulang penugasan kelas di server; dosen dapat mencatat presensi serta mengajukan nilai kelasnya, tetapi tidak dapat menyetujui finalisasi nilai.
- RBAC melindungi route dan editor role/permission. Manajemen akun staf tersedia bagi permission `users.manage`. Audit perubahan pilihan model menyimpan aktor, waktu, entitas, field, serta nilai sebelum/sesudah hanya untuk allowlist; atribut identitas pribadi, ID lokal/eksternal, dan secret tidak dicatat sebagai nilai. Login/logout, perubahan akun dan role, ekspor mahasiswa/laporan, unduhan dokumen PMB, perubahan mapping eksternal, serta setiap respons sukses GET pada route aplikasi terlindungi dicatat pada tingkat nama route; ekspor/unduhan memakai event khusus dan tidak membuat event baca duplikat. Log baca tidak menyimpan URL/parameter record, nilai pencarian, atau isi respons. Perubahan permission langsung di luar UI belum lengkap. MFA, kebijakan sesi lanjutan, retensi log, dan peninjauan keamanan deployment belum tersedia. Gunakan `php artisan siakad:check-readiness` sebelum UAT untuk memeriksa konfigurasi teknis; perintah tersebut tidak menggantikan pemeriksaan keamanan maupun persetujuan kampus. Jangan rilis publik sebelum kontrol sesuai kebutuhan kampus dilengkapi.

## Insiden dan privasi
Tetapkan kontak, langkah isolasi, pencatatan, pemulihan, dan penilaian notifikasi sesuai kebijakan serta kewajiban hukum yang berlaku. Jadwal retensi/penghapusan perlu disahkan kampus dan penasihat terkait.

## Penerimaan
Uji akses lintas peran, unggahan berbahaya, brute force/rate limit, session expiry, CSRF, ekspor, restore backup, dan redaksi log. Jangan memakai data nyata untuk pengembangan atau demo tanpa dasar dan pengamanan yang disetujui.
