o
    h                     @   sp   d dl Z d dlZd dlZd dlZd dlmZmZmZmZ d dl	m
Z
 ejejdd eeZG dd dZdS )    N)ListDictAnyOptional)CountermeasurePluginz4%(asctime)s - %(name)s - %(levelname)s - %(message)s)levelformatc                   @   sd  e Zd ZdZd$defddZdeeeef  fddZ	d	ed
e
fddZdeeef dedeeeef  fddZdeeef deeeef  dedeeeef  fddZdeeeef  deeef dedeeeef  fddZdeeeef  deeef defddZdededeeef dedeeef f
dd Zdeeef deeef fd!d"Zd#S )%
RuleEngineuC   
    规则引擎，负责解析规则并触发反制动作。
    logs/countermeasure_audit.logaudit_log_filec                 C   s   g | _ i | _|| _d S )N)rulescountermeasuresr   )selfr    r   /root/ive/core/rule_engine.py__init__   s   
zRuleEngine.__init__r   c                 C   s    || _ tdt| d dS )u   加载反制规则zLoaded z rules.N)r   loggerinfolen)r   r   r   r   r   
load_rules   s   zRuleEngine.load_rulesnamepluginc                 C   s   || j |< td|  dS )u   注册反制动作插件z"Registered countermeasure plugin: N)r   r   r   )r   r   r   r   r   r   register_countermeasure   s   
z"RuleEngine.register_countermeasurerequest_contextenvironment_idreturnc                 C   s   |  | j||S )u  
        评估请求上下文并执行匹配的反制动作 (使用引擎内部加载的全局规则)
        :param request_context: 请求上下文信息
        :param environment_id: 触发反制的环境ID
        :return: 执行的反制动作结果列表
        )_evaluate_and_execute_rulesr   )r   r   r   r   r   r   evaluate_and_execute#   s   zRuleEngine.evaluate_and_executeenvironment_rulesc                 C   s   |  |||S )uP  
        评估请求上下文并执行匹配的反制动作 (使用为特定环境指定的规则)
        :param request_context: 请求上下文信息
        :param environment_rules: 为该环境指定的规则列表
        :param environment_id: 触发反制的环境ID
        :return: 执行的反制动作结果列表
        )r   )r   r   r   r   r   r   r   $evaluate_and_execute_for_environment-   s   	z/RuleEngine.evaluate_and_execute_for_environmentrules_to_evaluatec                 C   s  g }|D ]{}| ddsq| | dg |r| d}| j |}|rrz+| }| di |d< ||}	|d ||	d}
||
 | |d ||||	 W q tyq } zt	d| d	|d  d
|  W Y d}~qd}~ww t
d| d|d   q|S )u  
        内部方法：执行规则评估和反制动作
        :param rules_to_evaluate: 要评估的规则列表
        :param request_context: 请求上下文信息
        :param environment_id: 触发反制的环境ID
        :return: 执行的反制动作结果列表
        enabledT
conditionsactionconfigid)rule_idr#   resultzError executing countermeasure z
 for rule z: NzCountermeasure plugin 'z' not found for rule )get_match_conditionsr   copyexecuteappend
_log_audit	Exceptionr   errorwarning)r   r    r   r   resultsruleZaction_name	cm_pluginZcontext_with_configr'   Zexecution_resulter   r   r   r   8   s2   


,z&RuleEngine._evaluate_and_execute_rulesr"   contextc                 C   sZ   |D ](}d}|  D ]\}}||v r|| |krd} n	||vr$d} nq
|r* dS qdS )u   匹配规则条件TF)items)r   r"   r5   	conditionmatchkeyvaluer   r   r   r)   a   s   zRuleEngine._match_conditionsr&   r#   r'   c           
   
   C   s   t   ||| |||d}z7tj| j}|rtj|dd t| jddd}|t	
|d  W d   W dS 1 s>w   Y  W dS  ty` }	 ztd	|	  W Y d}	~	dS d}	~	ww )
u   记录审计日志)	timestampr&   r   requestr#   r'   T)exist_okazutf-8)encoding
NzFailed to write audit log: )time_sanitize_contextospathdirnamer   makedirsopenwritejsondumpsr.   r   r/   )
r   r&   r   r   r#   r'   Z	log_entryZlog_dirfr4   r   r   r   r-   u   s$   	&zRuleEngine._log_auditc                 C   s   |  }|S )u?   对请求上下文进行脱敏处理，避免记录敏感信息)r*   )r   r5   Z	sanitizedr   r   r   rB      s   zRuleEngine._sanitize_contextN)r
   )__name__
__module____qualname____doc__strr   r   r   r   r   r   r   r   r   r   boolr)   r-   rB   r   r   r   r   r	      s    *:
:*).&r	   )rA   rI   loggingrC   typingr   r   r   r   pluginsr   basicConfigINFO	getLoggerrL   r   r	   r   r   r   r   <module>   s   
