Kebijakan Otorisasi Apache APISIX: Lindungi API Anda
April 21, 2023
Pendahuluan
Saat ini, API telah menjadi jembatan yang menghubungkan berbagai sistem dan aplikasi dalam hal data dan fungsionalitas. Sambil menikmati kemudahan yang diberikan oleh API, memastikan keamanan data dan menghindari kebocoran data serta masalah keamanan lainnya telah menjadi perhatian utama pengguna. Pada titik ini, kontrol akses memainkan peran yang sangat penting. Dengan merumuskan kebijakan kontrol akses yang sesuai untuk API, Anda tidak hanya dapat melindungi API dari serangan siber yang besar dan memastikan keamanan data, tetapi juga membantu perusahaan memenuhi persyaratan kepatuhan dan meningkatkan kepercayaan pelanggan.
Apache APISIX adalah gateway API cloud-native yang dinamis, real-time, dan berkinerja tinggi yang menawarkan berbagai fitur manajemen lalu lintas seperti load balancing, upstream dinamis, canary release, service circuit breaker, autentikasi, dan observabilitas. Dalam artikel ini, kami akan memperkenalkan kebijakan kontrol akses Apache APISIX dan membahas strategi umum apa saja yang dapat digunakan untuk melindungi keamanan API Anda dan memastikan operasi sistem yang stabil.
Apa Itu Kebijakan Kontrol Akses?
Kebijakan kontrol akses adalah mekanisme keamanan yang dirancang untuk melindungi data atau sumber daya sensitif dalam sistem komputer, jaringan, atau aplikasi, memastikan bahwa hanya pengguna atau aplikasi yang berwenang yang dapat mengaksesnya. Ini membantu mengurangi risiko kebocoran data dan kerentanan keamanan. Dalam gateway API, kebijakan kontrol akses adalah komponen penting. Sebagai titik masuk untuk semua lalu lintas, gateway API bertanggung jawab untuk menerima dan meneruskan semua permintaan API. Oleh karena itu, kebijakan kontrol akses gateway API secara langsung menentukan keamanan dan stabilitas layanan upstream.
Kebijakan Kontrol Akses Umum di Apache APISIX
Apache APISIX menawarkan berbagai kebijakan kontrol akses, mendukung protokol autentikasi OAuth 2.0 dan terintegrasi dengan berbagai layanan autentikasi eksternal seperti Keycloak, Ory Hydra, Okta, Auth0, dan lainnya. Selain mendukung layanan autentikasi eksternal, APISIX juga menyediakan metode autentikasi internal yang kuat. Digabungkan dengan objek Consumer APISIX, Anda dapat dengan bebas menggabungkan plugin autentikasi, otorisasi, pembatasan kecepatan, daftar hitam IP, dan daftar putih untuk melindungi API Anda dan secara efektif mencegah permintaan berbahaya merusak layanan API Anda.

1. Kontrol Akses Berbasis IP
Kontrol akses berbasis IP adalah metode yang paling sederhana dan langsung, yang dapat membatasi akses ke API Anda hanya untuk permintaan dari alamat tertentu.
Anda dapat menggunakan plugin ip-restriction APISIX untuk mengaktifkan fitur ini, yang menawarkan berbagai opsi konfigurasi, seperti daftar alamat IP yang diizinkan atau ditolak, rentang alamat IP, dan pesan kesalahan yang dikembalikan saat menolak permintaan. Anda dapat mengonfigurasi opsi ini sesuai kebutuhan Anda untuk mencapai kontrol akses yang lebih halus. Perlu dicatat bahwa kontrol akses berbasis IP mungkin memiliki beberapa keterbatasan, karena alamat IP dapat dipalsukan atau dibagikan. Oleh karena itu, saat menggunakan plugin ip-restriction, sebaiknya dikombinasikan dengan plugin kontrol akses lainnya untuk meningkatkan keamanan dan fleksibilitas sistem Anda.
2. Kontrol Akses Berbasis API Key
Kontrol akses ini adalah strategi kontrol akses API yang sangat umum. Prinsip dasarnya adalah mengautentikasi dan mengotorisasi permintaan melalui API Key yang telah dibuat sebelumnya, yang dapat dengan cepat menambahkan mekanisme autentikasi ke API. Namun, penting untuk melindungi API Key untuk mencegahnya bocor dan mengalami serangan berbahaya.
Plugin key-auth APISIX dapat dengan mudah menambahkan mekanisme autentikasi ke API Anda, dengan menambahkan kunci ke query string atau header untuk autentikasi saat mengirim permintaan. Dalam APISIX versi 3.1 dan yang lebih baru, juga mendukung enkripsi dan penyimpanan API Key di etcd menggunakan konfigurasi encrypted storage fields data_encryption, yang semakin meningkatkan keamanan API Anda.
3. Kontrol Akses Berbasis Token
Metode ini diimplementasikan dengan menambahkan bidang autentikasi yang berisi token di header permintaan. Token adalah kunci, biasanya berupa string atau angka, yang digunakan untuk memverifikasi apakah pengirim permintaan API memiliki izin untuk mengakses API. Biasanya, token berisi identitas dan izin pengguna, memungkinkan server untuk menentukan apakah pengguna memiliki izin akses saat mereka mengirimkan permintaan API dan membuat keputusan otorisasi atau penolakan yang sesuai.
APISIX menyediakan plugin jwt-auth untuk menggunakan strategi kontrol akses ini, mendukung opsi konfigurasi seperti lokasi penyimpanan token, masa berlaku token, algoritma tanda tangan JWT, dan kunci. Anda dapat mengonfigurasi opsi ini sesuai kebutuhan Anda untuk memenuhi berbagai persyaratan autentikasi.
4. Kontrol Akses Berbasis Jalur Permintaan
Kontrol akses berbasis jalur permintaan dicapai dengan memfilter dan mencocokkan jalur permintaan untuk mengontrol akses ke API, layanan, atau sumber daya tertentu. Strategi ini umumnya digunakan dalam skenario yang memerlukan kontrol akses yang lebih halus terhadap sumber daya, seperti melindungi data sensitif atau mengontrol akses pengguna tertentu ke sumber daya tertentu dalam sistem.
Plugin uri-blocker APISIX mendukung konfigurasi daftar aturan regex untuk memblokir URI permintaan pengguna, dan mengonfigurasi rejected_code dan rejected_msg untuk menentukan kode status HTTP dan badan respons yang dikembalikan setelah pemblokiran berhasil. Ini memungkinkan administrator untuk mengontrol izin pengguna dengan lebih halus dan meningkatkan keamanan dan kendali API.
5. Kebijakan Kontrol Akses Berbasis ACL
ACL (Access Control List) adalah kebijakan kontrol akses berbasis daftar yang digunakan untuk mengontrol izin akses pengguna atau grup pengguna terhadap sumber daya. Prinsip dasarnya adalah mendefinisikan daftar ACL untuk setiap sumber daya, yang mencantumkan pengguna atau grup pengguna yang diizinkan mengakses sumber daya tersebut. Ketika pengguna meminta akses ke sumber daya, akses mereka ditentukan berdasarkan daftar ACL yang sesuai.
Di APISIX, kita dapat menggunakan consumer-restriction untuk mengaktifkan fitur ini. Administrator dapat dengan mudah mengontrol pengguna atau grup pengguna mana yang dapat mengakses sumber daya tertentu dan mencegah pengguna yang tidak berwenang mengirim permintaan ke area sensitif, menghindari kebocoran data sensitif.
Pengenalan Skenario: Kontrol Akses yang Lebih Halus
Dalam skenario aplikasi dunia nyata, kita sering kali menerapkan kontrol akses yang lebih halus terhadap sumber daya yang mengandung data sensitif. Misalnya, kita sekarang memiliki dua pengguna, A dan B, yang menggunakan metode autentikasi internal yang sama, seperti key-auth atau basic-auth. Kami juga ingin menerapkan kontrol akses yang lebih halus untuk pengguna B, melarang mereka mengakses beberapa API tertentu.

Kita dapat menggunakan plugin consumer-restriction APISIX untuk beberapa kontrol yang lebih halus. Plugin ini memungkinkan Anda untuk menetapkan batasan akses berdasarkan Route, Service, atau Consumer, dan mendukung konfigurasi empat nilai atribut type:
consumer_name: Membatasi akses Consumer ke Route atau Service dengan mencantumkanusernameConsumer dalam daftar putih atau daftar hitam.consumer_group_id: Membatasi akses Consumer ke Route atau Service dengan mencantumkanidGrup Consumer dalam daftar putih atau daftar hitam.service_id: Membatasi akses Consumer ke Service dengan mencantumkanidService dalam daftar putih atau daftar hitam. Ini harus digunakan bersama dengan plugin otorisasi.route_id: Membatasi akses Consumer ke Route dengan mencantumkanidRoute dalam daftar putih atau daftar hitam.
Dalam skenario ini, kita dapat menggunakan dua metode konfigurasi untuk mencegah pengguna B mengakses sumber daya API tertentu.
Menetapkan Kebijakan Kontrol Akses di Route
- Pertama, kita perlu membuat dua objek Consumer di APISIX dan mengaktifkan plugin
basic-auth, dengan nama userA dan userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userA", "plugins": { "basic-auth": { "username":"userA", "password": "123456" } } }' curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userB", "plugins": { "basic-auth": { "username":"userB", "password": "123456" } } }'
- Kemudian kita mengaktifkan dan mengonfigurasi properti
whitelistdariconsumer-restrictionpada route di mana kita perlu menerapkan pembatasan dan menambahkanusernamedari consumer userA yang telah dibuat sebelumnya. Dengan cara ini, route hanya akan menerima permintaan dari userA.
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d ' { "uri": "/get", "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } }, "plugins": { "basic-auth": {}, "consumer-restriction": { "whitelist": [ "userA" ] } } }'
- Kirim permintaan akses secara terpisah menggunakan userA dan userB.
curl -u userA:123456 http://127.0.0.1:9080/get -i HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i HTTP/1.1 403 Forbidden ... {"message":"The consumer_name is forbidden."}
Hasilnya menunjukkan bahwa userB telah dibatasi dari mengakses sumber daya API.
Menyiapkan Kebijakan Kontrol Izin di Consumer
- Pertama, kita akan menyiapkan route yang ID-nya disebut
forbidden-userB, dan mengaktifkan pluginbasic-auth.
curl http://127.0.0.1:9180/apisix/admin/routes -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -d ' { "id": "forbidden-userB", "uri": "/get", "upstream": { "type": "roundrobin", "nodes": { "httpbin.org:80": 1 } }, "plugins": { "basic-auth": {} } }'
- Buat dua objek Consumer dan aktifkan plugin
basic-auth. Perhatikan bahwa kita perlu mengonfigurasi pluginconsumer-restrictionuntuk memperhalus kebijakan kontrol izin untuk userB.
curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userA", "plugins": { "basic-auth": { "username":"userA", "password": "123456" } } }' curl http://127.0.0.1:9180/apisix/admin/consumers -H 'X-API-KEY: {YOUR_API_KEY}' -X PUT -i -d ' { "username": "userB", "plugins": { "basic-auth": { "username":"userB", "password": "123456" }, "consumer-restriction": { "type": "route_id", "blacklist": [ "forbidden-userB" ], "rejected_code": 403 } } }'
- Kirim permintaan secara terpisah menggunakan userA dan userB.
curl -u userA:123456 http://127.0.0.1:9080/get -i HTTP/1.1 200 OK
curl -u userB:123456 http://127.0.0.1:9080/get -i HTTP/1.1 403 Forbidden ... {"message":"The route_id is forbidden."}
Dengan memeriksa hasil pengujian, kita dapat memverifikasi bahwa permintaan userB telah dibatasi secara efektif.
Kesimpulan
Artikel ini memperkenalkan kebijakan kontrol izin yang umum digunakan di APISIX dan mengilustrasikan cara mengaktifkan dan mengonfigurasinya di APISIX menggunakan skenario klasik. Kontrol izin adalah strategi yang umum digunakan dalam gateway API. APISIX tidak hanya menawarkan rangkaian plugin siap pakai yang komprehensif untuk autentikasi, tetapi juga memberikan dukungan luas di bidang keamanan, manajemen lalu lintas, dan observabilitas. Dengan memilih dan mengonfigurasi aturan kebijakan kontrol izin Anda, Anda dapat dengan mudah memperkuat keamanan API Anda.