1

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

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

较低层将处理实际请求的操作,例如add,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:viewupdatedeletemedical recordsinsurance databank accounts

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

如果所有环境规则都返回允许,则允许的策略

  • Rule1:只允许 IP 地址在 [bag with ip-address ranges] 范围内的用户
  • 规则 2:仅允许周一至周五的行动请求
  • 规则 3:仅允许在上午 7:00 到下午 22:00 之间的操作请求
  • 规则 4:仅允许来自台式机或笔记本电脑的操作请求

如何使用 ALFA(授权公理语言)来做到这一点?

4

1 回答 1

1

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

  • 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
             */
        }

    }
}

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

  • 当前时间
  • 用户当前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并且它包含一个值,不多也不少。该值不能等于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 或我们的开发者博客向我们发送您的问题。

于 2014-12-02T17:17:31.783 回答