Bỏ qua đến nội dung chính

ABAC

Mô hình ABAC là gì?

ABAC là viết tắt của Attribute-Based Access Control. Nó cho phép bạn kiểm soát truy cập bằng cách sử dụng các thuộc tính (tính chất) của chủ thể, đối tượng hoặc hành động thay vì sử dụng các giá trị chuỗi một cách trực tiếp. Bạn có thể đã nghe đến một ngôn ngữ điều khiển truy cập ABAC phức tạp được gọi là XACML. Trong khi đó, ABAC của Casbin thì đơn giản hơn nhiều. Trong ABAC của Casbin, bạn có thể sử dụng cấu trúc (structs) hoặc các thể hiện của lớp (class instances) thay vì chuỗi cho các phần tử mô hình.

Hãy cùng xem xét ví dụ chính thức về 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

Trong matcher, chúng ta sử dụng r.obj.Owner thay vì r.obj. r.obj được truyền vào hàm Enforce() sẽ là một cấu trúc hoặc thể hiện của lớp thay vì một chuỗi. Casbin sẽ sử dụng phản chiếu (reflection) để lấy biến thành viên obj trong cấu trúc hoặc lớp đó cho bạn.

Đây là định nghĩa cho cấu trúc hoặc lớp r.obj:

type testResource struct {
Name string
Owner string
}

Nếu bạn muốn truyền tham số cho enforcer thông qua JSON, bạn cần kích hoạt chức năng đó với e.EnableAcceptJsonRequest(true).

Ví dụ:

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

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

ok, _ := e.Enforce("alice", data1Json, "read")
ghi chú

Cho phép chức năng chấp nhận tham số JSON có thể dẫn đến giảm hiệu suất từ 1.1 đến 1.5 lần.

Làm thế nào để sử dụng ABAC?

Để sử dụng ABAC, bạn cần làm hai việc:

  1. Chỉ định các thuộc tính trong bộ so khớp mô hình.
  2. Truyền vào thể hiện của struct hoặc lớp cho phần tử như một đối số cho hàm Enforce() của Casbin.
nguy hiểm

Hiện tại, chỉ có các phần tử yêu cầu như r.sub, r.obj, r.act, v.v... hỗ trợ ABAC. Bạn không thể sử dụng nó trên các phần tử chính sách như p.sub vì không có cách nào để định nghĩa một struct hoặc lớp trong chính sách của Casbin.

mẹo

Bạn có thể sử dụng nhiều thuộc tính ABAC trong một bộ so khớp. Ví dụ: m = r.sub.Domain == r.obj.Domain.

mẹo

Nếu bạn cần sử dụng dấu phẩy trong một chính sách mà xung đột với dấu phân cách của CSV, bạn có thể thoát khỏi nó bằng cách bao quanh câu lệnh với dấu ngoặc kép. Ví dụ, "keyMatch("bob", r.sub.Role)" sẽ không bị tách ra.

Mở rộng mô hình cho số lượng lớn và phức tạp của các quy tắc ABAC

Việc triển khai mô hình ABAC ở trên đơn giản ở cốt lõi của nó. Tuy nhiên, trong nhiều trường hợp, hệ thống ủy quyền yêu cầu một số lượng lớn và phức tạp của các quy tắc ABAC. Để đáp ứng yêu cầu này, nên thêm các quy tắc vào chính sách thay vì vào mô hình. Điều này có thể được thực hiện bằng cách giới thiệu một cấu trúc chức năng eval(). Đây là một ví dụ:

Đây là định nghĩa của tệp CONF được sử dụng để định nghĩa mô hình 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

Trong ví dụ này, p.sub_rule là một cấu trúc hoặc lớp (kiểu người dùng định nghĩa) chứa các thuộc tính cần thiết để sử dụng trong chính sách.

Đây là chính sách được sử dụng đối với mô hình cho Enforcement. Bây giờ, bạn có thể sử dụng thể hiện đối tượng được truyền vào eval() làm tham số để định nghĩa một số ràng buộc ABAC.

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