这是一个很好的问题,有几种很好的方法可以做到这一点。一个例子是重写逻辑并表达以下内容:
- PolicySet 与第一个适用的组合算法
- 时间不对就否认
- 如果设备无效则拒绝
- 如果 IP 不在有效范围内,则拒绝
- 产生Permit的一组可能的操作和基于资源的策略。
这就是它在 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 或我们的开发者博客向我们发送您的问题。