【问题标题】:Suggestions for grammar for auditing system审计系统语法建议
【发布时间】:2017-08-16 02:30:09
【问题描述】:

我想知道您是否可以为我指明正确的方向。我想编写一个基于规则的系统来审计一组机器——例如

  • 检查配置参数是否设置正确
  • 检查机器的状态,看看它们是否在可接受的范围内

我正在努力解决的问题是为审计规则提出一个语法,这样我就不必编写 defrules 代码了。我创建了一些简单的审计规则,但我正在努力想出一个通用的表格。

这是我目前的尝试。

首先,我目前使用一个模板来表示配置参数和运行状态(由于缺乏想象力,我称之为审计事实),以便我的审计语言可以同时用于配置和状态。我使用域槽来指定配置与状态。

(deftemplate audit-fact 
    (slot domain (allowed-values config state))     ;; config vs. state
    (slot machine)                                  ;; machine to audit 
    (slot name)                                     ;; parameter or state to check/audit
    (slot value)                                    ;; parameter value 
    (slot already-checked (default FALSE))
)   

接下来,我编写了一个程序来读取机器配置和状态并将其断言为审计事实。以下是示例配置和状态审计事实

(assert (audit-fact 
    (domain config) 
    (machine drl-a-15_0) 
    (name os-version) (value 5.5))
)

(assert (audit-fact 
    (domain state) 
    (machine drl-a-15_0) 
    (name rpm) (value 5023))
)

这是我目前对审计语法/语言的尝试 ---

(deftemplate rule
    (slot domain) 
    (slot name) 
    (slot constraint (default ?NONE) (allowed-values should-remain-at-default should-equal should-be-between ignore-if-ends-with))
    (multislot values)
    (multislot reasons) 
    (multislot references) 
    (slot criticality (allowed-values critical info suggestion warning))
    (slot already-checked (default FALSE))
)

以下规则用于检查状态或参数是否在一定范围内

(assert (rule 
    (domain state)
    (name rpm) 
    (constraint should-be-between) 
    (values 5000 5500) 
    (criticality critical) 
    (reasons "Low values could cause engine to stall. Prolonged high value could cause engine to heat up") )
)

接下来,我使用以下规则来检查状态或参数是否等于特定值

(assert (rule 
    (domain config)
    (name os-version) 
    (constraint should-equal) 
    (values 5.5) 
    (criticality critical) 
    (reasons "OS version must be at 5.5 – no other levels are currently certified.") )
)

以下规则实现了相等和之间的检查

(defrule rule-should-eq
    (rule (domain ?d) (name ?n) (constraint should-equal) (values ?cv) (reasons ?r))
    ?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
    (if (eq ?v ?cv)
        then 
            (printout t "checking " ?d ": " ?n ". Passed "  crlf)
        else 
            (printout t "checking " ?d “: “ ?n " should be set to " ?cv ". " ?r ". Warning" crlf)
    )       
    (modify ?p (already-checked TRUE))  
)       

(defrule rule-should-be-between
    (rule (domain ?d) (name ?n) (constraint should-be-between) (values ?cv-low ?cv-high) (reasons ?r))
    ?p <- (audit-fact (domain ?d) (name ?n) (value ?v) (already-checked FALSE))
=>
    (if (and (>= ?v ?cv-low) (<= ?v ?cv-high))
        then 
            (printout t "checking " ?n ". Passed "  crlf)
        else 
            (printout t "checking " ?n " should be between " ?cv-low " and " ?cv-high ". " ?r ". Warning" crlf)
    )       
    (modify ?p (already-checked TRUE))  
)       

使用上面的方法,我可以实现简单的检查——例如,must-be-set-to、must-be-between、must-not-equal、must-remain-at-default-value、must-be-高于、必须低于等。

但是我想不出一种简单的方法来使语法处理带有ands或ors等的多个条件。

问题---

  • 是否有一篇论文描述了上述审计规则的设计模式。我目前正在研究示例(CLIPS)中的wine.clp。
  • 我是否应该放弃并只对简单的审计规则使用简单的语法,而对任何复杂的事情都使用 defrules - 例如,如果 config-A 设置为 X,然后检查其他五个配置以确保它们也设置正确,然后断言状态检查。一旦断言,然后检查状态是否在一定范围内。

提前致谢。

伯尼

【问题讨论】:

  • 旁注:rule-should-eq 可以省略;使用 should-be-between 和相同的界限。给错误信息加糖。
  • 您研究过不同的方法吗?如果您的机器数据是 XML 格式的,那么您可以在 XML 模式定义中使用构面和断言,而验证解析器就可以解决问题。 - 您还可以查看 Java 注释以定义字段值的约束。 IIRC,那里不止一个库。
  • Laune -- 不错的建议。我想让审计员进行更复杂的检查——例如,如果 configA=xx,然后检查 configB>n、configC=m 等,或者如果设置了 configA,那么检查其他配置是否设置了某个方式和机器状态均在安全水平范围内。此外,当我报告问题时,我想打印一个排序列表——例如,按关键性,然后是参数名称。 CLIPS 或 JESS 似乎给了我灵活性。但我确实喜欢你的建议。谢谢。

标签: clips jess


【解决方案1】:

1) 如果 RHS 上的语句是代码异味:不要! 2)您不需要已经检查过的标志,因为您没有修改这些事实。

针对一台机器属性重写检查:

?p <- (Configuration (machine ?m)(param ?p)(value ?v))
(ConfigCheckRange (param ?p){?v < loBound || $v > hiBound})

(您可能需要另一种变体,例如,允许 ConfigCheckEnum 值不在一个区间内。)

检查参数值组合更加困难,因为您选择通过单独的事实来表示每个参数值。你必须

 ?p1 <- (Configuration (machine ?m)(param ?p1)(value ?v1))
 ?p2 <- (Configuration (machine ?m)(param ?p2)(value ?v2)
         {?p2 != ?p1))
(ConfigCheckCombi (param1 ?p1)(param2 ?p2)
      {lowBound1 <= ?v1 && ?v2 <= lowBound2}
      {?v2 < loBound2 || $v2 > hiBound2})

右侧应仅在(新)事实中记录违规行为,我们称之为调查结果。 One Findings 包含机器的 ID 和(违反的)ConfigCheck 事实列表。

最后(使用低显着性规则)您找到 Findings 事实并在其上调用 report 方法。 (使用一些适当的 Java bean 作为事实可能更方便。)

【讨论】:

  • Laune - 再次感谢。我会按照你的建议做——a)将审计事实拆分为配置和状态。 b) 将检查移至 LHS c) 断言结果(我喜欢这样,因为我可以用它来打印结果的排序列表)
【解决方案2】:

这是一种根据通用规则评估任意表达式的方法:

CLIPS> 
(deffunction str-replace (?str ?rpl ?fnd)
   (if (eq ?fnd "") then (return ?str))
   (bind ?rv "")
   (bind ?i (str-index ?fnd ?str))
   (while ?i
      (bind ?rv (str-cat ?rv (sub-string 1 (- ?i 1) ?str) ?rpl))
      (bind ?str (sub-string (+ ?i (str-length ?fnd)) (str-length ?str) ?str))
      (bind ?i (str-index ?fnd ?str)))
   (bind ?rv (str-cat ?rv ?str)))
CLIPS>    
(deftemplate audit-fact 
    (slot domain)   
    (slot machine)                                   
    (slot name)                                   
    (slot value))
CLIPS>   
(deftemplate rule
    (slot domain) 
    (slot name) 
    (slot constraint)
    (multislot reasons) 
    (multislot references) 
    (slot criticality))
CLIPS> 
(deffacts initial
   (audit-fact 
      (domain config) 
      (machine drl-a-15_0) 
      (name os-version) 
      (value 5.4))
   (audit-fact 
      (domain state) 
      (machine drl-a-15_0) 
      (name rpm) 
      (value 5023))
   (rule 
      (domain state)
      (name rpm) 
      (constraint "(and (>= ?v 5000) (<= ?v 5500))")
      (criticality critical) 
      (reasons "Low values could cause engine to stall. Prolonged high value could cause engine to heat up."))
   (rule 
      (domain config)
      (name os-version) 
      (constraint "(eq ?v 5.5)")
      (criticality critical) 
      (reasons "OS version must be at 5.5 – no other levels are currently certified.")))
CLIPS> 
(defrule rule-check
   (rule (domain ?d) (name ?n) (constraint ?constraint) (reasons ?r))
   ?p <- (audit-fact (domain ?d) (name ?n) (value ?v))
   =>
   (bind ?constraint (str-replace ?constraint ?v "?v"))
   (if (eval ?constraint)
      then 
      (printout t "checking " ?d ": " ?n " Passed"  crlf)
      else 
      (printout t "checking " ?d ": " ?n " Warning : " ?r crlf)))
CLIPS> (reset)
CLIPS> (run)
checking config: os-version Warning : OS version must be at 5.5 – no other levels are currently certified.
checking state: rpm Passed
CLIPS> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-30
    • 2012-01-21
    • 1970-01-01
    • 2014-02-03
    • 1970-01-01
    • 2011-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多