Um die Anwendungssicherheit zu gewährleisten, verwenden wir Mechanismen wie Authentifizierung und Autorisierung. Ich denke, viele von Ihnen sind mit diesen Konzepten vertraut, und in diesem Artikel werden wir uns auf das Konzept der Autorisierung und verwandte Zugriffssteuerungsmodelle konzentrieren.
Definitionen der in diesem Artikel verwendeten Begriffe
Es ist wichtig, die Unterschiede zwischen Autorisierung und Authentifizierung zu verstehen:
– , ( , ).
– , .
– , .
– , , .
(Crate) – Rust.
Der Autorisierungsprozess umfasst das Konzept einer Zugriffssteuerungsrichtlinie , nach der eine Reihe zulässiger Aktionen eines bestimmten Benutzers ( Zugriffssubjekt ) über die Systemressourcen ( Zugriffsobjekt ) festgelegt wird .
Und auch das Zugriffssteuerungsmodell - ein allgemeines Schema zur Abgrenzung des Zugriffs durch eine Benutzerrichtlinie, die wir in Abhängigkeit von verschiedenen Faktoren und Systemanforderungen auswählen.
Werfen wir einen Blick auf die grundlegenden Modelle fĂĽr die Zugangskontrolle:
DAC ( Discretionary Access Control ) - selektive (diskretionäre) Zugangskontrolle
- , (ACL).
, .
, .
MAC (Mandatory access-control) –
(, ), .
( ), . .
, MAC , ( , ).
RBAC (Role-Based access-control) –
, - . DAC, .
, .
, RBAC PBAC (Permission-Based access-control) , (: READ_DOCUMENT
, WRITE_DOCUMENT
, DELETE_DOCUMENT
) , – .
ABAC (Attribute-Based access-control) –
, , .
, , , , .., .
ABAC , ( ) ( ).
OWASP (Open Web Application Security Project) IBM.
, , .
- Rust?
, - (, actix-web, Rocket tide), Middleware, FromRequest Guard (Filter warp).
, . , .
, . , , .
casbin-rs
Casbin – production-ready , , ( ACL, RBAC, ABAC) .
casbin - PERM (Policy, Effect, Request, Matchers) , , .
# Request definition
[request_definition]
r = sub, obj, act
# Policy definition
[policy_definition]
p = sub, obj, act
# Policy effect
[policy_effect]
e = some(where (p.eft == allow))
# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
, -
( ), PERM .
p, alice, data1, read p, bob, data2, write
, .
use casbin::prelude::*;
#[tokio::main]
async fn main() -> () {
let mut e = Enforcer::new("examples/acl_model.conf", "examples/acl_policy.csv").await?;
e.enable_log(true);
let sub = "alice"; // the user that wants to access a resource.
let obj = "data1"; // the resource that is going to be accessed.
let act = "read"; // the operation that the user performs on the resource.
if let Ok(authorized) = e.enforce((sub, obj, act)) {
if authorized {
// permit alice to read data1
} else {
// deny the request
}
} else {
// error occurs
}
}
. , !
, , , , , , , .
, backend Rust. PBAC -, ACL/RBAC.
actix-web-grants
, , , : (ACL), (RBAC/PBAC).
, :
// Sample application with grant protection based on extracting by your custom function
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
let auth = GrantsMiddleware::with_extractor(extract);
App::new()
.wrap(auth)
.service(index)
})
.bind("localhost:8081")?
.run()
.await
}
async fn extract(_req: &ServiceRequest) -> Result<Vec<String>, Error> {
// Here is a place for your code to get user permissions/grants/permissions from a request
// For example from a token or database
// Stub example
Ok(vec![ROLE_ADMIN.to_string()])
}
: JWT-, , .
:
use actix_web_grants::proc_macro::{has_roles};
#[get("/secure")]
#[has_roles("ROLE_ADMIN")]
async fn macro_secured() -> HttpResponse {
HttpResponse::Ok().body("ADMIN_RESPONSE")
}
actix-web-grants, .
, ( wrk) .
RBAC - : , . . GitHub: actix-web-authz-benchmark ( ).
:
|
casbin-rs |
actix-web-grants |
||
Latency |
Req/Sec |
Latency |
Req/Sec |
|
Allowed Endpoint |
6.18 ms |
16.27k |
4.41 ms |
22.69k |
Denied Endpoint |
6.70 ms |
14.98k |
4.94 ms |
20.23k |
rustc: v1.52.0 (stable); CPU: 2,6 GHz 6-Core Intel Core i7; RAM: 16 GB
, , actix-web-grants (endpoints), casbin-rs.
Post Scriptum
Diese Bibliothek ist noch nicht in viele Web-Frameworks in ihrem Arsenal integriert, aber ich habe vor, einige Abstraktionen einzuführen und Module für andere Frameworks zu schreiben, einige Verbesserungen vorzunehmen (z. B. die Fähigkeit, Rollen zu erben und benutzerdefinierte Typen zu unterstützen). Anregungen und Beiträge sind willkommen!