ABAC
Apakah model ABAC?
ABAC bermaksud Attribute-Based Access Control. Ia membolehkan anda mengawal akses dengan menggunakan atribut (sifat) subjek, objek, atau tindakan bukannya menggunakan nilai rentetan itu sendiri. Anda mungkin pernah mendengar tentang bahasa kawalan akses ABAC yang kompleks yang disebut XACML. ABAC Casbin, sebaliknya, jauh lebih mudah. Dalam ABAC Casbin, anda boleh menggunakan struktur atau contoh kelas sebagai ganti rentetan untuk elemen model.
Mari kita lihat contoh ABAC rasmi:
[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, kami menggunakan r.obj.Owner
bukan r.obj
. r.obj
yang diteruskan dalam fungsi Enforce()
akan menjadi struktur atau contoh kelas dan bukannya rentetan. Casbin akan menggunakan refleksi untuk mengambil pemboleh ubah ahli obj
dalam struktur atau kelas tersebut untuk anda.
Berikut adalah definisi untuk struktur atau kelas r.obj
:
type testResource struct {
Name string
Owner string
}
Jika anda ingin menyampaikan parameter kepada enforcer melalui JSON, anda perlu mengaktifkan fungsi tersebut dengan e.EnableAcceptJsonRequest(true)
.
Sebagai contoh:
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 boleh mengakibatkan penurunan prestasi sebanyak 1.1 hingga 1.5 kali ganda.
Bagaimana menggunakan ABAC?
Untuk menggunakan ABAC, anda perlu melakukan dua perkara:
- Nyatakan atribut-atribut dalam penapis model.
- Hantar turunan struktur atau contoh kelas untuk elemen tersebut sebagai argumen kepada fungsi
Enforce()
Casbin.
Pada masa ini, hanya elemen permintaan seperti r.sub
, r.obj
, r.act
, dan sebagainya yang menyokong ABAC. Anda tidak boleh menggunakannya pada elemen polisi seperti p.sub
kerana tidak ada cara untuk menentukan struktur atau kelas dalam polisi Casbin.
Anda boleh menggunakan berbilang atribut ABAC dalam penapis. Contohnya: m = r.sub.Domain == r.obj.Domain
.
Jika anda perlu menggunakan koma dalam polisi yang bercanggah dengan pemisah CSV, anda boleh mengelakkannya dengan mengelilingi pernyataan tersebut dengan tanda petikan. Sebagai contoh, "keyMatch("bob", r.sub.Role)"
tidak akan dipisahkan.
Menskalakan model untuk peraturan ABAC yang kompleks dan banyak
Penerapan model ABAC di atas adalah mudah pada intinya. Namun, dalam banyak kes, sistem kebenaran memerlukan sejumlah besar dan kompleks peraturan ABAC. Untuk mengikuti keperluan ini, disarankan untuk menambahkan peraturan dalam dasar dan bukannya dalam model. Ini boleh dilakukan dengan memperkenalkan konstruk fungsi eval()
. Berikut adalah contohnya:
Ini adalah definisi fail CONF
yang digunakan untuk menentukan 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 struktur atau kelas (jenis yang ditentukan pengguna) yang mengandungi atribut yang diperlukan untuk digunakan dalam dasar.
Ini adalah dasar yang digunakan terhadap model untuk Penguatkuasaan
. Sekarang, anda boleh menggunakan contoh objek yang diteruskan ke eval()
sebagai parameter untuk menentukan beberapa kekangan ABAC.
p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write