Cara Handle Security Threat Pada Microservice — Part 1

Security Pattern pada Microservice

D. Husni Fahri Rizal
The Legend
8 min readJan 15, 2021

--

Microservice arsitektur seperti yang telah sering kita bahas di chanel The Legend telah banyak merubah cara software dibuat. Mulai dari cara software dikembangkan, diuji, di deploy, dipantau, sampai cara penggunaan dan penerapan security yang jauh lebih rumit dari pada penanganan monolith arsitektur.

Pada kenyataannya, kebanyakan masalah security suatu software baik itu untuk monolith ataupun microservice arsitektur merupakan masalah yang kadang kurang mendapatkan perhatian, tidak diprioritaskan, bahkan tidak difahami. Perhatian baru diberikan ketika software kita mendapatkan serangan yang mengakibatkan kerugian yang sangat significant. Perbaikan masalah security ini menjadi perhatian yang sangat menyita waktu dan biaya.

Rata-rata penangann security bersifat reactive terhadap datanya serangan. Ketika laporan datang baik itu dari team internal atau laporan security threat dari luar, baru team melakukan perbaikan.

Agile prosess development dengan menerapkan faktor security (Secure Agile) https://www.approach.be/en/secure-software-factory.html

Pendekatan terbaik dari penanganan security pada software adalah dengan cara pencegahan dan penanganan security yang dilakukan terus menerus. Mulai dari planning sampai proses maintenance kita harus memperhatikan dan melakukan penanganan masalah security ini.

Apabila SDCL yang digunakan adalah agile maka kita dapat memasukan security concern dan kita namakan agile secure. Agile secure proses dapat di lihat pada gambar di atas yang merupakan penerapan agile methodology yang telah memasukan unsur security didalamnya.

Satu tips yang perlu diperhatikan, yakni jangan lah kita merasa bahwa sistem kita sudah sangat aman. Kita harus melakukan secara terus-menerus mengevaluasi dan melakukan proses pengaman sistem kita. Lakukan langkah security pattent berikut yang dapat diterapkan pada sistem microservice arsitektur Anda.

Bersikaplah rendah hati terhadap sistem yang kita punya dan usahakan jangan menantang para hacker dan cracker untuk meretas sistem kita. Bersahabatlah dengan mereka sehingga mereka mau membantu memperbaiki segala permasalah security di sistem Anda.

Berikut adalah beberapa pattern yang dapat kita terapkan dalam menangani security dari software berdasarkan saran dari ahli-ahli yang bergerak dalam penanganan security dari software.

  1. Secure By Design
  2. Scan Library Dependencies
  3. Gunakan HTTPS untuk Semua Tempat
  4. Gunakan Access dan Identitas Token
  5. Encrypt dan Proteksi data Rahasia
  6. Slow Down Penyerang Keamanan
  7. Time-Based Security
  8. Verifikasi Security pada Pross Delivery Pipelines
  9. OWASP Security Threats
  10. Gunakan Rootless Mode Pada Docker
  11. Cek Docker atau Kubernetes Konfigurasi dari Vulnerability
  12. Ketahui Cloud dan Cluster Security dan Penanganannya

Secure by Design

Membuat kode yang aman adalah cara pembuatan code terbaik. Akan tetapi, Secure by Design berarti kita sudah mulai memikirkan sistem atau aplikasi kita mulai dari ketika aplikasi kita rancang. Apabila kita sudah mulai menerapkan secure by design maka otomatis software kita akan aman secara code.

Pada proses tahap awal software dirancang ada dua bagian yang perlu kita kita terapkan security ini dari awal. Pertama pada software arsitektur kedua pada software design.

Ketika kita merancang komponen tingkat tinggi dari aplikasi yang dituangkan dalam software arsitektur, kita harus sudah memikirkan bagaimana kompoen tingkat tinggi ini diamankan dan bagaimana cara komunikasi antar komponen seaman mungkin.

Pada saat kita mendesain software harus sudah kita perhatikan bagaimana security diterapkan pada setiap pattern yang digunakan. Jangan sampai persoalan security dianggap sebagai fitur karena jika kita menganggap security adalah fitur maka biasanya hal ini akan membuat proses pengerjaan berada di prioritas terakhir kalah oleh fitur-fitur produk atau bisnis.

Kita tahu bahwa fitur business adalah tempat uang ada di sana dan jarang sekali ada management atau orang yang berterimakasih karena kita menerapkan CSRF token pada login form kita.

Di sisi lain sebagai developer kita umumnya merasa dan berkeinginan bahwa tanggung jawab keamanan bukan ada di pundak kita dan berkeinginan di perusahaan memiliki seorang security expert yang bisa menghadapinya.

Satu scenario lagi, ketika software kita sudah beres dan siap untuk di deploy ke production akan tetapi security report yang telah melakukan penetrasi test melaporkan banyak terdapat vulnerability yang harus di fix terlebih dahulu, Dengan demikian, jadwal release menjadi mundur dan team developer harus melakukan perbaikan. Paling naas adalah jika penerapan merubah struktur code dan flow business. Apabila ini terjadi jelas kita akan rugi karena harus membuatnya dari awal atau setidaknya proses refactor yang kita lakukan sangat mendasar dan menghabiskan waktu.

Security by design akan memberikan solusi untuk hal-hal di atas. Seperti yang dijelaskan pada buku yang berjudul Security By Design karya Dan Berg Johnson.

Salah satu buku yang menjelaskan penerapan penanganan security pada proses design

Contoh Penerapan Security By Design

Buku di atas memang menjelaskan penerapan security pada proses desain walaupun java centrik akan tetapi, konsepnya dapat diterapkan pada bahasa-bahasa pemrograman lainnya.

Traditional Approach

Misalkan kita akan merancang class untuk menampung data User. Umumnya secara sederhana class User di buat seperti berikut.

public class User {   private final Long id;   private final String username;public User(final Long id, final String username) {  this.id = id;  this.username = username; -->  Kemungkinan XSS vurnabilty terjadi}// ... }

Apabila kita perhatikan pada class user di atas dan kita analisis lebih dalam maka akan ada kemungkinan terjadinya security issue pada codenya. Satu masalah adalah karena Anda menerima nilai string apa pun sebagai nama pengguna, nama pengguna tersebut dapat digunakan untuk melakukan serangan XSS.

Serangan XSS terjadi saat penyerang menggunakan aplikasi web untuk mengirim kode berbahaya ke pengguna lain. Kode berbahaya bisa, misalnya, dalam bentuk JavaScript sisi klien. Jika penyerang memasukkan sesuatu seperti <script> alert (42); </script> sebagai nama pengguna saat mendaftar untuk layanan tersebut, nanti, ketika nama pengguna pengguna ditampilkan di beberapa halaman web dalam aplikasi, itu bisa mengarah ke kotak peringatan sedang ditampilkan di browser yang menunjukkan angka 42.

Jika Anda ingin mitigasi kerentanan keamanan ini menggunakan pendekatan tradisional, Anda dapat memperkenalkan validasi data input yang berfokus pada keamanan secara eksplisit. Validasi data dapat, misalnya, diimplementasikan sebagai filter aplikasi web yang memvalidasi semua data formulir yang diposting di aplikasi web dan memeriksa apakah data tersebut tidak berisi kode XSS yang berbahaya. Atau validasi bisa terjadi langsung di kelas domain. Jika Anda memilih untuk memperkenalkan validasi input di kelas User, itu bisa terlihat seperti yang ditunjukkan pada daftar berikut.

import static com.example.xss.ValidationUtils.validateForXSS;import static org.apache.commons.lang3.Validate.notNull;public class User {   private final Long id;   private final String username;public User(final Long id, final String username) {   notNull(id); --- cek parameter dari null   notNull(username); --- cek parameter dari null   this.id = notNull(id);   this.username = validateForXSS(username); validasi input data        dengan external library}// ... }

Anda dapat melihat dari potongan kode diatas bagaimana kita menggunakan library keamanan (imajiner) yang menyediakan fungsionalitas untuk memvalidasi string untuk kemungkinan serangan XSS. Kita juga memutuskan untuk memeriksa bahwa tidak ada parameter konstruktor yang nol untuk lebih meningkatkan penilaian. Cara menangani keamanan seperti ini umum dilakukan, tetapi juga bermasalah karena beberapa alasan, beberapa di antaranya:

  • Developer perlu memikirkan secara eksplisit tentang kerentanan keamanan, sementara pada saat yang sama berfokus pada penyelesaian fungsionalitas bisnis.
  • Cara ini mengharuskan setiap developer menjadi ahli keamanan.
  • Cara ini mengasumsikan bahwa orang yang menulis kode dapat memikirkan setiap potensi vulnerability yang mungkin terjadi sekarang atau di masa depan.

Secure By Design Approach

Saya tidak berpendapat bahwa keamanan itu tidak penting atau Anda tidak harus waspada terhadap keamanan saat mengembangkan atau membuat software. Namun, saya percaya bahwa, alih-alih mengikuti pendekatan tradisional terhadap keamanan software, ada pendekatan alternatif yang mencapai hasil yang sama atau bahkan lebih baik dalam hal seberapa aman software Anda yang sudah selesai nantinya.

Fokus pada desain daripada pendekatan tradisional terhadap keamanan

Apabila kita terapkan secure by design ini maka class User kita repactor menjadi seperti ini.

public class User {   private static final int USERNAME_MINIMUM_LENGTH = 4;   private static final int USERNAME_MAXIMUM_LENGTH = 40;   private static final String USERNAME_VALID_CHARACTERS =   "[A-Za-z0-9_-]+";   private final Long id;   private final String username;public User(final Long id, final String username) {  notNull(id);  notBlank(username);
final String trimmed = username.trim();
inclusiveBetween(USERNAME_MINIMUM_LENGTH, USERNAME_MAXIMUM_LENGTH, trimmed.length()); matchesPattern(trimmed, USERNAME_VALID_CHARACTERS, "Allowed characters are: %s", USERNAME_VALID_CHARACTERS); this.id = id; this.username = trimmed;}// ... }

Apabila kita terapkan analisis domain maka class di atas akan menjadi berikut.

import static org.apache.commons.lang3.Validate.*;public class Username {   private static final int MINIMUM_LENGTH = 4;   private static final int MAXIMUM_LENGTH = 40;   private static final String VALID_CHARACTERS = "[A-Za-z0-9_-]+";   private final String value;public Username(final String value) {   notBlank(value);   final String trimmed = value.trim();   inclusiveBetween(MINIMUM_LENGTH, MAXIMUM_LENGTH,   trimmed.length());   matchesPattern(trimmed, VALID_CHARACTERS,   "Allowed characters are: %s", VALID_CHARACTERS);   this.value = trimmed;  }public String value() {   return value;   } 
}

Akhirnya class User kita menjadi seperti ini.

public class User {   private final Long id;   private final Username username;public User(final Long id, final Username username) {   this.id = notNull(id);   this.username = notNull(username);}// ... }

Dengan berfokus pada desain, kita dapat mengetahui lebih lanjut tentang detail seputar pengguna dan nama pengguna. Ini, pada gilirannya, memungkinkan kita membuat model domain yang lebih tepat.

Kita juga memperhatikan kapan konsep dalam domain saat ini menjadi sangat penting sehingga harus diekstraksi menjadi objeknya sendiri. Pada akhirnya, kita memperoleh pengetahuan yang lebih dalam tentang domain kita dan, pada saat yang sama, melindungi diri kita dari kerentanan XSS yang telah kita diskusikan sebelumnya; mencoba memasukkan <script> alert (42); </script> sebagai nama pengguna menjadi tidak mungkin karena itu bukan nama pengguna yang valid lagi.

Bahkan kitab belum mulai memikirkan tentang keamanan! Jika kita mempertimbangkan keamanan dalam pilihan desain kita, maka kita mungkin dapat lebih memperketat batasan pada nama pengguna, memperkuat kode lebih lanjut, tetapi tetap fokus pada desain yang baik.

A strong design focus lets you create code that’s more secure when compared to the traditional approach to software security

Kesimpulan Security By Design

Berikut adlaah kesimpulan penerapam dari security by design yang di jelaskan pada buku diatas.

  • Lebih baik melihat keamanan sebagai perhatian yang harus dipenuhi daripada melihatnya sebagai sekumpulan fitur untuk diterapkan.
  • Tidak praktis mencapai keamanan dengan selalu mengingatnya sepanjang waktu saat mengembangkan. Cara yang lebih baik adalah menemukan praktik desain yang memandu Anda ke solusi yang lebih aman.
  • Setiap aktivitas yang melibatkan pengambilan keputusan aktif harus dianggap sebagai bagian dari proses desain perangkat lunak dan dengan demikian dapat disebut sebagai desain.
  • Software Desain adalah prinsip panduan bagaimana sistem dibangun dan dapat diterapkan pada semua tingkatan, dari kode hingga arsitektur.
  • Pendekatan tradisional untuk masalah keamanan perangkat lunak karena bergantung pada pengembang untuk secara eksplisit memikirkan tentang kerentanan keamanan sementara pada saat yang sama mencoba untuk fokus pada penerapan fungsionalitas bisnis. Ini mengharuskan setiap pengembang menjadi ahli keamanan dan mengasumsikan bahwa orang yang menulis kode dapat memikirkan setiap potensi kerentanan yang dapat terjadi sekarang atau di masa depan.
  • Dengan mengalihkan fokus ke desain, Anda dapat mencapai keamanan software tingkat tinggi tanpa perlu terus-menerus dan secara eksplisit memikirkan keamanan.
  • Fokus desain yang kuat memungkinkan Anda membuat kode yang lebih aman dibandingkan dengan pendekatan tradisional untuk keamanan software.
  • Setiap parse XML secara implisit rentan terhadap serangan entitas karena entitas adalah bagian dari bahasa XML.
  • Menggunakan tipe generik untuk merepresentasikan data spesifik merupakan pembuka pintu potensial untuk kelemahan keamanan.
  • Memilih konfigurasi parser XML sulit dilakukan tanpa memahami implementasi parser yang mendasarinya.
  • Secure by design meningkatkan keamanan secara mendalam dengan menambahkan beberapa lapisan keamanan.

Itulah pejelasan bagia awal dari bagaimana cara menerapkan security pada microservice. Selanjutnya akan kita coba jelaskan pattern-pattern lainnya selain security by design ini pada penjelasan-penjelasan selanjutnya. Cara Handle Security Threat Pada Microservice — Part 2.

References

  1. https://en.wikipedia.org/wiki/Secure_by_design
  2. Manning (2019). Secure By Design. ISBN 9781617294358.
  3. https://www.approach.be/en/secure-software-factory.html
  4. https://medium.com/the-legend/web-security-terminology-2dd977708998

--

--

D. Husni Fahri Rizal
The Legend

Engineering Leader | Start-Up Advisor | Agile Coach | Microservices Expert | Professional Trainer | Investor Pemula