Artikel ini adalah checklist operasional untuk admin IT kampus yang ingin meninjau postur keamanan portal akademik (SIAKAD, e-learning, SNBP/SNBT, beasiswa, repository, e-jurnal, e-perpustakaan) sebelum diaudit eksternal — atau setelah menerima laporan kerentanan. Disusun dari pola insiden nyata 2024-2026 di kampus Indonesia (anonim) dan disesuaikan dengan kewajiban hukum lokal: UU PDP No. 27 Tahun 2022, UU ITE No. 11/2008 jo 19/2016, dan Permendikbud No. 3 Tahun 2020 tentang standar pengelolaan TIK pendidikan tinggi.
Layer 1 — DNS & TLS Foundation (Poin 1-5)
Layer paling dasar tapi paling sering terlewat. Tanpa fondasi DNS/TLS yang benar, semua hardening di layer atas jadi kosmetik. Lima poin ini umumnya bisa diselesaikan dalam 1-3 hari dan tidak butuh budget tambahan.
Poin 1 — HTTPS Enforced (HTTP → 301 → HTTPS)
Pastikan setiap port 80 redirect 301 ke 443. Banyak portal kampus masih membiarkan HTTP active "untuk kompatibilitas" — padahal sniffing kredensial mahasiswa di kampus public-wifi adalah low-effort attack. Cek dengan curl -I http://portal.kampus.ac.id — harus return 301 Location: https://....
Poin 2 — TLS Config (TLS 1.2+, Certificate Valid)
# Cek versi TLS yang didukung
openssl s_client -connect portal.kampus.ac.id:443 -tls1_2 < /dev/null 2>&1 | grep 'Protocol\|Cipher'
# Cek expired date sertifikat
echo | openssl s_client -connect portal.kampus.ac.id:443 2>/dev/null | \
openssl x509 -noout -dates -subject -issuer
# Validasi chain & SAN
curl -vI https://portal.kampus.ac.id 2>&1 | grep -E 'subject:|issuer:|expire'
Poin 3 — CAA Record (Certificate Authority Authorization)
CAA record membatasi CA mana yang boleh menerbitkan sertifikat untuk domain kamu — proteksi kuat melawan rogue cert issuance. Tanpa CAA, attacker dengan akses panel DNS lemah bisa minta cert ke CA acak. Implementasi: 1 baris di zone DNS, gratis, efek besar.
; Hanya Let's Encrypt + DigiCert yang boleh issue cert
kampus.ac.id. IN CAA 0 issue "letsencrypt.org"
kampus.ac.id. IN CAA 0 issue "digicert.com"
kampus.ac.id. IN CAA 0 iodef "mailto:[email protected]"
; Cek dengan dig
dig CAA kampus.ac.id +short
Poin 4 — DNSSEC Enabled
DNSSEC mencegah cache poisoning dan spoofing DNS. Untuk portal kampus yang menerima credential login, ini lapisan penting. Implementasi tergantung registrar/DNS provider — Cloudflare/Google Cloud DNS sediakan dengan 1 klik. Verifikasi dengan dig +dnssec portal.kampus.ac.id (cari flag ad).
Poin 5 — SPF, DKIM, DMARC Aktif
Walau bukan untuk web, ini krusial untuk email kampus yang mengirim notifikasi pendaftaran/beasiswa. DMARC p=reject setelah monitor 30 hari adalah target ideal. Tanpa SPF/DKIM/DMARC valid, email spoofing dengan domain kampus jadi vector phishing ke mahasiswa.
dig TXT kampus.ac.id +short | grep spf
dig TXT default._domainkey.kampus.ac.id +short
dig TXT _dmarc.kampus.ac.id +short
# Target ideal:
# SPF: v=spf1 include:_spf.google.com ~all
# DKIM: v=DKIM1; k=rsa; p=... (publik key)
# DMARC: v=DMARC1; p=reject; rua=mailto:[email protected]; pct=100
Layer 2 — HTTP Security Headers (Poin 6-11)
Layer ini paling sering bolong di portal kampus. Skenario nyata: scan securityheaders.com grade F dengan 6/6 header dasar absent — termasuk untuk portal SNBP yang menerima jutaan submission siswa. Patch ini bisa dideploy via .htaccess atau Nginx config dalam 5 menit dan langsung naik ke grade A/A+.
Poin 6 — Strict-Transport-Security (HSTS)
Wajibkan browser selalu pakai HTTPS untuk domain kampus selama N detik. Cegah SSL strip attack. Mulai dengan max-age=86400 (1 hari) untuk safety, naikkan ke 31536000 (1 tahun) setelah konfirmasi semua subdomain HTTPS-ready. Submit ke HSTS preload list jika sudah confident.
Poin 7 — Content-Security-Policy (CSP)
Header anti-XSS paling kuat. Tanpa CSP, satu reflected XSS di form login = exfiltrasi credential mahasiswa massal. Mulai dengan report-only mode untuk audit sebelum enforce. Awas unsafe-inline & unsafe-eval — gunakan hanya jika benar-benar tidak bisa dihindari.
Poin 8 — X-Frame-Options
Cegah clickjacking. Untuk portal login: SAMEORIGIN atau DENY. Tanpa ini, attacker bisa embed halaman login kampus ke iframe transparent di situs phishing dan curi klik mahasiswa.
Poin 9 — X-Content-Type-Options
nosniff mencegah MIME sniffing. Krusial untuk portal yang menerima file upload (foto, ijazah, KTP) — tanpa header ini, attacker bisa upload .html dengan nama .jpg, browser tetap render sebagai HTML → XSS via uploaded file.
Poin 10 — Referrer-Policy
Cegah bocor query string ke third-party. Pakai strict-origin-when-cross-origin sebagai default aman. Skenario kenapa penting: URL portal pendaftaran sering berisi token sesi — tanpa policy yang ketat, token bocor ke iklan/analytics third-party via Referer header.
Poin 11 — Permissions-Policy
<IfModule mod_headers.c>
# HSTS (mulai 1 hari, naikkan setelah verified)
Header always set Strict-Transport-Security "max-age=86400; includeSubDomains"
# CSP (sesuaikan sumber sesuai aplikasi)
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; frame-ancestors 'self'; base-uri 'self'"
# Anti clickjacking
Header always set X-Frame-Options "SAMEORIGIN"
# Anti MIME sniffing
Header always set X-Content-Type-Options "nosniff"
# Referrer policy
Header always set Referrer-Policy "strict-origin-when-cross-origin"
# Disable unused browser APIs
Header always set Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=(), usb=()"
# Bonus: hilangkan tech disclosure
Header unset X-Powered-By
Header unset Server
</IfModule>
curl -I https://portal.kampus.ac.id. Target: grade A di securityheaders.com.Content-Security-Policy-Report-Only selama 7-14 hari + endpoint report-uri untuk catat violation. Banyak portal kampus pakai inline JS legacy (jQuery 1.x, custom widget) yang akan break kalau langsung enforce. Audit dulu, baru deploy.Layer 3 — Application Security (Poin 12-16)
Layer paling sulit karena bergantung pada kode aplikasi yang dikembangkan internal/vendor. Estimasi: 1-4 minggu per aplikasi tergantung kondisi codebase.
Poin 12 — Patch CMS / Framework / Library
| Stack umum di kampus | Cek versi | Risiko jika lawas |
|---|---|---|
| WordPress (e-jurnal/profile) | wp core version |
RCE via plugin lawas, theme abandoned |
| Moodle (e-learning) | cat config.php $version |
Auth bypass, file upload abuse |
| Joomla (portal lawas) | administrator → System Info |
SQLi, web shell |
| PHP versi dasar | php -v |
PHP 7.x EOL — exploitable kernel level |
| Apache/Nginx | httpd -v / nginx -v |
CVE rutin, butuh patch security berkala |
| Composer/NPM dependencies | composer audit / npm audit |
Supply chain vulnerability |
Poin 13 — Input Validation & Output Encoding
Audit semua endpoint yang menerima input user: form login, search, upload, comment. Cek apakah pakai parameterized query (prepared statement) untuk DB access, bukan string concatenation. Output yang ditampilkan ke browser harus di-encode sesuai konteks (HTML, JS, URL, attribute) — pakai library standard, jangan custom htmlspecialchars() ad-hoc.
Poin 14 — Authentication & Session Management
| Aspek | Standar Aman | Anti-pattern di kampus |
|---|---|---|
| Password storage | bcrypt/argon2 + salt unik per user | MD5/SHA1, salt fixed, plaintext (!) |
| Session cookie | HttpOnly + Secure + SameSite=Lax/Strict | Cookie tanpa flag, JavaScript-readable |
| Session timeout | 15-30 menit idle untuk admin, 1-4 jam untuk user | Session lifetime tak terbatas |
| MFA untuk admin | TOTP/WebAuthn untuk akun privileged | Username+password saja |
| Brute-force protection | Rate limit + CAPTCHA setelah 5 fail | Login endpoint terbuka, no throttling |
| Password reset | Token random + expire 30 menit + 1x use | Token sequential, tidak expire |
Poin 15 — File Upload Security
Endpoint upload (foto profil, ijazah, KTP, transkrip) adalah top vector insiden portal kampus. Wajib: (1) validasi magic bytes, bukan ekstensi; (2) simpan di luar document root; (3) rename file ke UUID, bukan nama original; (4) batasi MIME type whitelist (image/jpeg, image/png, application/pdf); (5) max-size limit; (6) scan dengan ClamAV jika realistis.
<?php
// 1. Whitelist MIME (cek via finfo, bukan $_FILES['type'])
$allowed = ['image/jpeg', 'image/png', 'application/pdf'];
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['doc']['tmp_name']);
if (!in_array($mime, $allowed, true)) {
http_response_code(415);
exit('Tipe file tidak diizinkan');
}
// 2. Max size (5 MB)
if ($_FILES['doc']['size'] > 5 * 1024 * 1024) {
http_response_code(413);
exit('File terlalu besar');
}
// 3. Rename ke UUID, simpan di luar doc root
$ext = ['image/jpeg' => '.jpg', 'image/png' => '.png', 'application/pdf' => '.pdf'][$mime];
$name = bin2hex(random_bytes(16)) . $ext;
$dest = '/var/lib/portal/uploads/' . $name;
move_uploaded_file($_FILES['doc']['tmp_name'], $dest);
// 4. Catat di DB untuk audit trail
// (jangan lupa: selalu prepared statement)
Poin 16 — Information Disclosure Audit
DOMAIN="portal.kampus.ac.id"
# 1. File backup yang mungkin ter-expose
for path in .git/config .env config.php.bak wp-config.php.bak \
backup.zip db.sql .DS_Store phpinfo.php info.php; do
status=$(curl -s -o /dev/null -w "%{http_code}" https://$DOMAIN/$path)
[ "$status" != "404" ] && echo "EXPOSED $path (HTTP $status)"
done
# 2. Server tech disclosure
curl -sI https://$DOMAIN | grep -iE 'server|x-powered-by|x-aspnet'
# 3. Directory listing
curl -s https://$DOMAIN/uploads/ | grep -i 'index of'
# 4. Verbose error messages (test invalid query)
curl -s "https://$DOMAIN/login.php?id=1'" | grep -iE 'mysql|warning|fatal|stack trace'
Layer 4 — Monitoring & Compliance (Poin 17-20)
Poin 17 — Logging & Monitoring Aktif
| Apa yang harus dilog | Retention minimum | Catatan UU PDP |
|---|---|---|
| Login (success + fail) dengan IP, UA, timestamp | 90 hari | Legitimate interest — audit security |
| Akses admin panel & operasi sensitif | 12 bulan | Audit trail wajib (POJK 38 spirit) |
| Upload/download dokumen siswa | 6 bulan | Track akses data PII |
| Perubahan permission/role user | 12 bulan | Audit trail tata kelola |
| Error 5xx aplikasi & WAF block | 30 hari | Operational, anonymized |
| Akses query data > 1000 row dari satu user/menit | 90 hari | Anomaly: potensi exfiltrasi PII |
Poin 18 — Web Application Firewall (WAF)
Untuk portal high-traffic (SNBP/SNBT/wisuda), WAF bukan kemewahan tapi kebutuhan. Pilihan realistis: Cloudflare (gratis tier sudah cukup untuk filter top 10 OWASP) atau ModSecurity + OWASP CRS (self-host, butuh tuning). WAF gratis pun lebih baik dari nol — pasti block sebagian besar SQLi/XSS automation.
Poin 19 — Incident Response Plan (IRP)
| Komponen IRP | Isi minimum | Frekuensi review |
|---|---|---|
| Daftar PIC | Nama, jabatan, kontak 24/7 untuk security/IT/legal/PR/PIC PDP | 6 bulan |
| Severity matrix | Tier S0-S3 dengan SLA respon (<1 jam s/d <72 jam) | 12 bulan |
| Runbook insiden | Langkah berurut: deteksi → containment → investigasi → recovery → post-mortem | 12 bulan |
| Notifikasi PDP | Template laporan ke otoritas PDP dalam 72 jam jika data subject terdampak | Setiap perubahan regulasi |
| Komunikasi publik | Template press release, FAQ untuk mahasiswa/orangtua | 12 bulan |
| Tabletop exercise | Simulasi tahunan minimal 1x dengan stakeholder lengkap | Tahunan |
Poin 20 — Compliance Mapping & Audit Trail
| Regulasi/Standar | Relevansi untuk Portal Kampus | Action minimum |
|---|---|---|
| UU PDP No. 27/2022 | Wajib bagi semua processor data pribadi siswa | DPIA, PIC PDP, notifikasi 3x24 jam |
| UU ITE No. 11/2008 jo 19/2016 | Pasal 30/32 — akses ilegal & alterasi data | Audit trail, access control |
| Permendikbud No. 3/2020 | Standar pengelolaan TIK perguruan tinggi | Tata kelola, audit berkala |
| ISO 27001:2022 | Optional tapi standar emas; framework ISMS | Risk register, statement of applicability |
| Permendikti khusus per perguruan | Cek aturan internal kemendikbud/kemenag | Konsultasi unit hukum |
| BSSN ISO/SNI sektoral | Untuk PTN sebagai badan publik | Cek edaran BSSN terkait insfrastruktur kritis |
Studi Kasus: Pola Insiden Portal Kampus 2024-2026 (Anonim)
Kasus 1 — Portal SNBP PTN Sumatera (April 2026)
Temuan: scan eksternal menunjukkan grade F di securityheaders.com — 6/6 header dasar absent (HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy). Portal aktif menerima submission siswa (NISN, nilai rapor, foto). Risiko konkret: form login bisa di-iframe untuk clickjacking, MIME sniff pada upload bisa eksekusi .html stored, no HSTS bisa SSL-strip di wifi sekolah/warnet. Fix: deploy bundel 6 header via .htaccess dalam 1 jam → naik ke grade A. Effort: 1 admin senior, 1 jam, nol budget tambahan.
Kasus 2 — Subdomain Pendaftaran HTTP 525 (April 2026)
Temuan: subdomain pendaftaran return HTTP 525 (Cloudflare origin SSL handshake failure) — site praktis DOWN saat user akses. Root cause: sertifikat origin server expired, Cloudflare dengan mode "Full (strict)" menolak handshake ke origin yang tidak valid. Fix: renew origin cert, atau temporary turun ke "Full" (tidak strict) selama renewal — note: trade-off keamanan. Pelajaran: monitoring expiry cert origin (bukan cuma edge) wajib masuk runbook — bisa pakai blackbox_exporter Prometheus atau cek manual berkala via openssl s_client.
Kasus 3 — IP Kampus Listed Barracuda + NoPTR (April 2026)
Temuan: mahasiswa tidak bisa akses CloudFront (403 Blocked), email kampus bouncing ke partner luar. Audit: IP /24 listed di Barracuda BRBL + SpamRats NoPTR. Root cause kombinasi: PTR record default APNIC (NoPTR) + 1 device lab kompromi botnet. Fix: sumber bersih dulu (block port 25 + karantina device), set PTR /24, submit delisting. Detail penuh di panduan delisting kampus.
Workflow 30/60/90 Hari untuk Tim IT Kampus
| Periode | Fokus | Deliverable |
|---|---|---|
| Hari 1-30 | Quick Win Layer 1+2: TLS, headers, CAA, SPF/DKIM/DMARC | Grade A securityheaders + report inventaris portal |
| Hari 31-60 | Layer 3: patch CMS, audit upload, hardening auth | CVE log clean + auth flow doc |
| Hari 61-90 | Layer 4: SIEM, IRP, compliance mapping, tabletop | IRP runbook + audit trail readiness ISO 27001 |
Ringkasan: 20 Poin Checklist
| # | Layer | Poin | Status |
|---|---|---|---|
| 1 | DNS/TLS | HTTPS enforced (HTTP → 301 → HTTPS) | ☐ |
| 2 | DNS/TLS | TLS 1.2+ + cert valid + cipher modern | ☐ |
| 3 | DNS/TLS | CAA record di-set untuk batasi CA issuer | ☐ |
| 4 | DNS/TLS | DNSSEC enabled di registrar | ☐ |
| 5 | DNS/TLS | SPF + DKIM + DMARC valid (DMARC p=reject after monitor) | ☐ |
| 6 | Headers | Strict-Transport-Security (HSTS) | ☐ |
| 7 | Headers | Content-Security-Policy (CSP) | ☐ |
| 8 | Headers | X-Frame-Options | ☐ |
| 9 | Headers | X-Content-Type-Options: nosniff | ☐ |
| 10 | Headers | Referrer-Policy | ☐ |
| 11 | Headers | Permissions-Policy | ☐ |
| 12 | Application | CMS/framework/library di-patch ke versi supported | ☐ |
| 13 | Application | Input validation + output encoding (no SQLi/XSS) | ☐ |
| 14 | Application | Auth+session secure (bcrypt, MFA admin, rate-limit) | ☐ |
| 15 | Application | File upload aman (magic byte, UUID, off-docroot) | ☐ |
| 16 | Application | Information disclosure clean (no .git/.env/phpinfo) | ☐ |
| 17 | Monitoring | Logging aktif sesuai retention UU PDP | ☐ |
| 18 | Monitoring | WAF aktif (Cloudflare/ModSec/lainnya) | ☐ |
| 19 | Monitoring | Incident Response Plan + tabletop tahunan | ☐ |
| 20 | Monitoring | Compliance mapping (UU PDP, UU ITE, Permendikbud) | ☐ |
FAQ — Pertanyaan yang Sering Ditanyakan
Kesimpulan
Portal kampus (SIAKAD, e-learning, SNBP, beasiswa, repository) menyimpan PII siswa skala besar — NISN, KK, nilai rapor, ijazah, foto. Ini bukan sekadar "website akademik"; ini data subject di mata UU PDP No. 27/2022. Checklist 20 poin di artikel ini membagi audit dalam 4 layer (DNS/TLS, HTTP headers, aplikasi, monitoring) dengan estimasi waktu dan dampak konkret. Sebagian besar bisa dikerjakan dalam 1 minggu tanpa budget tambahan — sebagian lagi butuh koordinasi multi-departemen (3-6 bulan). Untuk verifikasi cepat tanpa install tool, gunakan DNS Lookup, Cek IP & ASN, dan Cek Blacklist di cekipsaya.com — gratis dan cocok untuk dokumentasi before/after ke pimpinan.