7 private static $instance =
null;
9 private $isDBEngineActive =
false;
14 private $syslogPriority = LOG_WARNING;
17 private $messageFormatter =
null;
19 private static $syslogFacilities =
array(
20 LOG_SYSLOG =>
"LOG_SYSLOG",
21 LOG_AUTH =>
"LOG_AUTH",
22 LOG_AUTHPRIV =>
"LOG_AUTHPRIV",
23 LOG_DAEMON =>
"LOG_DAEMON",
24 LOG_USER =>
"LOG_USER"
27 private static $syslogPriorities =
array(
28 LOG_EMERG =>
"LOG_EMERG",
29 LOG_ALERT =>
"LOG_ALERT",
30 LOG_CRIT =>
"LOG_CRIT",
32 LOG_WARNING =>
"LOG_WARNING",
33 LOG_NOTICE =>
"LOG_NOTICE",
34 LOG_INFO =>
"LOG_INFO",
35 LOG_DEBUG =>
"LOG_DEBUG"
43 if (is_null(self::$instance))
45 self::$instance =
new static();
47 return self::$instance;
57 public function doLog($severity, $auditType, $itemName, $itemDescription)
61 if ($this->isDBEngineActive)
63 $result = CEventLog::log($severity, $auditType,
"security", $itemName, $itemDescription);
66 if ($this->sysLogger || $this->fileLogger)
68 $message = $this->messageFormatter->format($auditType, $itemName, $itemDescription);
73 $this->sysLogger->log($level,
$message);
76 if ($this->fileLogger)
81 $this->fileLogger->warning(
$message);
93 return static::$syslogPriorities;
101 if (static::isRunOnWin())
102 return array(LOG_USER =>
"LOG_USER");
104 return static::$syslogFacilities;
114 if (!$this->isDBEngineActive)
123 $cacheId =
'sec_events_count';
124 $cacheDir =
'/security/events';
132 if ($timestamp ==
'')
134 $days = COption::getOptionInt(
"main",
"event_log_cleanup_days", 7);
137 $timestamp = convertTimeStamp(time()-$days*24*3600+CTimeZone::getOffset());
141 "SECURITY_FILTER_SQL",
142 "SECURITY_FILTER_XSS",
143 "SECURITY_FILTER_XSS2",
144 "SECURITY_FILTER_PHP"
147 $strAuditsSql = implode(
"', '",$arAudits);
150 SELECT COUNT(ID) AS COUNT
154 AUDIT_TYPE_ID in ('".$strAuditsSql.
"')
156 (MODULE_ID = 'security' and MODULE_ID is not null)
158 TIMESTAMP_X >= ".
$DB->charToDateFunction(
$DB->forSQL($timestamp)).
"
176 return $this->messageFormatter;
179 private function __construct()
181 if (COption::getOptionString(
"security",
"security_event_db_active") ===
"Y")
182 $this->initializeDBEngine();
184 if (COption::getOptionString(
"security",
"security_event_syslog_active") ==
"Y")
185 $this->initializeSyslogEngine();
187 if (COption::getOptionString(
"security",
"security_event_file_active") ==
"Y")
188 $this->initializeFileEngine();
191 COption::getOptionString(
"security",
"security_event_format"),
192 COption::getOptionString(
"security",
"security_event_userinfo_format")
196 private function initializeFileEngine()
198 $filePath = COption::getOptionString(
"security",
"security_event_file_path");
199 if ($filePath && checkDirPath($filePath))
201 $this->fileLogger =
new Diag\FileLogger($filePath, 0);
205 private function initializeDBEngine()
207 $this->isDBEngineActive =
true;
210 private function initializeSyslogEngine()
212 if (self::isRunOnWin())
214 $facility = LOG_USER;
218 $facility = (int) COption::getOptionString(
"security",
"security_event_syslog_facility");
221 $this->syslogPriority = COption::getOptionString(
"security",
"security_event_syslog_priority");
223 $this->sysLogger =
new Diag\SysLogger(
'Bitrix WAF', LOG_ODELAY, $facility);
229 private static function isRunOnWin()
231 return (strtoupper(substr(PHP_OS, 0, 3)) ===
"WIN");
238 private static function sanitizeMessage(
$message)
static priorityToLevel(int $priority)