?XML 安全: 使用 XACML 控制信息訪問
?????????為適當的人提供適當的訪問權限和首先擁有信息同樣重要(如果不是更重要的話)??蓴U展訪問控制標記語言(或 XACML)提供了創建策略和規則來控制信息訪問的機制。本文中,作者 Manish Verma 將繼續關于 XML 問題的討論,介紹如何在應用程序中集成 XACML。
關于 XML 安全的上一篇文章中,我討論了安全性斷言標記語言(Security Assertion Markup Language,SAML)。本文將討論可擴展訪問控制標記語言,并從上一期留下的問題開始。SAML 提供了進行驗證和授權斷言以及傳遞斷言的機制,而 XACML 則提供了定義進行必要的授權決策所需規則的語言。
?????????比如,假設這樣一個場景:某一主體請求訪問目標資源,策略執行點(PEP)在決定將目標資源發布給主體之前,要使用策略決策點(PDP)進行檢查。訪問目標資源請求的生成,以及后續的允許或拒絕訪問響應,都屬于 SAML 的范圍。XACML 解決了 PEP 與 PDP 之間的策略決策交換問題。
訪問控制 XACML
?????????XACML 的初衷是開發一項訪問控制和授權系統的標準。目前多數系統都以專有的方式實現訪問控制和授權。
?????????典型的訪問控制和授權場景包括三個主要實體:主體、資源和動作以及它們的屬性。主體請求得到對資源執行動作的權限。比如,訪問請求“允許財務經理在財務服務器上的發票文件夾中創建文件”中,主體是“財務經理”,目標資源是“財務服務器上的發票文件夾”,動作是“創建文件”。
?????????在專有訪問控制系統中,這些實體及其屬性的信息保存在資料庫中。這種資料庫稱為訪問控制鏈表(ACL)。不同的專有系統有不同的實現 ACL 的機制,因此難以交換和共享信息。
XACML 的目標
XACML 主要將解決以下問題:
??????1,創建一種可移植的、標準的方式來描述訪問控制實體及其屬性。?
????? 2,?提供一種機制,以比簡單地拒絕訪問或授權訪問更細粒度的控制訪問,也就是說,在“允許”或? “拒絕”之前或之后執行某些操作。
XACML 和 SAML:差別與類似之處
??????XACML 體系結構與 SAML 體系結構是緊密相關的。它們有很多相同的概念,要處理的問題域也在很大程度上重疊:驗證、授權和訪問控制。但是在同一問題域中,它們要解決的是不同的問題。SAML 要解決的是驗證,并提供一種機制,在協同實體間傳遞驗證和授權決策,而 XACML 則專注于傳遞這些授權決策的機制。
??????SAML 標準提供了允許第三方實體請求驗證和授權信息的接口。內部如何處理這些授權請求則由 XACML 標準解決。XACML 不但處理授權請求,而且還定義了一種機制,來創建進行授權決策所需的規則、策略和策略集的完整基礎設施。我將在 XACML 詳解中詳細說明這些概念。
既然 SAML 與 XACML 分享同一個領域,那么這兩種規范很可能最終會合并成一個規范,希望如此。
XACML 體系結構
?????????XACML 由圖 1 中所示的多個組件組成。其中一些組件還可以與 SAML 共享。共享的組件用紅線框標記。
圖 1. XACML 主要組件
?????????授權請求到達策略執行點(PEP)。PEP 創建一個 XACML 請求并發送到策略決策點(PDP),后者評估請求并返回一個響應。該響應可以是允許訪問的,也可以是拒絕訪問的,并具有適當的義務。本文稍后部分將解釋這些義務。
?????????PDP 評估請求中的相關策略和規則后會作出決策??梢詰玫牟呗杂卸喾N,PDP 并沒有評估所有的策略,而是根據策略目標選擇相關的策略進行評估。策略目標包括關于主體、動作和其他環境屬性的信息。后面的策略目標創建一節中將說明 PDP 選擇評估策略的完整過程。
?????????為了獲得策略,PDP 要用到策略訪問點(PAP),PAP 編寫策略和策略集,供 PDP 使用。PDP 也可以調用策略信息點(PIP)服務檢索與主體、資源或者環境有關的屬性值。PDP 作出的授權決策被發送到 PEP。PEP 履行義務,并根據 PDP 發送的授權決策允許或拒絕訪問。
XACML 詳解
?????????為了說明 XACML 的不同組件,我們將以一個具體的訪問請求為例,創建所需的全部 XACML 組件。訪問請求如下:主體 mverma@secf.com 屬于 owner 組(主體的屬性),它嘗試對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執行 open 動作。創建所有必需的 XACML 組件之后,應該能夠獲得該請求的授權決策。
?????????要記住,XACML 有三個頂層組件:策略、PEP 和 PDP。為定義的請求創建 XACML 基礎設施的過程,也是緊密圍繞這三個組件進行的。圖 2 說明了這些組件之間的聯系:
圖 2. 策略語言模型
首先要創建一個策略處理請求。
XACML 策略
?????????策略包括:一組規則、規則組合算法的標識符、一組義務和一個目標。這就是 XACML 最主要的方面。XACML 的多數動作發生在策略中。
?????????現在說明如何創建能夠處理該請求的策略,策略的范圍應該比請求的范圍廣。您可以創建一個這樣的策略:secf.com 名稱空間中有電子郵件名的所有用戶都可以對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執行任何操作。注意,策略比請求更具一般性。
規則組合算法
?????????規則組合算法結合策略中所有規則的結果得到最終的授權決策。XACML 定義了下面的規則組合算法(也可定義自己的算法):
1,eny-overrides(拒絕覆蓋): 只要有一條規則的評估為 Deny,那么最終授權決策也是 Deny。
Ordered-deny-overrides(有序拒絕覆蓋): 與拒絕覆蓋相同,只不過評估相關規則的順序與將規則添加到策略中的順序相同。
2,ermit-overrides(允許覆蓋): 只要有一條規則計算的評估為 Permit,則最終授權決策也是 Permit。
3,rdered-permit-overrides(允許按順序覆蓋): 與允許覆蓋相同,只不過評估相關規則的順序與規則添加到策略中的順序相同。
4,irst-applicable(最先應用): 遇到的第一條相關規則的評估結果作為最終授權決策的評估結果。
?
策略包括幾種子組件:目標、規則、規則組合算法和義務。理解策略就必須理解這些子組件(subcomponent)?,F在來看看各種子組件的重要性:
目標(Target):
?????????每個策略只有一個目標。該目標有助于確定策略是否與請求有關。策略和請求的相關性決定了是否要為請求評估該策略。這是通過定義目標中的三類屬性(主體、資源、動作)及其屬性值來實現的。目標中不一定都有這三類屬性。將這些屬性的值與請求中具有相同屬性的值進行比較,如果匹配(對其應用某些函數之后,將會看到它們是否匹配),則認為該策略是相關的,并對其進行評估。
規則:一個策略可以與多條規則相關聯。每條規則由條件、結果和目標組成。?
?????????條件是關于屬性的陳述,評估結果為 True、False 或 Indeterminate。?
?????????結果是符合規則的預期后果,值可以為 Permit 或 Deny。?
?????????目標:與策略中的目標相同,都有助于確定規則是否與請求有關,實現的機制也與策略中的目標的實現機制類似。
?????????規則的最終結果取決于條件的評估。如果條件返回 Indeterminate,則該規則返回 Indeterminate。如果條件返回 False,則規則返回 NotApplicable。如果條件返回 True,則返回 Effect 元素的值,可以是 Permit 或 Deny。?
?????????規則組合算法:如上一條規則所述,一個策略可以包含多條規則。不同的規則有可能得到沖突的結果。規則組合算法負責解決這種沖突,每一策略、每一請求都得到一個最終結果。每個策略只能使用一種規則組合算法。詳情請參閱規則組合算法。?
??????義務:要知道,XACML 的目標之一是提供更高層次的訪問控制,而不僅僅是允許和拒絕決策,義務是實現這種控制的機制。義務是 PEP 必須與授權決策的實施一起執行的動作。在評估策略之后,特定的義務與授權決策一起發送給 PEP。除了強制實施授權決策外,PEP 還負責執行義務所規定的操作。
策略的創建
這一節深入探討策略創建代碼。首先要創建 policy 對象(參見清單 1)和需要的子組件。 本文中的代碼例子都使用 Sun 的 XACML 實現(請參閱參考資料)。
清單 1. 創建策略
// Create policy identifier and policy description
URI policyId = new URI("ProjectPlanAccessPolicy");
String description =
"This AccessPolicy applies to any account at secf.com "
+ "accessing file:///D:/Documents/Administrator/Desktop/Project Plan.html.";
// Rule combining algorithm for the Policy
URI combiningAlgId = new URI(OrderedPermitOverridesRuleAlg.algId);
CombiningAlgFactory factory = CombiningAlgFactory.getInstance();
RuleCombiningAlgorithm combiningAlg =
? (RuleCombiningAlgorithm) (factory.createAlgorithm(combiningAlgId));
// Create the target for the policy
Target policyTarget = createPolicyTarget();
// Create the rules for the policy
List ruleList = createRules();
// Create the policy
Policy policy =
? new Policy(
??? policyId,
??? combiningAlg,
??? description,
??? policyTarget,
??? ruleList);
// Display the policy on the std out
policy.encode(System.out, new Indenter());
?
清單 1 說明了 policy 的創建過程。真是這樣嗎?policy 創建的主要部分是子組件的創建。該清單僅僅說明了如何將這些子組件組合成 policy 對象。不過,它確實說明了 policy 的總體結構。策略的組成過程如下:
選擇策略的規則組合算法。我使用了 ordered-permit-override 算法,因此將按照策略中規定的順序評估規則。
創建策略的目標。目標創建有點復雜,它需要專門的代碼清單和說明。清單 2 說明了策略的目標創建。
創建策略相關的規則。與目標相同,規則創建也是一個復雜的過程,需要專門的清單。清單 3 專用于說明規則創建。
創建所有必需的策略子組件之后,用它們創建 policy 對象。
將 policy 對象保存到文件中以便傳遞給 PDP。
下面幾小節說明策略子組件的創建。首先是目標創建,最后以規則創建和相關條件結束關于策略創建的討論。
策略目標創建
?????????目標創建是創建策略的一個重要方面。目標是為評估請求選擇相關策略的機制。為了創建策略目標,需要定義屬于主體、資源和動作這三種類型的實體的屬性和屬性值。當 PDP 評估請求時,它將查找目標屬性值與請求中的屬性值相同的策略。
?????????然后將說明如何通過編程來實現這些目標。XACML 提供了一種稱為 AttributeDesignator 的機制,用它來比較請求與策略目標中的屬性值。
?????????利用 AttributeDesignator,可以通過定義屬性名和類型來指定一個屬性。此外,還可以指定屬性值,也就是在目標中規定與請求中的屬性值進行比較的那個值。要進行比較,需要選擇一個預置的函數。該函數以及 AttributeDesignator 都可以用來創建 TargetMatch 對象。您可以創建多個 TargetMatch 對象,每個對象對應一個屬性。同一類的所有 TargetMatch 對象放在一個列表中,并傳遞給 Target 對象。這個 Target 對象就是用來創建 Policy 的目標對象。
?????????策略的形式應該如下所示:“允許 secf.com 名稱空間中列有電子郵件名的任何用戶對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執行任何動作?!睂τ谠摬呗裕梢詣摻ò瑑蓚€屬性的目標,分別用于主體和資源。不需要為動作創建屬性,因為要創建的策略對動作沒有任何限制。
?????????清單 2 說明了策略目標的創建。因為要比較請求中主體電子郵件字段的值和目標中規定的字段的值,因此對于主體,可以在目標中指定屬性 urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name(電子郵件 ID)。在目標中定義屬性類型(urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name)、屬性名(urn:oasis:names:tc:xacml:1.0:subject:subject-id)和比較函數(urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match)。 該函數將目標中規定的屬性值與請求中具有相同屬性的值進行比較。資源類型 http://www.w3.org/2001/XMLSchema#anyURI 的屬性也是按照類似的步驟進行比較的。
清單 2. 創建策略目標
public static Target createPolicyTarget() throws URISyntaxException {
? List subjects = new ArrayList();
? List resources = new ArrayList();
? // Attributes of Subject type
? // Multiple subject attributes can be specified. In this
? // case only one is being defined.
? List subject = new ArrayList();
? URI subjectDesignatorType =
??? new URI("urn:oasis:names:tc:xacml:1.0:data-type:rfc822Name");
? URI subjectDesignatorId =
??? new URI("urn:oasis:names:tc:xacml:1.0:subject:subject-id");
? // Match function for the subject-id attribute
? String subjectMatchId =
??? "urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match";
? AttributeDesignator subjectDesignator =
??? new AttributeDesignator(
????????????????? AttributeDesignator.SUBJECT_TARGET,
????????????????? subjectDesignatorType,
????????????????? subjectDesignatorId,
????????????????? false);
? StringAttribute subjectvalue = new
??? StringAttribute("secf.com");
? // get the factory that handles Target functions
? FunctionFactory factory =
??? FunctionFactory.getTargetInstance();
? // get an instance of the right function for matching
? // subject attributes
? Function subjectFunction =
??? factory.createFunction(subjectMatchId);
? TargetMatch subjectMatch = new TargetMatch(
????????????????????????? TargetMatch.SUBJECT,
????????????????? subjectFunction,
????????????????? subjectDesignator,
????????????????? subjectvalue);
? subject.add(subjectMatch);
? // Attributes of resource type
? // Multiple resource attributes can be specified. In this
? // case only one is being defined.
? List resource = new ArrayList();
? URI resourceDesignatorType =
??? new URI("? URI resourceDesignatorId =
??? new URI("urn:oasis:names:tc:xacml:1.0:resource:resource-id");
? // Match function for the resource-id attribute
? String resourceMatchId =
??? "urn:oasis:names:tc:xacml:1.0:function:anyURI-equal";
? AttributeDesignator resourceDesignator =
??? new AttributeDesignator(
????????????????? AttributeDesignator.RESOURCE_TARGET,
????????????????? resourceDesignatorType,
????????????????? resourceDesignatorId,
????????????????? false);
? AnyURIAttribute resourcevalue =
??? new AnyURIAttribute(
????? new URI("file:///D:/Documents/Administrator/Desktop/Project Plan.html"));
? // Get an instance of the right function for matching
? // resource attribute
? Function resourceFunction =
??? factory.createFunction(resourceMatchId);
? TargetMatch resourceMatch = new TargetMatch(
?????????????????????????????? TargetMatch.RESOURCE,
???????????????????????? resourceFunction,
???????????????????????? resourceDesignator,
???????????????????????? resourcevalue);
? resource.add(resourceMatch);
? // Put the subject and resource sections into their lists
? subjects.add(subject);
? resources.add(resource);
? // Create and return the new target. No action type
? // attributes have been specified in the target
? return new Target(subjects, resources, null);
}
?
規則的創建
?????????規則是策略中最重要的子組件。如前所述,規則實質上是評估 Permit、Deny、Indeterminate 或 NotApplicable 的條件。
繼續創建處理授權請求(請參閱“XACML 詳解”中的第一張圖片)所需要的 XACML 組件,現在需要創建適當的規則。創建規則實質上就是創建相應的條件,如清單 3 所示。查看代碼,可以看到它完成了以下三項操作:
創建規則目標。
定義規則結果。
創建條件。
其中的兩個:創建規則目標和定義規則結果,非常簡單。第三點創建條件比較復雜,后面還將詳細說明。
?????????要創建的符合該請求的規則應該是:“如果主體 mverma@secf.com 屬于組 owner,并嘗試打開資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html,那么允許訪問。” 創建這樣的規則,首先要創建目標,以便針對將處理的請求評估規則。創建規則目標的方式類似于策略目標的創建方式。然后,將規則的 effect 定義為 Permit。為了讓規則返回 effect 的值,關聯條件必須返回 True。清單 4 中的代碼說明了條件的創建。
清單 3. 創建規則
public static List createRules() throws URISyntaxException {
? // Step 1: Define the identifier for the rule
? URI ruleId = new URI("ProjectPlanAccessRule");
? String ruleDescription = “Rule for accessing project plan";
? // Step 2: Define the effect of the rule
? int effect = Result.DECISION_PERMIT;
? // Step 3: Get the target for the rule
? Target target = createRuleTarget();
? // Step 4: Get the condition for the rule
? Apply condition = createRuleCondition();
? // Step 5: Create the rule
? Rule openRule = new Rule(ruleId, effect,ruleDescription, target, condition);
? // Create a list for the rules and add the rule to it
? List ruleList = new ArrayList();
? ruleList.add(openRule);
? return ruleList;
}
?
AttributeDesignator 返回值
?????????AttributeDesignator 可能為一個屬性返回多個值(因為請求可能包含多個匹配)。為此,XACML 有一種稱為袋子(bag)的特殊數據類型。袋子是允許重復的無序集合。AttributeDesignator 總是返回袋子,即使只有一個返回值。一旦返回一個袋子,就將對袋子中的值與預期值進行比較,以便作出授權決策。對于目標,不需要使用函數從袋子中提取任何值,但是對于條件,卻需要這樣做。這是因為,對于目標,PDP 會自動為 AttributeDesignator 返回的每個元素應用匹配的函數。
?
清單 4 說明了規則條件的創建。與為策略目標創建 AttributeDesignator 的方式基本相同,也需要創建 AttributeDesignator 對象,比較請求中的屬性值和條件中規定的值。在這里,我們感興趣的屬性是主體所屬的 group。如果要讓條件返回 True,那么 group 屬性的值必須是 owner。
惟一要補充的是,必須滿足以下條件:使用函數從 AttributeDesignator 返回的多個值中提取一個值。該例中使用函數 urn:oasis:names:tc:xacml:1.0:function:string-one-and-only。關于處理 AttributeDesignator 中的多個值的更多信息,請參閱 AttributeDesignator 返回值。
正如從清單 4 中可以看到的,需要創建 AttributeDesignator 對象來定義希望與請求中的值進行比較的屬性。比較算法是用來比較屬性值的。然后要定義可以從 AttributeDesignator 返回的那些值中選出一個值的函數。最后創建 Apply 對象,它類似于目標中創建的 TargetMatch 對象。Apply 對象的目的是對從袋子(由 AttributeDesignator 返回)中選擇的值應用比較函數,將它與條件中規定的值進行比較。
清單 4. 創建規則條件
public static Apply createRuleCondition() throws URISyntaxException {
? List conditionArgs = new ArrayList();
? // Define the name and type of the attribute
? // to be used in the condition
? URI designatorType = new URI("? URI designatorId = new URI("group");
? // Pick the function that the condition uses
? FunctionFactory factory = FunctionFactory.getConditionInstance();
? Function conditionFunction = null;
? try {
????? conditionFunction =
????????? factory.createFunction(
????????????? "urn:oasis:names:tc:xacml:1.0:function:" + "string-equal");
? } catch (Exception e) {
????? return null;
? }
? // Choose the function to pick one of the
? // multiple values returned by AttributetDesignator
? List applyArgs = new ArrayList();
? factory = FunctionFactory.getGeneralInstance();
? Function applyFunction = null;
? try {
????? applyFunction =
????????? factory.createFunction(
????????????? "urn:oasis:names:tc:xacml:1.0:function:"
????????????????? + "string-one-and-only");
? } catch (Exception e) {
????? return null;
? }
? // Create the AttributeDesignator
? AttributeDesignator designator =
????? new AttributeDesignator(
?????????? AttributeDesignator.SUBJECT_TARGET,
?????????? designatorType,
?????????? designatorId,
?????????? false
?????????? null);
? applyArgs.add(designator);
? // Create the Apply object and pass it the
? // function and the AttributeDesignator. The function
? // picks up one of the multiple values returned by the
? // AttributeDesignator
? Apply apply = new Apply(applyFunction, applyArgs, false);
? // Add the new apply element to the list of inputs
? // to the condition along with the Attributevalue
? conditionArgs.add(apply);
? StringAttribute value = new StringAttribute("owner");
? conditionArgs.add(value);
? // Finally, create and return the condition
? return new Apply(conditionFunction, conditionArgs, true);
}
?
這樣,策略創建任務就完成了。我們簡單回顧一下策略創建過程。首先,要創建必要的策略子組件:策略目標、規則和規則組合算法。不用為策略創建義務,因為它們是可選的。創建規則實質上意味著創建規則目標和條件,這些都使用它們自己的代碼清單作了說明。這里使用的所有的策略子組件都是用來創建策略的。
創建處理授權請求所需 XACML 組件的下一步是創建 PEP。PEP 的作用是什么呢?它為您創建的所有這些 XACML 組件創建授權請求!
策略實施點(PEP)
?????????PEP 根據請求者的屬性、請求的資源、動作和其他信息創建請求。在這里,我將展示創建請求的機制。為了方便起見,我將再次使用該請求:主體 mverma@secf.com 屬于 owner 組(主體的屬性),并嘗試對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執行 open 動作。要創建這樣的請求,您需要兩個主體屬性、一個資源屬性和一個動作屬性。兩個主體屬性是 rfc822Name(電子郵件 ID)和主體所屬的組。資源屬性是資源的 URI,動作屬性是打開資源的動作。清單 5 說明了 PEP 和所有這些屬性的創建。
現在,您已經看到了策略的創建和 PEP 請求的生成,剩下的只有創建 PDP 了。
策略決策點(PDP)
?????????PDP 針對策略評估請求,并返回響應。
因為 XACML 規范沒有規定把策略和請求傳遞給 PDP 以便評估請求的具體機制,所以可以選擇您認為方便的任何機制。該例中,策略和請求是作為命令行參數傳遞給 PDP。
注意,PDP 仍然基于需要服務的請求類型。它是一種通用組件,接受任何請求和相關的策略集合,并為可用的策略評估請求。清單 6 說明了如何創建 PDP,以及如何用它來評估來自 PEP 的請求。PDP 創建和請求評估的詳細過程將在清單 6 后介紹。
清單 6. 創建 PDP
public static void main(String[] args) throws Exception {
? if (args.length < 2) {
????? System.out.println("Usage: <request> <AccessPolicy> [policies]");
????? System.exit(1);
? }
?
? // Step 1: Get the request and policy file from the command line
? String requestFile = null;
? requestFile = args[0];
? String[] policyFiles = new String[args.length - 1];
? for (int i = 1; i < args.length; i++)
????? policyFiles[i - 1] = args[i];
?
? // Step 2: Create a PolicyFinderModule and initialize it
? // Use the sample FilePolicyModule, which
? // is configured using the policies from the command line
?
? FilePolicyModule filePolicyModule = new FilePolicyModule();
? for (int i = 0; i < policyFiles.length; i++)
????? filePolicyModule.addPolicy(policyFiles[i]);
? // Step 3: Set up the PolicyFinder that this PDP will use
? //
? PolicyFinder policyFinder = new PolicyFinder();
? Set policyModules = new HashSet();
? policyModules.add(filePolicyModule);
? policyFinder.setModules(policyModules);
? // Step 4: Create the PDP
? PDP pdp = new PDP(new PDPConfig(null, policyFinder, null));
?//? Get the request send by the PEP
? RequestCtx request =
????? RequestCtx.getInstance(new FileInputStream(requestFile));
? // Step 5: Evaluate the request. Generate the response.
? ResponseCtx response = pdp.evaluate(request);
? // Display the output on std out
? response.encode(System.out, new Indenter());
}
?
下面將一步步地說明 PDP 的創建和請求評估:
從命令行參數獲得請求和策略文件。
創建 PolicyFinderModule,并使用 FilePolicyModule 對象將其初始化。使用命令行中的策略配置 FilePolicyModule。PolicyFinderModule 是下面三個發現程序模塊(finder module)之一:
PolicyFinderModule
AttributeFinderModule
ResourceFinderModule
這些模塊是 SUN XACML 實現用來發現屬性、策略和資源的機制。
設置 PDP 將使用的策略發現程序。
通過初始化 PDP 類來創建 PDP。把使用 FilepolicyModule 配置的 PDPConfig 對象提供給 PDP 構造函數。
為 PDP 調用 evaluate 方法評估來自 PEP 的請求,這將返回授權決策。如果完全按照本文所述創建 XACML 組件,PDP 將提供 Permit 授權決策。
授權決策傳回 PEP??梢赃x擇把決策發回 PEP 的機制。
到此為止,處理請求需要創建的三種主要 XACML 組件 —— 策略、PEP 和 PDP —— 都已經介紹完畢,并給出了相應的例子。
結束語
訪問控制幾乎是所有應用程序或多或少都要用到的一個領域。XACML 是將該領域標準化的一次嘗試。雖然 XACML 是一種冗長的語言,但是一旦掌握了其基本概念和語言流,就很容易構造訪問控制機制。
本文介紹了創建基本的 XACML 組件的過程:
策略,包括規則和策略目標
PEP
PDP
掌握這些知識之后,就可以在當前和將來的應用程序中采用 XACML 處理訪問控制。