Ana içeriğe atla

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")
not

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:

  1. Model eşleştiricisinde öznitelikleri belirtin.
  2. Casbin'in Enforce() fonksiyonuna bağımsız değişken olarak öğe için yapı veya sınıf örneğini iletin.
tehlike

Ş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.

ipucu

Eşleştiricide birden fazla ABAC özniteliği kullanabilirsiniz. Örneğin: m = r.sub.Domain == r.obj.Domain.

ipucu

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