簡體   English   中英

在系統中實現訪問控制

[英]Implementing Access Control in a system

我在系統中遇到了許多不同的訪問控制模型。 在任何系統中實現訪問控制模型時,我們通常通過為訪問控制創建單獨的表來對數據庫中的規則/權限進行硬編碼(考慮RDBMS)。 此外,這些規則/權限可以存儲在XML數據庫中。 我想知道在RDBMS和XML數據庫上存儲規則之間有什么區別? 此外,我們何時應該使用XACML在系統中實現訪問控制模型? 我的意思是,如何決定是否應該對數據庫中的規則/權限進行硬編碼,還是應該使用XACML策略語言?

謝謝。

免責聲明:我為Axiomatics工作,這是XACML的供應商實現

如果按照自己的方式存儲授權邏輯,可以在RDBMS或XML數據庫中完成。 沒關系。 我懷疑XML為您帶來了任何附加功能。

現在,如果您想要一個能夠滿足RDBMS系統和其他類型應用程序(CRM,.NET,Java ......)的授權系統,那么您希望使用與其保護的應用程序類型無關的解決方案。 這就是可擴展訪問控制標記語言XACML的目標。

XACML提供基於屬性的,基於策略的訪問控制(ABAC和PBAC)。 這使您能夠編寫極具表現力的授權策略,並在單個存儲庫中集中管理它們。 然后,中央授權引擎(稱為策略決策點或PDP)將為您的不同應用程序提供決策。

正如Bell指出的那樣,您需要的最小屬性集通常是關於用戶(主題),資源和操作的屬性。 XACML還允許您添加環境屬性。 這意味着您可以編寫以下類型的策略:

醫生可以查看他們被分配到的患者的醫療記錄。

  • 醫生描述了用戶/主題
  • view描述了該動作
  • 醫療記錄描述了目標資源
  • 患者也描述了目標資源。 它是關於資源的元數據
  • 他們被分配是一個有趣的案例。 這是一個定義醫生和患者之間關系的屬性。 在ABAC中,這實現為doctor.id == patient.assignedDoctorId。 這是使用XACML的主要好處之一。

XACML的優點包括: - 如Bell所述,外部化授權邏輯的能力 - 無需經歷開發/部署生命周期即可更新授權邏輯 - 能夠以相同的方式為許多不同的應用程序實現細粒度授權 - 能夠對授權邏輯進行可見性和審計

HTH

這兩者並不相互排斥。

XACML策略描述了如何將有關嘗試操作的一組屬性轉換為允許/拒絕決策。 至少屬性將是用戶是誰(主題),他們正在嘗試做什么(Action)以及他們嘗試做什么(對象)。 可以添加諸如時間,請求源和許多其他信息。

用戶和對象的屬性仍然必須存儲在數據庫中。 如果要對用戶或對象進行分組以簡化管理或簡化定義訪問控制規則,那么您將必須管理數據庫中的所有內容。 然后,需要將所有數據傳遞到XACML策略決策點以返回允許/拒絕決策。

使用XACML定義這些規則而不是為數據庫中定義的規則編寫自己的決策邏輯的優點是可以將規則的評估傳遞給外部應用程序。 使用成熟的,經過測試的XACML實現(有開源選項)可以避免在將檢查構建到自己的代碼中時出錯。

我認為,對代碼中的策略進行硬編碼是一種非常糟糕的做法。 在這種情況下,您將資源的業務邏輯與訪問控制系統的權限檢查混合在一起。 XACML是朝着正確方向邁出的一大步,因為如果將規則存儲在一個獨立的地方(在業務邏輯中沒有硬編碼),您就可以創建一個全自動的訪問控制系統。

順便說一下,你也可以將這些規則存儲在數據庫中。 例如(虛構的編程語言):

硬編碼RBAC:

@xml

    role 1 editor

@/articles

ArticleController
    @GET /
    readAll () {
        if (session.notLoggedIn())
            throw 403;
        if (session.hasRole("editor"))
            return articleModel.readAll();
        else
            return articleModel.readAllByUserId(session.getUserId());
    }

不是硬編碼的ABAC:

@db

    role 1 editor
        policy 1 read every article
            constraints
                endpoint GET /articles
            permissions
                resource
                projections full, owner

    role 2 regular user
        policy 2 read own articles
            constraints
                endpoint GET /articles
                logged in
            permissions
                resource
                projections owner


@/articles

ArticleController
    @GET /
    readAll () {
        if (session.hasProjection(full))
            return articleModel.readAll();
        else if (session.hasProjection(owner))
            return articleModel.readAllByUserId(session.getUserId());
    }

如您所見,由於代碼分離,非硬編碼代碼比硬編碼更清晰。

XACML是一個標准(它比上面的例子多10倍),因此您不必每個項目都學習一個新的訪問控制系統,而且您不必在每種語言中實現XACML,因為其他人已經如果你幸運的話,這樣做......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM