
Checklist penanggulangan keamanan yang paling penting ketika merancang, menguji, dan melepaskan API ke khalayak
Autentikasi
- Jangan gunakan Basic Auth. Gunakan autentikasi baku (Contoh: JWT, Oauth)
- Gunakan mekanisme baku untuk autentikasi, pembuatan token, dan penyimpanan kata sandi.
- Gunakan maksimal percobaan berulang dan fitur penjara pada Login.
- Gunakan enkripsi untuk seluruh data sensitif.
JWT (JSON Web Token)
- Gunakan kunci acak yang rumit (JWT Secret) untuk membuat proses pemecahan token secara paksa menjadi sangat susah.
- Jangan gunakan algoritma yang berasal dari muatan yang dikirim oleh pengguna. Paksa penggunaan algoritma di sisi peladen (HS256 atau RS256).
- Gunakan masa tenggat token (TTL, RTTL) yang sesingkat mungkin.
- Jangan simpan data sensitif pada muatan JWT karena muatan JWT dapat diterjemahkan dengan mudah.
- Hindari menyimpan terlalu banyak data. JWT biasanya dibagikan di header dan mereka memiliki batas ukuran.
Akses
- Batasi permintaan (throttling) di sisi peladen untuk menghindari serangan yang dapat melumpukan sistem (Contoh: DDoS, serangan paksa).
- Gunakan HTTPS di sisi peladen untuk menghindari serangan pencegatan / MItM (Man In The Middle Attack).
- Gunakan tajuk HSTS pada SSL untuk mencegah serangan SSL Strip.
- Matikan daftar direktori.
- Untuk API pribadi, izinkan akses hanya dari IP/host yang masuk daftar putih.
Otorisasi OAuth
- Selalu validasi redirect_uri di sisi peladen sehingga hanya URL-URL yang ada di dalam daftar putih yang boleh digunakan.
- Selalu coba untuk mempertukarkan kode bukan token (jangan ijinkan response_type=token).
- Gunakan parameter state dengan campuran nilai acak (random hash) untuk mencegah CSRF pada proses autentikasi.
- Tetapkan cakupan baku dan validasi parameter cakupan untuk setiap aplikasi.
Masuk
- Gunakan metode HTTP yang sesuai dengan operasi yang digunakan, GET untuk membaca catatan, POST untuk membuat catatan baru, PUT/PATCH untuk mengganti secara keseluruhan/mengubah sebagian catatan, DELETE untuk menghapus catatan dan tanggapan 405 Method Not Allowed jika metode permintaan tidak dikenali pada sumber daya.
- Validasi content-type pada tajuk Accept pada permintaan (Negosiasi konten) sehingga hanya mengijinkan format yang dikenali (Contoh: application/xml, application/json, dan lain sebagainya). Berikan tanggapan 406 Not Acceptable jika nilai tajuk Accept tidak dikenali.
- Validasi content-type dari data yang dipos oleh pengguna (Contoh: application/x-www-form-urlencoded, multipart/form-data, application/json, dan lain sebagainya).
- Validasi masukan dari pengguna untuk menghindari kerentanan umum (Contoh: XSS, SQL-Injection, Remote Code Execution, dan lain sebagainya).
- Jangan gunakan data sensitif seperti kredensial, kata sandi, token keamanan, atau kunci API pada URL. Gunakan tajuk Authorization baku.
- Gunakan hanya enkripsi sisi server.
- Gunakan layanan pintu gerbang API (API Gateway) untuk memungkinan singgahan, pembatasan laju, pendeteksian lalu lintas tinggi, dan penyebaran sumber daya API secara dinamis.
Pemrosesan
- Cek apakah seluruh titik akhir terlindungi oleh autentikasi untuk menghindari proses autentikasi yang rusak.
- Sumber daya ID kepunyaan pengguna sebaiknya dihindari. Lebih baik menggunakan/me/orders daripada /user/654321/orders.
- Jangan gunakan ID yang bertambah secara otomatis. Sebaiknya gunakan UUID.
- Jika hendak menguraikan berkas XML, pastikan penguraian entitas tidak diaktikan untuk menghindari serangan XXE (XML External Entity).
- Jika hendak menguraikan berkas XML, pastikan perluasan entitas tidak diaktifkan untuk menghindari Billion Laughs/XML bomb melalui serangan perluasan entitas eksponensial.
- Gunakan CDN untuk unggah berkas.
- Jika berhubungan dengan jumlah data yang sangat besar, gunakan Pekerja dan Antrian untuk memproses sebanyak mungkin di balik layar dan kembalikan tanggapan cepat untuk menghindari pemblokiran HTTP.
- Jangan lupa untuk mematikan mode DEBUG.
- Gunakan stack yang tidak dapat dieksekusi jika tersedia.
Keluaran
- Kirim tajuk X-Content-Type-Options: nosniff.
- Kirim tajuk X-Frame-Options: deny.
- Kirim tajuk Content-Security-Policy: default-src 'none'.
- Hapus tajuk sidik jari - X-Powered-By, Server, X-AspNet-Version dan lain sebagainya.
- Paksa content-type pada tanggapan. Jika mengambalikan application/json maka tajuk content-type adalah application/json.
- Jangan kembalikan data sensitif seperti kredensial, kata sandi, dan token keamanan.
- Kembalikan kode status yang layak sesuai dengan operasi yang diselesaikan (Contoh: 200 OK, 400 Bad Request, 401 Unauthorized, 405 Method Not Allowed, dan lain sebagainya).
CI & CD
- Audit rancangan dan pelaksanaan dengan pengujian unit/integrasi.
- Gunakan proses ulasan kode dan kesampingkan persetujuan sendiri.
- Pastikan seluruh komponen layanan dipindai secara statis menggunakan anti virus sebelum didorong ke lingkungan produksi, termasuk pustaka-pustaka milik vendor dan ketergantungan lainnya.
- Jalankan uji keamanan (analisis statis/dinamis) secara terus-menerus pada kode Anda.
- Memeriksa dependensi Anda (perangkat lunak dan OS) untuk mengetahui kerentanannya.
- Rancang solusi kembali ke versi sebelumnya pada proses penyebaran.
Pemantauan
- Gunakan login terpusat untuk semua layanan dan komponen.
- Gunakan agen untuk memantau semua lalu lintas, kesalahan, permintaan, dan respons.
- Gunakan peringatan untuk SMS, Slack, Email, Telegram, Kibana, Cloudwatch, dll.
- Pastikan Anda tidak mencatat data apapun yang sensitif, seperti kartu kredit, kata sandi, PIN, dll.
- Gunakan sistem IDS dan/atau IPS untuk memantau permintaan dan instans API Anda.
Sumber : https://github.com/shieldfy/API-Security-Checklist/blob/master/README-id.md