Apache APISIX Berintegrasi dengan Open Policy Agent untuk Memperkaya Ekosistemnya
API7.ai
December 24, 2021
Open Policy Agent (OPA) adalah mesin kebijakan sumber terbuka yang ringan dan serbaguna yang dapat menggantikan modul fungsi kebijakan bawaan dalam perangkat lunak dan membantu pengguna memisahkan layanan dari mesin kebijakan. Berkat ekosistem OPA yang sudah mapan, pengguna dapat dengan mudah mengintegrasikan OPA dengan layanan lain, seperti pustaka program, API HTTP, dan sebagainya.
Seperti yang ditunjukkan pada gambar di bawah ini, OPA pertama-tama mendeskripsikan kebijakan melalui bahasa kebijakan Rego; kemudian menyimpan data kebijakan melalui JSON, setelah itu pengguna dapat mengirim permintaan kueri. Setelah menerima permintaan kueri, OPA akan menggabungkan kebijakan, data, dan masukan pengguna untuk menghasilkan keputusan kebijakan dan mengirim keputusan tersebut ke layanan.

Pengenalan Plugin
Apache APISIX menyediakan plugin opa yang memungkinkan pengguna dengan mudah memperkenalkan kemampuan kebijakan yang disediakan oleh OPA ke Apache APISIX untuk mengaktifkan fitur autentikasi dan kontrol akses yang fleksibel.
Setelah mengonfigurasi plugin opa pada suatu rute, Apache APISIX akan mengumpulkan informasi permintaan, informasi koneksi, dan sebagainya ke dalam data JSON dan mengirimkannya ke alamat API keputusan kebijakan saat memproses permintaan respons. Selama kebijakan yang diterapkan di OPA sesuai dengan spesifikasi data yang ditetapkan oleh Apache APISIX, fungsi seperti meneruskan permintaan, menolak permintaan, kode status kustom, header respons kustom, dan sebagainya dapat diimplementasikan.
Artikel ini menggunakan API HTTP sebagai contoh untuk memperkenalkan plugin opa dan menjelaskan secara rinci cara mengintegrasikan Apache APISIX dengan OPA untuk memisahkan otorisasi autentikasi untuk layanan backend.
Cara Menggunakan
Membangun Lingkungan Uji
-
Gunakan Docker untuk membangun layanan OPA.
# Menjalankan OPA dengan Docker docker run -d --name opa -p 8181:8181 openpolicyagent/opa:0.35.0 run -s -
Buat kebijakan
example.# Membuat kebijakan curl -XPUT 'localhost:8181/v1/policies/example' \ --header 'Content-Type: text/plain' \ --data-raw 'package example import input.request import data.users default allow = false allow { # memiliki header permintaan dengan nama test-header dan nilai only-for-test request.headers["test-header"] == "only-for-test" # Metode permintaan adalah GET request.method == "GET" # Jalur permintaan dimulai dengan /get startswith(request.path, "/get") # Parameter GET test ada dan tidak sama dengan abcd request.query["test"] != "abcd" # Parameter GET user ada request.query["user"] } reason = users[request.query["user"]].reason { not allow request.query["user"] } headers = users[request.query["user"]].headers { not allow request.query["user"] } status_code = users[request.query["user"]].status_code { not allow request.query["user"] }' -
Buat data
users.# Membuat data pengguna uji curl -XPUT 'localhost:8181/v1/data/users' \ --header 'Content-Type: application/json' \ --data-raw '{ "alice": { "headers": { "Location": "http://example.com/auth" }, "status_code": 302 }, "bob": { "headers": { "test": "abcd", "abce": "test" } }, "carla": { "reason": "Give you a string reason" }, "dylon": { "headers": { "Content-Type": "application/json" }, "reason": { "code": 40001, "desc": "Give you a object reason" } } }'
Membuat Rute dan Mengaktifkan Plugin
Jalankan perintah berikut untuk membuat rute dan mengaktifkan plugin opa.
curl -XPUT 'http://127.0.0.1:9080/apisix/admin/routes/r1' \ --header 'X-API-KEY: <api-key>' \ --header 'Content-Type: application/json' \ --data-raw '{ "uri": "/*", "methods": [ "GET", "POST", "PUT", "DELETE" ], "plugins": { "opa": { "host": "http://127.0.0.1:8181", "policy": "example" } }, "upstream": { "nodes": { "httpbin.org:80": 1 }, "type": "roundrobin" } }'
Menguji Permintaan
Selanjutnya, jalankan perintah berikut untuk mengirim permintaan ke plugin opa untuk menguji status berjalan plugin.
# Mengizinkan permintaan curl -XGET '127.0.0.1:9080/get?test=none&user=dylon' \ --header 'test-header: only-for-test' { "args": { "test": "abcd1", "user": "dylon" }, "headers": { "Test-Header": "only-for-test", "with": "more" }, "origin": "127.0.0.1", "url": "http://127.0.0.1/get?test=abcd1&user=dylon" } # Menolak permintaan dan menulis ulang kode status dan header respons curl -XGET '127.0.0.1:9080/get?test=abcd&user=alice' \ --header 'test-header: only-for-test' HTTP/1.1 302 Moved Temporarily Date: Mon, 20 Dec 2021 09:37:35 GMT Content-Type: text/html Content-Length: 142 Connection: keep-alive Location: http://example.com/auth Server: APISIX/2.11.0 # Menolak permintaan dan mengembalikan header respons kustom curl -XGET '127.0.0.1:9080/get?test=abcd&user=bob' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:38:27 GMT Content-Type: text/html; charset=utf-8 Content-Length: 150 Connection: keep-alive abce: test test: abcd Server: APISIX/2.11.0 # Menolak permintaan dan mengembalikan respons kustom (string) curl -XGET '127.0.0.1:9080/get?test=abcd&user=carla' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:38:58 GMT Content-Type: text/plain; charset=utf-8 Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/2.11.0 Give you a string reason # Menolak permintaan dan mengembalikan respons kustom (JSON) curl -XGET '127.0.0.1:9080/get?test=abcd&user=dylon' \ --header 'test-header: only-for-test' HTTP/1.1 403 Forbidden Date: Mon, 20 Dec 2021 09:42:12 GMT Content-Type: application/json Transfer-Encoding: chunked Connection: keep-alive Server: APISIX/2.11.0 {"code":40001,"desc":"Give you a object reason"}
Menonaktifkan Plugin
Berkat sifat dinamis Apache APISIX, plugin OPA pada suatu rute dapat dimatikan dengan cukup menghapus konfigurasi plugin opa dari konfigurasi rute dan menyimpannya.
Kesimpulan
Artikel ini menjelaskan langkah-langkah rinci untuk menghubungkan Apache APISIX dan Open Policy Agent. Kami berharap artikel ini dapat memberikan pemahaman yang lebih jelas tentang penggunaan Open Policy Agent di Apache APISIX dan memudahkan operasi praktis selanjutnya.
Apache APISIX tidak hanya berkomitmen untuk mempertahankan kinerja tingginya sendiri, tetapi juga selalu menaruh perhatian besar pada pembangunan ekosistem sumber terbuka. Saat ini, Apache APISIX memiliki lebih dari 10 plugin terkait otorisasi autentikasi yang mendukung antarmuka dengan layanan otorisasi autentikasi utama di industri.
Jika Anda memiliki kebutuhan untuk menghubungkan dengan otoritas autentikasi lainnya, kunjungi GitHub Apache APISIX dan tinggalkan saran Anda melalui issue; atau berlangganan mailing list Apache APISIX untuk menyampaikan ide Anda melalui email.