我想编写一个分层策略,第一层将始终检查环境,例如:
较低层将负责实际请求的操作,例如关于add
,view
,update
等特定资源集的delete
,medical records
,insurance data
,bank accounts
。
用简单的英语,规则如下所示
允许所有环境规则返回许可的政策
如何使用ALFA,授权的Axiomatics语言?
来完成答案 0 :(得分:1)
这是一个很好的问题,有几种很好的方法可以做到这一点。一个例子是重写逻辑并表达以下内容:
这就是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语法。一旦转换为XML,XACML策略本身将不包含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向我们发送您的问题。