ABAC
ABAC modeli nedir?
ABAC, Öznitelik Tabanlı Erişim Kontrolü anlamına gelir. Erişimi, dizelerin kendileri yerine konu, nesne veya eylemin özelliklerini (özniteliklerini) kullanarak kontrol etmenize olanak tanır. Karmaşık bir ABAC erişim kontrol dili olan XACML'yi duymuş olabilirsiniz. Casbin's ABAC ise çok daha basittir. Casbin's ABAC'te, model elemanları için stringler yerine struct'lar veya sınıf örnekleri kullanabilirsiniz.
Resmi ABAC örneğine bir göz atalım:
[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
Eşleştiricide, r.obj
yerine r.obj.Owner
kullanıyoruz. Enforce()
fonksiyonuna geçirilen r.obj
, string yerine bir struct veya sınıf örneği olacaktır. Casbin, sizin için o struct veya sınıftaki obj
üye değişkenini yansıma yoluyla alacaktır.
İşte r.obj
struct veya sınıfı için bir tanım:
type testResource struct {
Name string
Owner string
}
Eğer parametreleri JSON üzerinden zorlayıcıya iletmek istiyorsanız, e.EnableAcceptJsonRequest(true)
fonksiyonunu etkinleştirmeniz gerekir.
Örneğin:
e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)
data1Json := `{ "Name": "data1", "Owner": "bob"}`
ok, _ := e.Enforce("alice", data1Json, "read")
JSON parametrelerini kabul etme fonksiyonunu etkinleştirmek, performansın 1.1 ila 1.5 kat düşmesine neden olabilir.
ABAC nasıl kullanılır?
ABAC'ı kullanmak için iki şey yapmanız gerekiyor:
- Model eşleştiricisinde öznitelikleri belirtin.
- Casbin'in
Enforce()
fonksiyonuna bağımsız değişken olarak öğe için yapı veya sınıf örneğini iletin.
Şu anda sadece r.sub
, r.obj
, r.act
gibi istek öğeleri ABAC'ı desteklemektedir. Casbin'in politikasında bir yapı veya sınıf tanımlamanın bir yolu olmadığı için p.sub
gibi politika öğelerinde kullanamazsınız.
Eşleştiricide birden fazla ABAC özniteliği kullanabilirsiniz. Örneğin: m = r.sub.Domain == r.obj.Domain
.
CSV'nin ayırıcısıyla çakışan bir politika içinde virgül kullanmanız gerekiyorsa, ifadeyi tırnak işaretleriyle çevreleyerek kaçış yapabilirsiniz. Örneğin, "keyMatch("bob", r.sub.Role)"
bölünmeyecektir.
Karmaşık ve büyük sayıda ABAC kuralı için modeli ölçeklendirme
Yukarıdaki ABAC modelinin uygulanması, temelde basittir. Ancak, birçok durumda, yetkilendirme sistemi karmaşık ve büyük sayıda ABAC kuralı gerektirir. Bu gereksinimi karşılamak için, kuralları model yerine politikada eklemek önerilir. Bu, bir eval()
işlevsel yapı tanıtarak yapılabilir. İşte bir örnek:
Bu, ABAC modelini tanımlamak için kullanılan CONF
dosyasının tanımıdır.
[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
Bu örnekte, p.sub_rule
, politikada kullanılacak gerekli nitelikleri içeren bir yapı veya sınıf (kullanıcı tanımlı tip) dır.
Bu, Enforcement
için modelle karşılaştırılan politikadır. Şimdi, eval()
'e geçirilen nesne örneğini, belirli ABAC kısıtlamalarını tanımlamak için bir parametre olarak kullanabilirsiniz.
p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write