【问题标题】:In XACML and ALFA, how can I achieve a layered set of policies that check environment attributes?在 XACML 和 ALFA 中,如何实现检查环境属性的分层策略集?
【发布时间】:2023-03-12 16:25:01
【问题描述】:

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

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

较低层将处理实际请求的操作,例如addviewupdatedelete 对某组资源如medical recordsinsurance databank accounts...

简单来说,规则如下所示

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

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

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

【问题讨论】:

    标签: xacml alfa


    【解决方案1】:

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

    • PolicySet 的组合算法为 first-applicable
      • 拒绝如果时间不对
      • 拒绝如果设备无效
      • 拒绝如果 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 语法。 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?例如以编程方式从 UI 创建 ALFA,然后在不使用 ALFA 插件的情况下从 ALFA 生成 XACML?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-03
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2012-09-25
    相关资源
    最近更新 更多