Lewati ke konten utama

ABAC

Apa itu model ABAC?

ABAC merupakan singkatan dari Attribute-Based Access Control. Ini memungkinkan Anda mengendalikan akses dengan menggunakan atribut (properti) subjek, objek, atau tindakan, bukan dengan menggunakan nilai string itu sendiri. Anda mungkin pernah mendengar tentang bahasa kontrol akses ABAC yang rumit yang disebut XACML. ABAC Casbin, di sisi lain, jauh lebih sederhana. Di ABAC Casbin, Anda dapat menggunakan struct atau instance kelas alih-alih string untuk elemen model.

Mari kita lihat contoh resmi ABAC:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

Dalam matcher, kita menggunakan r.obj.Owner alih-alih r.obj. r.obj yang diteruskan dalam fungsi Enforce() akan menjadi struct atau instance kelas daripada string. Casbin akan menggunakan refleksi untuk mengambil variabel anggota obj dalam struct atau kelas tersebut untuk Anda.

Berikut adalah definisi untuk struct atau kelas r.obj:

type testResource struct {
Name string
Owner string
}

Jika Anda ingin meneruskan parameter ke enforcer melalui JSON, Anda perlu mengaktifkan fungsi tersebut dengan e.EnableAcceptJsonRequest(true).

Misalnya:

e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)

data1Json := `{ "Name": "data1", "Owner": "bob"}`

ok, _ := e.Enforce("alice", data1Json, "read")
catatan

Mengaktifkan fungsi penerimaan parameter JSON dapat mengakibatkan penurunan performa sebesar 1,1 hingga 1,5 kali.

Bagaimana cara menggunakan ABAC?

Untuk menggunakan ABAC, Anda perlu melakukan dua hal:

  1. Tentukan atribut-atribut dalam pencocok model.
  2. Lewatkan instance struct atau kelas untuk elemen tersebut sebagai argumen ke fungsi Enforce() Casbin.
bahaya

Saat ini, hanya elemen permintaan seperti r.sub, r.obj, r.act, dan sebagainya yang mendukung ABAC. Anda tidak dapat menggunakannya pada elemen kebijakan seperti p.sub karena tidak ada cara untuk mendefinisikan struct atau kelas dalam kebijakan Casbin.

tip

Anda dapat menggunakan beberapa atribut ABAC dalam pencocok. Contohnya: m = r.sub.Domain == r.obj.Domain.

tip

Jika Anda perlu menggunakan koma dalam kebijakan yang bertentangan dengan pemisah CSV, Anda dapat meng-escape-nya dengan mengapit pernyataan tersebut dengan tanda kutip. Misalnya, "keyMatch("bob", r.sub.Role)" tidak akan dipisah.

Menskalakan model untuk aturan ABAC yang kompleks dan jumlah besar

Implementasi model ABAC di atas pada dasarnya sederhana. Namun, dalam banyak kasus, sistem otorisasi memerlukan sejumlah besar dan kompleks dari aturan ABAC. Untuk mengakomodasi kebutuhan ini, disarankan untuk menambahkan aturan dalam kebijakan daripada dalam model. Hal ini dapat dilakukan dengan memperkenalkan konstruksi fungsional eval(). Berikut adalah contohnya:

Ini adalah definisi file CONF yang digunakan untuk mendefinisikan model ABAC.

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act

Dalam contoh ini, p.sub_rule adalah struct atau kelas (tipe yang ditentukan pengguna) yang berisi atribut-atribut yang diperlukan untuk digunakan dalam kebijakan.

Ini adalah kebijakan yang digunakan terhadap model untuk Enforcement. Sekarang, Anda dapat menggunakan instance objek yang diteruskan ke eval() sebagai parameter untuk mendefinisikan batasan ABAC tertentu.

p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write