
    w=!je                     T    d dl m Z mZ d dl d dlmZ  G d dej
                        Zy)    )datetime	timedelta)*)	cmf_auditc                       e Zd ZdZej
                  j                  dgz   Zd Z fdZe		 	 	 dd       Z
edd       Zed        Zed fd	       Zed fd		       Zed fd
	       Zed fd	       Zed fd	       Ze	 edddd      d               Ze	defd       Ze	d d       Zd Zd Ze	 edddd      d               Zd Zed!def fd       Z xZS )"CmfAuditTaudit_eventc                     t        dd       y )Nu>   Невозможно удалить запись Аудита!Tabort)	cmf_alert)selfargskwargss      ./cmf/models/cmf_audit.pydeletezCmfAudit.delete   s    R[_`    c                 v    | j                   r| j                          t        |   |i |S t	        dd       y )NuJ   Невозможно редактировать запись Аудита!Tr   )is_new_log_ib_auditsupersaver   )r   r   r   	__class__s      r   r   zCmfAudit.save   s6    ;; 7<000^gklr   c                    t         j                  ry |r*t        |t              r|}n~|j                  j
                  }ngt         j                  r%t         j                  j                  j
                  }n2t        j                  j                         j                  j
                  }|}t         j                  r4t         j                  j                  rt         j                  j                  }|rWt        |t              s-t        t        |      t        j                  j                         r|}n|j                  j
                  }n|}|s|}|j#                  d      r|}|dk(  rd}d }t$        j&                  rt$        j&                  d   }|sg }|
dk(  r|dv rd}
d|  } |
dk(  r|dv rd	}
d
|  } |
dk(  rJt(        j+                  |      j,                  dvs"t(        j+                  |      j.                  dk7  rd}
d|  } |r=|
dk(  r8t         j0                  r(t         j2                  t         j                  k7  rd|  } d}
| ||||||||||
|d}|	r t         j4                  j7                  |       y t         j8                  j7                  |       y )Nz	CmfAudit:r   u   Таблица Аудитаr   )	CmfPerson   user_)CmfPersonGroupCmfRole
CmfOrgUnitCmfProjectRoleCmfProjectPermSchemeRuleCmfProjectPermSchemeCmfAccessListCmfAccessRuleCmfSecurityLevelRuleCmfSecurityLevelSchemeCmfSecurityLevel   perm_)defaultstaticno_aclr+      cfg_admin_)operatecmf_model_nameresult_status
cmf_authorparent	client_ip
audit_datahtml_diff_dataparent_nameparent_codesecurity_level	real_user)gimport_mode
isinstancestridvaluecurrent_usermodelsr   system_personsessionreal_user_id
issubclasstypecmffieldsCmfStr
startswithrequestaccess_routecmfutilget_model_by_nameacl_typeacl_default_user_policyacl_admin_modecurrent_persondeferred_audit_notrans_listappenddeferred_audit_list)r1   r2   r3   r4   r5   r7   r8   r9   r:   ignore_transactionr;   check_is_admincmf_author_idrG   	parent_idr6   r   s                    r   r	   zCmfAudit.audit_event   sM    ==&#& * * 3 3^^NN--33M",,::<??EEM$99//9911L &#&*T&\3::CTCT*U"	"IIOO	%I#K ,%IZ'7K 	,,Q/IJ Q>]#BNgY'G Q> 6J $J NgY'GQG$=$=n$M$V$V^}$},,^<TTXaaNWI&G
 n1a6F6F1K[K[_`_n_nKnwi(GN ,*'"$,&&,%
 ))008!!((0r   c                 0   |rg t         _        t        t         d      sy g t         j                  t         j                  }|sy t        j                         5  t         j                  dt        |       d       |D ]l  }|j                  dd       }|r't        |t              rt        j                  |d      }|s|d   }||d<   t        j                  di |j                          n 	 d d d        g t         _        g t         _        y # 1 sw Y    xY w)	NrV   zapply_deferred_audit save z audit recsr5   T)include_deletedr4    )r=   rX   hasattrrV   rP   disable_acldebuglengetr?   r@   get_obj_by_idrD   r   r   )clsrollback
audit_listr   r5   s        r   apply_deferred_auditzCmfAudit.apply_deferred_auditv   s    $&A!1;<Mq,,Mq/L/LM
  " 
	1GG0Z0AMN$ 1Hd3j5$22642PF#L1F#)x )&)..01
	1 !#(*%
	1 
	1s   BDDc                     t         j                  t         j                  k(  xs t        j                  j                         S N)r=   rC   system_userrD   r$   is_ib_admin)rf   s    r   _check_perm_admin_ibzCmfAudit._check_perm_admin_ib   s+     ~~.T&2F2F2R2R2TTr   c                 ^    | j                         s
|g }|g dg}t        |   dd|i|}|S N)r;   =r   filterr_   )rn   r   listrf   rr   r   resr   s       r   rs   zCmfAudit.list   ?    '')~89Fgl3&3F3
r   c                 ^    | j                         s
|g }|g dg}t        |   dd|i|}|S rp   )rn   r   slistrt   s       r   rx   zCmfAudit.slist   ?    '')~89Fgm464V4
r   c                 ^    | j                         s
|g }|g dg}t        |   dd|i|}|S rp   )rn   r   rd   rt   s       r   rd   zCmfAudit.get   s?    '')~89Fgk2262
r   c                 ^    | j                         s
|g }|g dg}t        |   dd|i|}|S rp   )rn   r   sgetrt   s       r   r|   zCmfAudit.sget   rv   r   c                 ^    | j                         s
|g }|g dg}t        |   dd|i|}|S rp   )rn   r   countrt   s       r   r~   zCmfAudit.count   ry   r   u4   Удаление устаревшего аудитаz@daily)	only_oncedescription
system_jobschedulec                  >   t         j                  j                  j                  } | sy t	        j
                         t        |       z
  }dd|g}t        j                  j                  dg|ddgdg      }|sy |d   j                  }|t        d      z   }|j                         |j                         k  rgddd|gdd|gg}t        j                  j                  |       t                |t        d      z  }|j                         |j                         k  rfy y )	Ndayscmf_created_at<r      )order_byrr   slicerK   AND)rr   )r=   global_settingsaudit_storage_durationrB   r   nowr   rD   r   rs   r   	timestampbulk_delete
cmf_commit)days_durationend_dtrr   oldest_date_listoldest_datetimemax_datetimes         r   cron_delete_outdated_auditz#CmfAudit.cron_delete_outdated_audit   s    ))@@FF)"??"C0 "??//:J9KTZcdfgbh  sC  rD/  E*1-<<&)::$$&&*:*:*<<.\BEUWZ\bDcdFOO''v'6LI1--L $$&&*:*:*<<r   extc                     d d |        d |       d |       d |       d |       d |       ddj                  fd|j                         D              z   S )aj  
        CEF:0|Trend Micro|Deep Security Manager|12.0|600|Administrator Signed In|4|            suser=jsmith src=192.168.1.50 dvc=10.0.0.5

        CEF Prefix
            CEF:0
            The CEF format version number.
        Device Vendor
            Trend Micro
            The organization that created the logging device/software.
        Device Product
            Deep Security Manager
            The specific product name generating the log.
        Device Version
            12.0
            The version of the product creating the event.
        Signature ID
            600
            A unique identifier for the specific event type or rule.
        Name
            Administrator Signed In
            A human-readable description of the event.
        Severity
            4
            The importance of the event, usually scaled from 0 to 10 or as a string (Low, Medium, High, etc.).
        Extensions
            user=jsmith src=192.168.1.50 dvc=10.0.0.5
            A space-separated list of key=value pairs that provide the specific details of the event.

        Escape: "\, |, =, \r, \n" with "\"
        c                 H    d }t         j                  d|t        |             S )zValues escapingc                 L    | j                  d      }|dk(  rd}n|dk(  rd}d| S )Nr   
nr\)group)matchss     r   replz-CmfAudit._format_cef.<locals>.e.<locals>.repl   s2    KKN9A$YAA3xr   z([\\|\r\n=]))resubr@   )rB   r   s     r   ezCmfAudit._format_cef.<locals>.e   s       66/4U<<r   zCEF:0|| c              3   >   K   | ]  \  }}| d  |         yw)rq   Nr_   ).0kvr   s      r   	<genexpr>z'CmfAudit._format_cef.<locals>.<genexpr>  s#     @&1a1#Qqtf@s   )joinitems)vendorproductproduct_version
event_code
event_nameseverityr   r   s          @r   _format_cefzCmfAudit._format_cef   s~    B
	= &	{!AgJ<q?1C0DAa
m_TUVWXbVcUddefghpfqerrsthh@CIIK@AB 	Br   c                     | d| d|  S )uM   TODO: Заворачиваем CEF в syslog: Dec 06 14:02:15 dsmhost CEF:...r   r_   )cef_messagedthostnames      r   _format_cef_syslogzCmfAudit._format_cef_syslog  s     Qxj+//r   c                    t         j                  j                  j                  | j                     }t         j                  j                  j                  | j                     }t         j                  j
                  j                  | j
                     }| j                  ||t        j                   dt        j                   | j                  | j                  |t        | j                  j                  j                         dz        | j                  | j                   | j"                  | j$                  j&                  xs | j$                  j                  | j(                  j&                  xs | j(                  j                  | j*                  | j,                  j                  | j.                  | j0                  | j2                  j5                         | j6                  d      S )u|   Форматирует данные аудита в CEF сообщение для отправки в лог-систему./i  )rt
externalIdr3   srcsuserr<   r2   obj_idobj_codeobj_namer7   r8   )rD   r   vendor_namechoicesproduct_namer;   r   config
EVA_BRANCHEVA_VERSIONr1   intr   rB   r   rA   r3   r6   r4   loginr<   r2   r5   r:   r9   r7   	db_formatr8   )r   r   r   security_level_strs       r   format_audit_message_cefz!CmfAudit.format_audit_message_cef  s[   oo1199$:J:JK33;;D<M<MN#__;;CCDDWDWX&*;*;)<Af>P>P=Q'RLL$,,(:$--33==?DE"gg!%!3!3~~..D$//2D2D!^^11FT^^5F5F"&"5"5++.. ,, ,,"oo779"&"5"5= 	r   c                    ddl }|j                         }|j                  |      }d}d}| j                  }t        j
                  j                  j                  | j                     }| j                  j                  j                         }| j                  }	| j                  }
| j                  }| j                  }| j                  }| j                  }| j                   }| j"                  }| j$                  j'                         }| j(                  }| j*                  }d| d| d| d| d| d| }|d|
 d| d	| d
| z  }|d| d| z  }|d|	 d| z  }|d| d| z  }|d| d| z  }|j-                  dd      }|S )u	  
        Форматирует данные аудита в сообщение для отправки в лог-систему.
        
        Returns:
            str: Отформатированное сообщение для логирования
        r   NEvaTeamr   z> 1 r   z	 operate=z id=z cmf_model_name=z result_status=z cmf_author=z obj=z client_ip=z security_level_str=z
 obj_name=z
 obj_code=z audit_data=z html_diff_data=r   )socketgethostnamegethostbynamer;   rD   r   r   r   rB   	isoformatr6   r1   r2   r3   r4   r5   r9   r:   r7   r   r8   rA   replace)r   r   r   
ip_addressr   r   r;   r   r   r6   r1   r2   r3   r4   objr   r   r7   r8   rA   messages                        r   format_audit_messagezCmfAudit.format_audit_message#  s    	 %%'))(3
  ,,#__;;CCDDWDWX  &&002NN	,,,,**__
kk####__..0
,,WW n%T"Qxj*Q{mSTUaTbcYwitB4/??O_l^mnn\*U3%88[+?@R?STTZzH:>>\*-=n=MNN //$,r   z	@minutely   )r   r   r   priorityc            
         dd l } dd l}dd l}t        j	                  dd       t
        j                  s8t
        j                  rt
        j                  st        j	                  dd       y t        j	                  dt
        j                   d       d }t
        j                  rt
        j                  rt
        j                  dk(  r	 t        j	                  d	t
        j                   d
t
        j                   d       | j                  | j                  | j                        }|j                  t
        j                  t        t
        j                        f       t        j	                  d       d }t
        j                  rt        t
        j                  d      }|j                         }d}g }d}		 	 t         j"                  j%                  g ddgddg      }
|t'        |
      z  }t        j	                  d| dd       |
snAt)        |
d      D ]y  \  }}t        j	                  d| d| d|j*                   d       d}|j-                         }t
        j                  rpt
        j.                  r|j1                         dz   }n|dz   }	 |j3                  |       t        j	                  d|j*                   dt
        j                   d       t
        j                  r}t
        j                  rlt
        j                  dk(  rJ	 |j5                  |d!z   j7                                t        j	                  d|j*                   d"d       n	 d(}|j7                  d)      }t'        |      |kD  r`|d |d*z
   j;                  d)d+,      }|d-z  }|j7                  d)      }t        j	                  d.|j*                   d/t'        |       d0d       | j                  | j                  | j<                        5 }|j?                  |t
        j                  t        t
        j                        f       d d d        t        j	                  d|j*                   d1d       |sU|jA                  |j*                  jB                         | t        j	                  d3d       	 t         j"                  jE                  d4d id5d6|g7      }t        j	                  d8| d       |j                         |z
  d:kD  rt        j	                  d;| d<d       n.t        j	                  d=| d>d       |jG                  d       |rQ	 |j9                          t        j	                  d@d       t        j	                  dBt'        |       dC|	 dD| d       |r|j9                          	 t        j	                  dE|j                         |z
   d       y # t        $ r }t        j	                  d| d        d }~ww xY w# t        $ r9}t        j	                  d|j*                   d| d       d }|	dz  }	Y d }~md }~ww xY w# t        $ r?}t        j	                  d#|j*                   d| d       	 t        j	                  d$d       |j9                          | j                  | j                  | j                        }|j                  t
        j                  t        t
        j                        f       |j5                  |d!z   j7                                t        j	                  d%|j*                   d&d       n?# t        $ r3}t        j	                  d'| d       d }d }|	dz  }	Y d }~Y d }~ d }~ww xY wY d }~+d }~ww xY w# 1 sw Y   bxY w# t        $ r9}t        j	                  d2|j*                   d| d       d }|	dz  }	Y d }~}d }~ww xY w#  t        j	                  d9| d        xY w# t        $ r }t        j	                  d?| d        d }~ww xY w# t        $ r%}t        j	                  dA| d       Y d }~d }~ww xY w# |r	 |j9                          t        j	                  d@d       n0# t        $ r$}t        j	                  dA| d       Y d }~nd }~ww xY wt        j	                  dBt'        |       dC|	 dD| d       |r|j9                          w w xY w)FNr   uH   Запуск процесса экспорта аудит-записейINFO)levelu   Не настроены параметры экспорта (IB_AUDIT_FILE или IB_AUDIT_RSYSLOG_HOST/PORT). Экспорт не выполняется.WARNINGuN   Используемый протокол для отправки логов: tcpu7   Устанавливаем TCP-соединение с :u>   TCP-соединение успешно установленоuG   Ошибка при установлении TCP-соединения: ERRORaT)need_exportz==Tz**   )rr   rK   r   u   Найдено u'    записей для экспортаr   u    Обработка записи r   z, ID: DEBUGr   u   Запись ID u-    успешно записана в файл uD   Ошибка при записи в файл для записи ID z: Fz
u-    успешно отправлена по TCPuN   Ошибка при отправке лога по TCP для записи ID u4   Попытка переподключения TCP...u?   Переподключение успешно, запись ID u    отправленаu8   Ошибка при переподключении TCP: i  zutf-82   ignore)errorsz... [TRUNCATED]u*   Сообщение для записи ID u    обрезано до u	    байтu-    успешно отправлена по UDPuN   Ошибка при отправке лога по UDP для записи ID u=   Обновляем статус отправки аудитаr   rA   IN)valuesrr   u"   Обновлено записей u@   Ошибка обновления статуса записей    uP   Превышен лимит времени 20 секунд обработано u    объектовu   Обработано u    объектов, sleep 1uX   Необработанное исключение в процессе экспорта: u6   TCP-соединение успешно закрытоu?   Ошибка при закрытии TCP-соединения: u1   Экспорт завершен. Успешно: u   , Ошибок: u   , Всего: u3   Закончили обработку аудита )$r   loggingtimer=   rb   r   IB_AUDIT_FILEIB_AUDIT_RSYSLOG_HOSTIB_AUDIT_RSYSLOG_PORTIB_AUDIT_RSYSLOG_PROTOAF_INETSOCK_STREAMconnectr   	ExceptionopenrD   r   rs   rc   	enumeraterA   r   IB_AUDIT_CEF_FORMATr   writesendallencodeclosedecode
SOCK_DGRAMsendtorW   rB   bulk_updatesleep)r   r   r   
tcp_socketr   log_filestrecord_countsuccesserror_countaudit_recordsidxauditexport_successr   file_messagereconnect_errorMAX_UDP_SIZEmessage_bytestruncated_messager   ru   s                         r   cron_log_ib_auditzCmfAudit.cron_log_ib_auditO  sv	    		Zbhi$$00V5Q5QGG  q  yBG  C	`aga~a~`  A  IO  	P 
''F,H,HVMjMjnsMsQRXRnRnQoopqw  rN  rN  qO  P  X^  _#]]6>>6;M;MN
""F$@$@#fFbFbBc#deXY
 F00#6HYY[s	! & 4 4<Wae`f;<R& !5 !B M 22/,7^_gmn$"+M1"= I7JCGG>se1\NRXY^YaYaXbckrGs%)N#88:G++
 "55+0+I+I+Kd+RL+2T>L-$NN<8GG&6uxxj@mnt  oC  oC  nD  %E  MTG  U 338T8T!88EA* * 2 2Gf4D3L3L3N O !*:588*Dq(r  {B  !C&1 0407w0G#&}#5#D8EFV|TV8W8^8^_fow8^8x$5$59J$J$54E4L4LW4UM$%GG.XY^YaYaXbbyz}  L  {M  zN  NW  -X  `iG  %j &,]]6>>6CTCT%U !YZ$%HH]V=Y=Y[^_e_{_{[|<}$~! !*:588*Dq(r  {B  !C &uxx~~6SI7T W`gh //55mU=S]acgip\q5rCGG@FgGV 99;#b(GGno{n|  }N  O  W^G  _/~=WX`gh

1 L r$$&GGT\bGc GG~Uefqer  sA  BN  AO  P   "  	EdiikRTnEUV^efC  abcademtuR  ) -GG&jkpksksjttvwxvy$z  CJG  K-2N'1,K- $- * !*xy~  zB  zB  yC  CE  FG  EH  )I  QX  !Y!*$%GG,bjpG$q$.$4$4$617v~~vOaOa1bJ$.$6$68T8TVYZ`ZvZvVw7x$y$.$6$6&8H7P7P7R$S$%GG.mnsnvnvmw  xM  -N  V\G  %]'0 !*$%GG.fgvfw,x  AHG  %I15J5:N$/1$4K$)E!* %]*B! ! $- 1 !*xy~  zB  zB  yC  CE  FG  EH  )I  QX  !Y16 +q 01GG^_f^ghpwGx  	GGnopnqr  {BG  C	 ! rGG]^_]`aipGqqr	 r$$&GGT\bGc  rGG]^_]`aipGqqr GG~Uefqer  sA  BN  AO  P   "   sk  
B,W! 9C` AX5` AY` B'^+:^>-^++` /?` /A _0 /A ` '`< !	X
*XX
	Y.Y
` 
Y` 
^'^C]^	^#^=^` ^^` ^` ^(	#^++	_-4._("` (_--` 0`` 	`9`44`99a- <	a*a%%a*-d1'bd	c"c<dcA dc                     t         j                  s!t         j                  rt         j                  sy | j                  dkD  rd| _        y y )Nr   T)r   r   r   r   r;   r   )r   s    r   r   zCmfAudit._log_ib_audit  s<    $$00V5Q5Q "#D #r   returnc                    |sdg}|set        j                         }t        |j                  dd      }|t        d      z   }|j	                  d      }	|j	                  d      }
d|	 d|
 d}|sg d}t
        |   |||||	      S )
Nz-cmf_created_atr   r   z%a %b %d %Yz ["AND",["cmf_created_at",">=", "z"],["cmf_created_at","<=","z"],["security_level","=", 0]])r:   r9   r   r2   r4   zcmf_author.loginr1   )r   )r   r   yearr   strftimer   export2file)rf   field_namesbqlformat_fileinclude_archivedr   current_date
start_datefinish_datestart_date_strfinish_date_strr   s              r   r  zCmfAudit.export2file  s    )*H#<<>L!,"3"3Q:J&)::K'00?N)22=AO4^4DD_`o_p  qN  OCK w";[BR]e"ffr   )
okNNN NNTr   T)Frk   )NN)NNcsvFN)__name__
__module____qualname__	api_allowr   r   api_methodsr   r   staticmethodr	   classmethodri   rn   rs   rx   rd   r|   r~   cmf_deferred_jobr   dictr   r   r   r   r  r   r@   r  __classcell__)r   s   @r   r   r      s   I$$004
 
Kam Y]VZNR]1 ]1~ + +, U U           2huy  EM  N. N ., -B]a -B -B^ 0 0.*X VWXWg Y Wgr$ gru g gr   r   N)r   r   cmf.include
cmf.fieldsr   r   r_   r   r   <module>r3     s$    (   Cgy!! Cgr   