Autorisierungsmechanismen in Rust-Webanwendungen

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





Ăśbertragung von Rechten an andere Benutzer
Ăśbertragung von Rechten an andere Benutzer

- , (ACL).



       , .





, .





  • MAC (Mandatory access-control) –





Datenschutzetikett

(, ), .



( ), . .



, MAC , ( , ).





  • RBAC (Role-Based access-control) –





, - . DAC, .





, .



, RBAC PBAC (Permission-Based access-control) , (: READ_DOCUMENT



, WRITE_DOCUMENT



, DELETE_DOCUMENT



) , – .





  • ABAC (Attribute-Based access-control) –





Attributbeispiele

, , .  





, , , , .., .





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.





actix-web-grants

Middleware



.





, , , : (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 ( ).





:







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!








All Articles