Quarkus Security 1- HTTP Basic Auth dengan storage di properties files

1. Sekilas Info 

Quarkus Rest dengan IntelliJ IDEA IDE

Web browser dapat menggunakan header Authorization untuk mengirimkan username dan password dalam setiap permintaan HTTP. Header ini ditulis sebagai Authorization: Basic <kredensial>, di mana kredensial adalah hasil pengkodean Base64 dari username pengguna dan kata sandi yang dipisahkan oleh tanda titik dua.

Sebagai contoh:

Jika nama pengguna adalah Alice dan kata sandinya adalah secret, maka header otorisasi HTTP yang akan dikirimkan adalah Authorization: Basic QWxjZTpzZWNyZXQ=. Di sini, QWxjZTpzZWNyZXQ= adalah representasi yang telah dikodekan dalam Base64 dari string Alice:secret.

Namun, penting untuk dicatat bahwa mekanisme otentikasi Basic ini tidak memberikan perlindungan kerahasiaan untuk kredensial yang dikirimkan. Kredensial tersebut hanya dikodekan dengan Base64 saat dalam perjalanan, dan tidak dienkripsi atau di-hash dengan cara apa pun. Oleh karena itu, untuk menjaga kerahasiaan, sebaiknya gunakan otentikasi Basic bersama dengan HTTPS.

Otentikasi Basic adalah skema yang sederhana dan jelas, yang dipahami oleh semua web browser dan sebagian besar server web.

2. Implement elytron-security-properties 

Quarkus memungkinkan penggunaan file .properties untuk mengatur otentikasi, terutama dalam pengembangan dan pengujian. Namun, penting untuk diingat bahwa metode ini tidak disarankan untuk produksi karena hanya mendukung kata sandi dalam format teks biasa dan MD5, yang dapat menimbulkan risiko keamanan.

Oleh karena itu, pengembang harus mempertimbangkan alternatif yang lebih aman untuk otentikasi di lingkungan produksi.

Pengaturan yang Diperlukan untuk Otentikasi

  • Untuk mengaktifkan otentikasi berbasis file .properties, Anda perlu menambahkan beberapa pengaturan ke dalam file build Anda.
  • Pastikan untuk mengaktifkan pengguna yang disimpan secara lokal dengan mengatur quarkus.security.users.embedded.enabled ke true.
  • Anda juga dapat menentukan pengguna dan kata sandi mereka dalam format teks biasa, meskipun ini tidak disarankan untuk aplikasi yang berjalan di lingkungan produksi.

Risiko Keamanan

  • Menggunakan kata sandi dalam format teks biasa dapat membuat aplikasi rentan terhadap serangan.
  • MD5, meskipun lebih baik daripada teks biasa, juga dianggap tidak cukup aman untuk aplikasi modern.
  • Oleh karena itu, penting untuk mengevaluasi dan menerapkan metode otentikasi yang lebih kuat, seperti menggunakan hashing yang lebih aman atau sistem otentikasi berbasis token.

Rekomendasi untuk Produksi

  • Untuk aplikasi yang akan digunakan di lingkungan produksi, pertimbangkan untuk menggunakan metode otentikasi yang lebih canggih, seperti OAuth2 atau OpenID Connect.
  • Pastikan untuk menyimpan kata sandi dengan aman menggunakan algoritma hashing yang kuat dan tidak menyimpannya dalam format yang dapat dibaca.

3. Setup build.gradle

dependencies {
    implementation enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}")
    implementation 'io.quarkus:quarkus-rest'
    implementation 'io.quarkus:quarkus-arc'
    testImplementation 'io.quarkus:quarkus-junit5'
    testImplementation 'io.rest-assured:rest-assured'
    implementation 'io.quarkus:quarkus-elytron-security-properties-file'
} 

4. Setup Maven (Bila Pakai Maven)

<dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-elytron-security-properties-file</artifactId>
</dependency> 

Kita memakai ektensi elytron-security-properties-file yang mendukung dua realms berbeda untuk mengimpan data authentication dan authorization. Keduanya mendukung penyimpanan informasi pada file properties. 

a. enforcedPlatform(...)

  • Ini memastikan semua dependency Quarkus versi tertentu konsisten.

  • quarkusPlatformGroupId, quarkusPlatformArtifactId, quarkusPlatformVersion biasanya didefinisikan di gradle.properties.

  • Fungsinya supaya versi REST, ARC, Hibernate, dll, cocok satu sama lain.

b. implementation 'io.quarkus:quarkus-rest'

  • Menambahkan dukungan REST API (JAX-RS) ke project.

c. implementation 'io.quarkus:quarkus-arc'

  • ARC = CDI (Context & Dependency Injection) Quarkus.

  • Memungkinkan kamu pakai @Inject dan dependency injection di seluruh project.

d. implementation 'io.quarkus:quarkus-elytron-security-properties-file'

  • Extension untuk Basic Auth dengan embedded users.

  • Membaca username/role dari properties file (application.properties).

e. testImplementation 'io.quarkus:quarkus-junit5'

  • Library untuk testing unit & integration dengan JUnit 5 di Quarkus.

f. testImplementation 'io.rest-assured:rest-assured'

  • Library testing REST API, bisa bikin HTTP request & memverifikasi response.

5. ExampleResource.java

package com.yoesoff.demo;

import jakarta.annotation.security.RolesAllowed;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class ExampleResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("admin")
    public String hello() {
        return "Hello from Quarkus REST";
    }
}
  

Penjelasan sederhana: 

  • RolesAllowed: untuk role-based access control. 
  • GET: mengindikasikan penggunaan HTTP GET requests. 
  • Path: Memberi tahu URI path pada resource. 
  • Produces: Indikasi bahwa media type(s) yang dia haslkan 
  • MediaType: Konstan untuk berbagai media types, seperti TEXT_PLAIN. 

6. application.properties

# Quarkus 3.25.3 HTTP Basic Auth properties
quarkus.http.auth.basic=true
quarkus.security.users.embedded.enabled=true
quarkus.security.users.embedded.plain-text=true
quarkus.security.users.embedded.users.scott=jb0ss
quarkus.security.users.embedded.users.stuart=test
quarkus.security.users.embedded.users.jdoe=p4ssw0rd
quarkus.security.users.embedded.users.noadmin=n0Adm1n
quarkus.security.users.embedded.roles.scott=Admin,admin,Tester,user
quarkus.security.users.embedded.roles.stuart=admin,user
quarkus.security.users.embedded.roles.jdoe=NoRolesUser
quarkus.security.users.embedded.roles.noadmin=user 
 

File application.properties adalah file konfigurasi yang digunakan dalam aplikasi Quarkus untuk mengatur berbagai pengaturan, termasuk otentikasi dan keamanan. Dalam contoh ini, kita melihat pengaturan untuk otentikasi dasar HTTP pada versi Quarkus 3.25.3.

Pertama, pengaturan quarkus.http.auth.basic=true mengaktifkan otentikasi dasar, yang memungkinkan aplikasi untuk memverifikasi identitas pengguna melalui nama pengguna dan kata sandi. Selanjutnya, quarkus.security.users.embedded.enabled=true mengaktifkan penggunaan pengguna yang disimpan secara lokal dalam aplikasi, sementara quarkus.security.users.embedded.plain-text=true menunjukkan bahwa kata sandi pengguna disimpan dalam format teks biasa, yang berarti tidak dienkripsi.

Di bawah pengaturan pengguna, kita melihat beberapa entri yang mendefinisikan pengguna dan kata sandi mereka. Misalnya, pengguna dengan nama scott memiliki kata sandi jb0ss, sedangkan pengguna lain seperti stuart, jdoe, dan noadmin juga memiliki kata sandi masing-masing. Selain itu, setiap pengguna juga diberikan peran tertentu melalui pengaturan quarkus.security.users.embedded.roles. Misalnya, pengguna scott memiliki beberapa peran, termasuk Admin, admin, Tester, dan user, sedangkan pengguna stuart hanya memiliki peran admin dan user.

Pengaturan ini memungkinkan pengembang untuk dengan mudah mengelola otentikasi dan otorisasi pengguna dalam aplikasi Quarkus, meskipun penting untuk diingat bahwa menyimpan kata sandi dalam format teks biasa dapat menimbulkan risiko keamanan. Oleh karena itu, dalam aplikasi produksi, disarankan untuk menggunakan metode penyimpanan kata sandi yang lebih aman, seperti hashing.

 

 7. Test Hasil Pembuatan

Username: scott Password: jb0ss url: http://localhost:8080/hello

Buka Lokalhost dan lihat form username dan password muncul

Protected resource bisa di akses

Sebagai kesimpulan, meskipun Quarkus menyediakan kemudahan dalam menggunakan file .properties untuk otentikasi selama pengembangan dan pengujian, penting untuk selalu mempertimbangkan aspek keamanan saat merancang aplikasi untuk lingkungan produksi. Menggunakan metode otentikasi yang lebih aman dan menyimpan kata sandi dengan cara yang tepat akan membantu melindungi data pengguna dan menjaga integritas aplikasi Anda. Selalu prioritaskan keamanan dalam setiap tahap pengembangan untuk memastikan aplikasi yang andal dan aman.

 Sumber Belajar.

  • https://quarkus.io/guides/security-basic-authentication-howto
  • https://quarkus.io/guides/security-properties

 

 

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Numpang Kerja Remote dari Bandung Digital Valley

Cara Decompile berkas Dex dan Apk Android