在XACML和ALFA中,如何实现检查环境属性的分层策略集?

时间:2014-12-02 17:17:32

标签: xacml alfa

我想编写一个分层策略,第一层将始终检查环境,例如:

  • 检查用户是否有有效的IP地址
  • 检查时间是否在有效的时间范围内和星期几
  • 用户的设备是有效设备

较低层将负责实际请求的操作,例如关于addviewupdate等特定资源集的deletemedical recordsinsurance databank accounts

用简单的英语,规则如下所示

允许所有环境规则返回许可的政策

  • 规则1:仅允许IP地址在[包含IP地址范围的包]范围内的用户
  • 规则2:仅允许从星期一到星期五的行动请求
  • 规则3:仅允许从上午7:00到下午22:00的操作请求
  • 规则4:仅允许来自台式机或笔记本电脑的操作请求

如何使用ALFA,授权的Axiomatics语言?

来完成

1 个答案:

答案 0 :(得分:1)

这是一个很好的问题,有几种很好的方法可以做到这一点。一个例子是重写逻辑并表达以下内容:

  • 使用首先适用的组合算法的PolicySet
      如果时间不对,
    • 拒绝
    • 拒绝如果设备无效
    • 如果IP不在有效范围内,
    • 拒绝
    • 一组可能的操作和基于资源的策略,产生许可

这就是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
             */
        }

    }
}

这只是脚手架。现在让我们看一下我们需要的属性:

  • 当前时间
  • 用户的当前IP
  • 用户的设备类型

我们不会担心我们如何获得这些价值观。政策执行点或政策信息点需要担心这一点。

第一条规则将使用 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的属性,并且它包含单个值,不多也不少。该值不能等于laptopdesktop,以便拒绝启用。顺便说一句,默认情况下,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向我们发送您的问题。