2014-12-02 43 views
1

我想寫一個分層的政策,其中第一層將經常檢查環境,如:在XACML和ALFA中,如何實現一組檢查環境屬性的策略?

  • 檢查用戶有一個有效的IP地址,
  • 檢查時間是一個有效的時間框架內和星期
  • 用戶的設備是一個有效的設備

下層將採取實際要求的動作如護理addviewupdatedelete在組特定的資源,例如medical recordsinsurance databank accounts ...

用簡單的英語,規則如下所示

政策,允許在所有環境規則返回許可證

  • 的Rule1:僅允許與在[袋與IP地址範圍]
  • 規則2的範圍內的IP地址的用戶:只允許從週一的操作請求到週五
  • 規則3:只允許從7:00 AM行動請求22:00
  • Rule4:只允許從臺式機或筆記本電腦的操作請求

如何這可以使用ALFA,Axiomatics Language for Authorization來完成嗎?

回答

1

這是一個很好的問題,有很多好的方法。一個示例將是重寫邏輯和表達下列:

  • 策略集與第一適用
    • 一個組合算法拒絕如果時間是錯誤
    • 否認如果設備是無效
    • 拒絕如果IP不在有效範圍內
    • 一組可能的操作和基於資源的policie s產生許可

這就是它看起來像在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向我們發送您的問題。

+0

有什麼方法可以在不使用Eclipse插件的情況下使用ALFA?例如以編程方式從一個用戶界面創建ALFA,然後從ALFA生成XACML而不使用ALFA插件? – 2017-04-14 17:35:20