這是一個很好的問題,有很多好的方法。一個示例將是重寫邏輯和表達下列:
- 策略集與第一適用
- 一個組合算法拒絕如果時間是錯誤
- 否認如果設備是無效
- 拒絕如果IP不在有效範圍內
- 一組可能的操作和基於資源的policie s產生許可。
這就是它看起來像在ALFA:
namespace com.axiomatics.example{
policyset global{
apply firstApplicable
policy securityChecks{
apply firstApplicable
rule denyOutsideOfficeHours{
deny
}
rule denyInvalidDevice{
deny
}
rule denyInvalidIP{
deny
}
}
policyset myBusinessPolicies{
apply firstApplicable
/**
* Add your business policies here
*/
}
}
}
這僅僅是腳手架。現在,讓我們看看我們需要的屬性:
我們不會擔心我們如何獲得這些值。政策執行點或政策信息點需要擔心這一點。
第一條規則將使用currentTime屬性。這是ALFA默認屬性,定義如下:
attribute currentTime {
id = "urn:oasis:names:tc:xacml:1.0:environment:current-time"
type = time
category = environmentCat
}
更新的規則,現在看起來如下:
rule denyOutsideOfficeHours{
target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
deny
}
在這個例子中,我們使用靜態的下限和上限(上午9點至下午5點分別),但這些也可能是屬性,在這種情況下,我們不得不使用條件而不是目標。請注意用於將字符串值轉換爲相關數據類型的ALFA符號:"17:00:00":time
。
第二條規則如下所示:
rule denyInvalidDevice{
condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
deny
}
在這個規則中,我們必須使用一個條件,因爲它是不可能的表達目標的負面約束。該條件檢查是否存在名爲deviceType
的屬性,並且它包含單個值,不多也不少。該值不能等於laptop
或desktop
以便拒絕踢入。順便說一下,XACML中的字符串比較默認情況下區分大小寫。
最後一條規則是相似的,我們不得不使用一個條件否定測試。這裏我們使用ipAddressRegexpMAtch XACML函數來檢查用戶的IP(subjectLocalityIpAddress)是否匹配給定的IP地址模式。
rule denyInvalidIP{
condition not(
ipAddressRegexpMatch(
"^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$",
ipAddressOneAndOnly(subjectLocalityIpAddress)
)
)
deny
}
請注意,反斜槓必須用另一個反斜槓進行轉義。這是由於ALFA語法。 XACML策略本身一旦轉換爲XML,將不包含2個反斜槓字符。
產生的政策都結合在一起如下:
namespace com.axiomatics.example{
import Attributes.*
attribute deviceType{
category = subjectCat
id = "deviceType"
type = string
}
attribute userIP{
category = subjectCat
id = "deviceType"
type = string
}
policyset global{
apply firstApplicable
policy securityChecks{
apply firstApplicable
rule denyOutsideOfficeHours{
target clause currentTime<"09:00:00":time or currentTime>"17:00:00":time
deny
}
rule denyInvalidDevice{
condition not(stringIsIn(stringOneAndOnly(deviceType), stringBag("laptop","desktop")))
deny
}
rule denyInvalidIP{
condition not(
ipAddressRegexpMatch(
"^(10)\\.(10)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])\\:([80|443])$",
ipAddressOneAndOnly(subjectLocalityIpAddress)
)
)
deny
}
}
policyset myBusinessPolicies{
apply firstApplicable
/**
* Add your business policies here
*/
}
}
}
我希望這有助於。通過Stackoverflow或通過我們的Developer's Blog向我們發送您的問題。
有什麼方法可以在不使用Eclipse插件的情況下使用ALFA?例如以編程方式從一個用戶界面創建ALFA,然後從ALFA生成XACML而不使用ALFA插件? – 2017-04-14 17:35:20