XML 安全: 使用 XACML 控制信息訪問
?XML 安全: 使用 XACML 控制信息訪問
?????????為適當?shù)娜颂峁┻m當?shù)脑L問權(quán)限和首先擁有信息同樣重要(如果不是更重要的話)??蓴U展訪問控制標記語言(或 XACML)提供了創(chuàng)建策略和規(guī)則來控制信息訪問的機制。本文中,作者 Manish Verma 將繼續(xù)關(guān)于 XML 問題的討論,介紹如何在應(yīng)用程序中集成 XACML。
關(guān)于 XML 安全的上一篇文章中,我討論了安全性斷言標記語言(Security Assertion Markup Language,SAML)。本文將討論可擴展訪問控制標記語言,并從上一期留下的問題開始。SAML 提供了進行驗證和授權(quán)斷言以及傳遞斷言的機制,而 XACML 則提供了定義進行必要的授權(quán)決策所需規(guī)則的語言。
?????????比如,假設(shè)這樣一個場景:某一主體請求訪問目標資源,策略執(zhí)行點(PEP)在決定將目標資源發(fā)布給主體之前,要使用策略決策點(PDP)進行檢查。訪問目標資源請求的生成,以及后續(xù)的允許或拒絕訪問響應(yīng),都屬于 SAML 的范圍。XACML 解決了 PEP 與 PDP 之間的策略決策交換問題。
訪問控制 XACML
?????????XACML 的初衷是開發(fā)一項訪問控制和授權(quán)系統(tǒng)的標準。目前多數(shù)系統(tǒng)都以專有的方式實現(xiàn)訪問控制和授權(quán)。
?????????典型的訪問控制和授權(quán)場景包括三個主要實體:主體、資源和動作以及它們的屬性。主體請求得到對資源執(zhí)行動作的權(quán)限。比如,訪問請求“允許財務(wù)經(jīng)理在財務(wù)服務(wù)器上的發(fā)票文件夾中創(chuàng)建文件”中,主體是“財務(wù)經(jīng)理”,目標資源是“財務(wù)服務(wù)器上的發(fā)票文件夾”,動作是“創(chuàng)建文件”。
?????????在專有訪問控制系統(tǒng)中,這些實體及其屬性的信息保存在資料庫中。這種資料庫稱為訪問控制鏈表(ACL)。不同的專有系統(tǒng)有不同的實現(xiàn) ACL 的機制,因此難以交換和共享信息。
XACML 的目標
XACML 主要將解決以下問題:
??????1,創(chuàng)建一種可移植的、標準的方式來描述訪問控制實體及其屬性。?
????? 2,?提供一種機制,以比簡單地拒絕訪問或授權(quán)訪問更細粒度的控制訪問,也就是說,在“允許”或? “拒絕”之前或之后執(zhí)行某些操作。
XACML 和 SAML:差別與類似之處
??????XACML 體系結(jié)構(gòu)與 SAML 體系結(jié)構(gòu)是緊密相關(guān)的。它們有很多相同的概念,要處理的問題域也在很大程度上重疊:驗證、授權(quán)和訪問控制。但是在同一問題域中,它們要解決的是不同的問題。SAML 要解決的是驗證,并提供一種機制,在協(xié)同實體間傳遞驗證和授權(quán)決策,而 XACML 則專注于傳遞這些授權(quán)決策的機制。
??????SAML 標準提供了允許第三方實體請求驗證和授權(quán)信息的接口。內(nèi)部如何處理這些授權(quán)請求則由 XACML 標準解決。XACML 不但處理授權(quán)請求,而且還定義了一種機制,來創(chuàng)建進行授權(quán)決策所需的規(guī)則、策略和策略集的完整基礎(chǔ)設(shè)施。我將在 XACML 詳解中詳細說明這些概念。
既然 SAML 與 XACML 分享同一個領(lǐng)域,那么這兩種規(guī)范很可能最終會合并成一個規(guī)范,希望如此。
XACML 體系結(jié)構(gòu)
?????????XACML 由圖 1 中所示的多個組件組成。其中一些組件還可以與 SAML 共享。共享的組件用紅線框標記。
圖 1. XACML 主要組件
?????????授權(quán)請求到達策略執(zhí)行點(PEP)。PEP 創(chuàng)建一個 XACML 請求并發(fā)送到策略決策點(PDP),后者評估請求并返回一個響應(yīng)。該響應(yīng)可以是允許訪問的,也可以是拒絕訪問的,并具有適當?shù)牧x務(wù)。本文稍后部分將解釋這些義務(wù)。
?????????PDP 評估請求中的相關(guān)策略和規(guī)則后會作出決策。可以應(yīng)用的策略有多種,PDP 并沒有評估所有的策略,而是根據(jù)策略目標選擇相關(guān)的策略進行評估。策略目標包括關(guān)于主體、動作和其他環(huán)境屬性的信息。后面的策略目標創(chuàng)建一節(jié)中將說明 PDP 選擇評估策略的完整過程。
?????????為了獲得策略,PDP 要用到策略訪問點(PAP),PAP 編寫策略和策略集,供 PDP 使用。PDP 也可以調(diào)用策略信息點(PIP)服務(wù)檢索與主體、資源或者環(huán)境有關(guān)的屬性值。PDP 作出的授權(quán)決策被發(fā)送到 PEP。PEP 履行義務(wù),并根據(jù) PDP 發(fā)送的授權(quán)決策允許或拒絕訪問。
XACML 詳解
?????????為了說明 XACML 的不同組件,我們將以一個具體的訪問請求為例,創(chuàng)建所需的全部 XACML 組件。訪問請求如下:主體 mverma@secf.com 屬于 owner 組(主體的屬性),它嘗試對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執(zhí)行 open 動作。創(chuàng)建所有必需的 XACML 組件之后,應(yīng)該能夠獲得該請求的授權(quán)決策。
?????????要記住,XACML 有三個頂層組件:策略、PEP 和 PDP。為定義的請求創(chuàng)建 XACML 基礎(chǔ)設(shè)施的過程,也是緊密圍繞這三個組件進行的。圖 2 說明了這些組件之間的聯(lián)系:
圖 2. 策略語言模型
首先要創(chuàng)建一個策略處理請求。
XACML 策略
?????????策略包括:一組規(guī)則、規(guī)則組合算法的標識符、一組義務(wù)和一個目標。這就是 XACML 最主要的方面。XACML 的多數(shù)動作發(fā)生在策略中。
?????????現(xiàn)在說明如何創(chuàng)建能夠處理該請求的策略,策略的范圍應(yīng)該比請求的范圍廣。您可以創(chuàng)建一個這樣的策略:secf.com 名稱空間中有電子郵件名的所有用戶都可以對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執(zhí)行任何操作。注意,策略比請求更具一般性。
規(guī)則組合算法
?????????規(guī)則組合算法結(jié)合策略中所有規(guī)則的結(jié)果得到最終的授權(quán)決策。XACML 定義了下面的規(guī)則組合算法(也可定義自己的算法):
1,eny-overrides(拒絕覆蓋): 只要有一條規(guī)則的評估為 Deny,那么最終授權(quán)決策也是 Deny。
Ordered-deny-overrides(有序拒絕覆蓋): 與拒絕覆蓋相同,只不過評估相關(guān)規(guī)則的順序與將規(guī)則添加到策略中的順序相同。
2,ermit-overrides(允許覆蓋): 只要有一條規(guī)則計算的評估為 Permit,則最終授權(quán)決策也是 Permit。
3,rdered-permit-overrides(允許按順序覆蓋): 與允許覆蓋相同,只不過評估相關(guān)規(guī)則的順序與規(guī)則添加到策略中的順序相同。
4,irst-applicable(最先應(yīng)用): 遇到的第一條相關(guān)規(guī)則的評估結(jié)果作為最終授權(quán)決策的評估結(jié)果。
?
策略包括幾種子組件:目標、規(guī)則、規(guī)則組合算法和義務(wù)。理解策略就必須理解這些子組件(subcomponent)。現(xiàn)在來看看各種子組件的重要性:
目標(Target):
?????????每個策略只有一個目標。該目標有助于確定策略是否與請求有關(guān)。策略和請求的相關(guān)性決定了是否要為請求評估該策略。這是通過定義目標中的三類屬性(主體、資源、動作)及其屬性值來實現(xiàn)的。目標中不一定都有這三類屬性。將這些屬性的值與請求中具有相同屬性的值進行比較,如果匹配(對其應(yīng)用某些函數(shù)之后,將會看到它們是否匹配),則認為該策略是相關(guān)的,并對其進行評估。
規(guī)則:一個策略可以與多條規(guī)則相關(guān)聯(lián)。每條規(guī)則由條件、結(jié)果和目標組成。?
?????????條件是關(guān)于屬性的陳述,評估結(jié)果為 True、False 或 Indeterminate。?
?????????結(jié)果是符合規(guī)則的預(yù)期后果,值可以為 Permit 或 Deny。?
?????????目標:與策略中的目標相同,都有助于確定規(guī)則是否與請求有關(guān),實現(xiàn)的機制也與策略中的目標的實現(xiàn)機制類似。
?????????規(guī)則的最終結(jié)果取決于條件的評估。如果條件返回 Indeterminate,則該規(guī)則返回 Indeterminate。如果條件返回 False,則規(guī)則返回 NotApplicable。如果條件返回 True,則返回 Effect 元素的值,可以是 Permit 或 Deny。?
?????????規(guī)則組合算法:如上一條規(guī)則所述,一個策略可以包含多條規(guī)則。不同的規(guī)則有可能得到?jīng)_突的結(jié)果。規(guī)則組合算法負責(zé)解決這種沖突,每一策略、每一請求都得到一個最終結(jié)果。每個策略只能使用一種規(guī)則組合算法。詳情請參閱規(guī)則組合算法。?
??????義務(wù):要知道,XACML 的目標之一是提供更高層次的訪問控制,而不僅僅是允許和拒絕決策,義務(wù)是實現(xiàn)這種控制的機制。義務(wù)是 PEP 必須與授權(quán)決策的實施一起執(zhí)行的動作。在評估策略之后,特定的義務(wù)與授權(quán)決策一起發(fā)送給 PEP。除了強制實施授權(quán)決策外,PEP 還負責(zé)執(zhí)行義務(wù)所規(guī)定的操作。
策略的創(chuàng)建
這一節(jié)深入探討策略創(chuàng)建代碼。首先要創(chuàng)建 policy 對象(參見清單 1)和需要的子組件。 本文中的代碼例子都使用 Sun 的 XACML 實現(xiàn)(請參閱參考資料)。
清單 1. 創(chuàng)建策略
// 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 的創(chuàng)建過程。真是這樣嗎?policy 創(chuàng)建的主要部分是子組件的創(chuàng)建。該清單僅僅說明了如何將這些子組件組合成 policy 對象。不過,它確實說明了 policy 的總體結(jié)構(gòu)。策略的組成過程如下:
選擇策略的規(guī)則組合算法。我使用了 ordered-permit-override 算法,因此將按照策略中規(guī)定的順序評估規(guī)則。
創(chuàng)建策略的目標。目標創(chuàng)建有點復(fù)雜,它需要專門的代碼清單和說明。清單 2 說明了策略的目標創(chuàng)建。
創(chuàng)建策略相關(guān)的規(guī)則。與目標相同,規(guī)則創(chuàng)建也是一個復(fù)雜的過程,需要專門的清單。清單 3 專用于說明規(guī)則創(chuàng)建。
創(chuàng)建所有必需的策略子組件之后,用它們創(chuàng)建 policy 對象。
將 policy 對象保存到文件中以便傳遞給 PDP。
下面幾小節(jié)說明策略子組件的創(chuàng)建。首先是目標創(chuàng)建,最后以規(guī)則創(chuàng)建和相關(guān)條件結(jié)束關(guān)于策略創(chuàng)建的討論。
策略目標創(chuàng)建
?????????目標創(chuàng)建是創(chuàng)建策略的一個重要方面。目標是為評估請求選擇相關(guān)策略的機制。為了創(chuàng)建策略目標,需要定義屬于主體、資源和動作這三種類型的實體的屬性和屬性值。當 PDP 評估請求時,它將查找目標屬性值與請求中的屬性值相同的策略。
?????????然后將說明如何通過編程來實現(xiàn)這些目標。XACML 提供了一種稱為 AttributeDesignator 的機制,用它來比較請求與策略目標中的屬性值。
?????????利用 AttributeDesignator,可以通過定義屬性名和類型來指定一個屬性。此外,還可以指定屬性值,也就是在目標中規(guī)定與請求中的屬性值進行比較的那個值。要進行比較,需要選擇一個預(yù)置的函數(shù)。該函數(shù)以及 AttributeDesignator 都可以用來創(chuàng)建 TargetMatch 對象。您可以創(chuàng)建多個 TargetMatch 對象,每個對象對應(yīng)一個屬性。同一類的所有 TargetMatch 對象放在一個列表中,并傳遞給 Target 對象。這個 Target 對象就是用來創(chuàng)建 Policy 的目標對象。
?????????策略的形式應(yīng)該如下所示:“允許 secf.com 名稱空間中列有電子郵件名的任何用戶對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執(zhí)行任何動作。”對于該策略,可以創(chuàng)建包含兩個屬性的目標,分別用于主體和資源。不需要為動作創(chuàng)建屬性,因為要創(chuàng)建的策略對動作沒有任何限制。
?????????清單 2 說明了策略目標的創(chuàng)建。因為要比較請求中主體電子郵件字段的值和目標中規(guī)定的字段的值,因此對于主體,可以在目標中指定屬性 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)和比較函數(shù)(urn:oasis:names:tc:xacml:1.0:function:rfc822Name-match)。 該函數(shù)將目標中規(guī)定的屬性值與請求中具有相同屬性的值進行比較。資源類型 http://www.w3.org/2001/XMLSchema#anyURI 的屬性也是按照類似的步驟進行比較的。
清單 2. 創(chuàng)建策略目標
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);
}
?
規(guī)則的創(chuàng)建
?????????規(guī)則是策略中最重要的子組件。如前所述,規(guī)則實質(zhì)上是評估 Permit、Deny、Indeterminate 或 NotApplicable 的條件。
繼續(xù)創(chuàng)建處理授權(quán)請求(請參閱“XACML 詳解”中的第一張圖片)所需要的 XACML 組件,現(xiàn)在需要創(chuàng)建適當?shù)囊?guī)則。創(chuàng)建規(guī)則實質(zhì)上就是創(chuàng)建相應(yīng)的條件,如清單 3 所示。查看代碼,可以看到它完成了以下三項操作:
創(chuàng)建規(guī)則目標。
定義規(guī)則結(jié)果。
創(chuàng)建條件。
其中的兩個:創(chuàng)建規(guī)則目標和定義規(guī)則結(jié)果,非常簡單。第三點創(chuàng)建條件比較復(fù)雜,后面還將詳細說明。
?????????要創(chuàng)建的符合該請求的規(guī)則應(yīng)該是:“如果主體 mverma@secf.com 屬于組 owner,并嘗試打開資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html,那么允許訪問?!?創(chuàng)建這樣的規(guī)則,首先要創(chuàng)建目標,以便針對將處理的請求評估規(guī)則。創(chuàng)建規(guī)則目標的方式類似于策略目標的創(chuàng)建方式。然后,將規(guī)則的 effect 定義為 Permit。為了讓規(guī)則返回 effect 的值,關(guān)聯(lián)條件必須返回 True。清單 4 中的代碼說明了條件的創(chuàng)建。
清單 3. 創(chuàng)建規(guī)則
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)的特殊數(shù)據(jù)類型。袋子是允許重復(fù)的無序集合。AttributeDesignator 總是返回袋子,即使只有一個返回值。一旦返回一個袋子,就將對袋子中的值與預(yù)期值進行比較,以便作出授權(quán)決策。對于目標,不需要使用函數(shù)從袋子中提取任何值,但是對于條件,卻需要這樣做。這是因為,對于目標,PDP 會自動為 AttributeDesignator 返回的每個元素應(yīng)用匹配的函數(shù)。
?
清單 4 說明了規(guī)則條件的創(chuàng)建。與為策略目標創(chuàng)建 AttributeDesignator 的方式基本相同,也需要創(chuàng)建 AttributeDesignator 對象,比較請求中的屬性值和條件中規(guī)定的值。在這里,我們感興趣的屬性是主體所屬的 group。如果要讓條件返回 True,那么 group 屬性的值必須是 owner。
惟一要補充的是,必須滿足以下條件:使用函數(shù)從 AttributeDesignator 返回的多個值中提取一個值。該例中使用函數(shù) urn:oasis:names:tc:xacml:1.0:function:string-one-and-only。關(guān)于處理 AttributeDesignator 中的多個值的更多信息,請參閱 AttributeDesignator 返回值。
正如從清單 4 中可以看到的,需要創(chuàng)建 AttributeDesignator 對象來定義希望與請求中的值進行比較的屬性。比較算法是用來比較屬性值的。然后要定義可以從 AttributeDesignator 返回的那些值中選出一個值的函數(shù)。最后創(chuàng)建 Apply 對象,它類似于目標中創(chuàng)建的 TargetMatch 對象。Apply 對象的目的是對從袋子(由 AttributeDesignator 返回)中選擇的值應(yīng)用比較函數(shù),將它與條件中規(guī)定的值進行比較。
清單 4. 創(chuàng)建規(guī)則條件
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);
}
?
這樣,策略創(chuàng)建任務(wù)就完成了。我們簡單回顧一下策略創(chuàng)建過程。首先,要創(chuàng)建必要的策略子組件:策略目標、規(guī)則和規(guī)則組合算法。不用為策略創(chuàng)建義務(wù),因為它們是可選的。創(chuàng)建規(guī)則實質(zhì)上意味著創(chuàng)建規(guī)則目標和條件,這些都使用它們自己的代碼清單作了說明。這里使用的所有的策略子組件都是用來創(chuàng)建策略的。
創(chuàng)建處理授權(quán)請求所需 XACML 組件的下一步是創(chuàng)建 PEP。PEP 的作用是什么呢?它為您創(chuàng)建的所有這些 XACML 組件創(chuàng)建授權(quán)請求!
策略實施點(PEP)
?????????PEP 根據(jù)請求者的屬性、請求的資源、動作和其他信息創(chuàng)建請求。在這里,我將展示創(chuàng)建請求的機制。為了方便起見,我將再次使用該請求:主體 mverma@secf.com 屬于 owner 組(主體的屬性),并嘗試對資源 file:///D:/Documents/Administrator/Desktop/Project Plan.html 執(zhí)行 open 動作。要創(chuàng)建這樣的請求,您需要兩個主體屬性、一個資源屬性和一個動作屬性。兩個主體屬性是 rfc822Name(電子郵件 ID)和主體所屬的組。資源屬性是資源的 URI,動作屬性是打開資源的動作。清單 5 說明了 PEP 和所有這些屬性的創(chuàng)建。
現(xiàn)在,您已經(jīng)看到了策略的創(chuàng)建和 PEP 請求的生成,剩下的只有創(chuàng)建 PDP 了。
策略決策點(PDP)
?????????PDP 針對策略評估請求,并返回響應(yīng)。
因為 XACML 規(guī)范沒有規(guī)定把策略和請求傳遞給 PDP 以便評估請求的具體機制,所以可以選擇您認為方便的任何機制。該例中,策略和請求是作為命令行參數(shù)傳遞給 PDP。
注意,PDP 仍然基于需要服務(wù)的請求類型。它是一種通用組件,接受任何請求和相關(guān)的策略集合,并為可用的策略評估請求。清單 6 說明了如何創(chuàng)建 PDP,以及如何用它來評估來自 PEP 的請求。PDP 創(chuàng)建和請求評估的詳細過程將在清單 6 后介紹。
清單 6. 創(chuàng)建 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 的創(chuàng)建和請求評估:
從命令行參數(shù)獲得請求和策略文件。
創(chuàng)建 PolicyFinderModule,并使用 FilePolicyModule 對象將其初始化。使用命令行中的策略配置 FilePolicyModule。PolicyFinderModule 是下面三個發(fā)現(xiàn)程序模塊(finder module)之一:
PolicyFinderModule
AttributeFinderModule
ResourceFinderModule
這些模塊是 SUN XACML 實現(xiàn)用來發(fā)現(xiàn)屬性、策略和資源的機制。
設(shè)置 PDP 將使用的策略發(fā)現(xiàn)程序。
通過初始化 PDP 類來創(chuàng)建 PDP。把使用 FilepolicyModule 配置的 PDPConfig 對象提供給 PDP 構(gòu)造函數(shù)。
為 PDP 調(diào)用 evaluate 方法評估來自 PEP 的請求,這將返回授權(quán)決策。如果完全按照本文所述創(chuàng)建 XACML 組件,PDP 將提供 Permit 授權(quán)決策。
授權(quán)決策傳回 PEP??梢赃x擇把決策發(fā)回 PEP 的機制。
到此為止,處理請求需要創(chuàng)建的三種主要 XACML 組件 —— 策略、PEP 和 PDP —— 都已經(jīng)介紹完畢,并給出了相應(yīng)的例子。
結(jié)束語
訪問控制幾乎是所有應(yīng)用程序或多或少都要用到的一個領(lǐng)域。XACML 是將該領(lǐng)域標準化的一次嘗試。雖然 XACML 是一種冗長的語言,但是一旦掌握了其基本概念和語言流,就很容易構(gòu)造訪問控制機制。
本文介紹了創(chuàng)建基本的 XACML 組件的過程:
策略,包括規(guī)則和策略目標
PEP
PDP
掌握這些知識之后,就可以在當前和將來的應(yīng)用程序中采用 XACML 處理訪問控制。
posted on 2006-04-19 11:33 BPM 閱讀(1207) 評論(1) 編輯 收藏 所屬分類: Java 安全標準