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")
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:
- Tentukan atribut-atribut dalam pencocok model.
- Lewatkan instance struct atau kelas untuk elemen tersebut sebagai argumen ke fungsi
Enforce()
Casbin.
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.
Anda dapat menggunakan beberapa atribut ABAC dalam pencocok. Contohnya: m = r.sub.Domain == r.obj.Domain
.
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