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