антивіруса для сайтів Вирусдай — Частина 1

У цій статті та наступних за нею публікаціях циклу ми будемо говорити про внутрішній устрій антивіруса для сайтів Вирусдай, про обраних підходів і використовуваних технологіях.



Ми вже писали про можливості сервісу в попередніх постах. Сьогодні ми розповімо про його загальній архітектурі. Ви дізнаєтеся як Вирусдай працює з сайтами (серверами) користувачів, чому ми вибрали саме такий принцип побудови сервісу і які переваги він дає, а також про те, наскільки це безпечно.

Загальна архітектура сервісу
Нашим завданням було створення зручного і ефективного сервісу для лікування і захисту сайтів від вірусів та атак. Вирішено було реалізувати проект у формі SaaS, або кажучи простіше, у вигляді веб-сервісу.

Адже дійсно, сьогодні всі найбільш зручні інструменти надаються людям у вигляді додатків і веб-сервісів. З ними зручно працювати, вони економлять час.

Отже, архітектурно Вирусдай — це централізована система, взаємодіюча з підключеними до неї серверами (вузлами) користувачів.



Іншими словами, користувачі можуть працювати зі своїми сайтами (керувати функціями сервісу Вирусдай: антивірусом, фаєрволом і т. д.) через веб-інтерфейс сервісу.

Віддалене управління файлами на серверах користувачів дозволяє редагувати файли і деякі налаштування; Дає можливість надати людям різні спеціалізовані сервіси, наприклад, лікування (редагування) файлів від шкідливого коду або установку системи захисту (фаєрвол). При цьому завжди існує двосторонній зв'язок між сервером користувача та Вирусдаем.

Отже, розглянемо тепер, яким чином Вирусдай зв'язується з серверами користувачів.

Як Вирусдай взаємодіє з серверами користувачів


Для підключення до сервісу досить помістити в кореневий каталог сайту всього один *.PHP файл (файл синхронізації). Файл унікальний для кожного користувача, його фрагмент наведено нижче (ви можете отримати ваш персональний файл синхронізації, авторизувавшись на сервісі Вирусдай).

Фрагмент файлу синхронізації
<?php

( /* HMAC / CTR validation */

( /* Check HMAC format */
(strlen(SVC_MAC) == 32)
|| ($e = ERR_CHMAC) && 0
)
&&
( /* Calculate and validate HMAC */
/* Try hash_hmac() */
(is_callable($_ = 'hash_hmac') && !strcmp($_('md5', SVC_MACDATA, SVC_CKEY.':'.SVC_CTR), SVC_MAC)) ||
/* Try mhash() */
(is_callable($_ = 'mhash') && defined('MHASH_MD5') && !strcmp(bin2hex($_(MHASH_MD5, SVC_MACDATA, SVC_CKEY.':'.SVC_CTR)), SVC_MAC)) ||
/* Internal HMAC realization */
(
($_ = str_pad((strlen(SVC_CKEY.':'.SVC_CTR) > 64) ? md5(SVC_CKEY.':'.SVC_CTR, TRUE) : SVC_CKEY.':'.SVC_CTR, 64, "\x00", STR_PAD_RIGHT)) &&
!strcmp(md5(($_ ^ str_repeat("\x5c", 64)).md5(($_ ^ str_repeat("\x36", 64)).SVC_MACDATA, TRUE)), SVC_MAC)
)
|| ($e = ERR_CHMAC) && 0
)
&&
( /* Validate CTR request counter */
strlen(SVC_CTR) &&
(($_ = is_file(SVC_CDIR.'/.ctr') ? @file_get_contents(SVC_CDIR.'/.ctr', 0, NULL, -1, strlen(SVC_CTR))." : ") || 1) &&
(strlen($_) <= strlen(SVC_CTR)) &&
(strcmp(SVC_CTR, str_pad($_, strlen(SVC_CTR), '0', STR_PAD_LEFT)) > 0)
|| ($e = ERR_CHMACCTR) && 0
)
&&
(define('SVC_MACOK', 1) || 1)
)

&&
( /* Get script */
( /* Get from cache */
strlen(SVC_CRC) &&
is_file(SVC_CPHP) &&
(define('SVC_CACHED', 1) || 1)
)
||
( /* Get from CDN */
/* Download */
((is_string($rr = @file_get_contents(SVC_QCDN, 0, $svcContext))) || ($e = ERR_C2CDN) && 0)
&&
/* Validate */
(strlen($rr) || ($e = ERR_CDATA) && 0)
&&
/* Check CDN status code */
((strlen($rr) != 3) || (!is_numeric($rr)) || ($e = (int)$rr) && 0)
&&
( /* Unpack script */
SVC_CGZIP ?
((is_string($rd = @gzinflate($rr)) && strlen($rd)) ? 1 : (($e = ERR_CDATA) && 0)) :
(($rd = &$rr) || 1)
)
&&
( /* Store script */
(@file_put_contents(SVC_CPHP, $rd) === strlen($rd))
|| ($e = ERR_CWRITE) && 0
)
&&
(define('SVC_CACHED', 0) || 1)
)
)

&&
( /* Include script */
is_file(SVC_CPHP) && is_readable(SVC_CPHP) &&
(SVC_CACHED && @touch(SVC_CPHP) || 1) &&
($_ = (include ('./'.SVC_CPHP)))
|| ($e = ERR_CINCLUDE) && 0
)

&&
( /* Check script return code */
!(is_numeric($_) && (strlen($_.") == 3))
|| ($e = (int)$_) && 0
)

||
( /* Auto update Client */
($e && in_array($e, array(ERR_CEUPD, ERR_NCVER))) &&
(is_string($rr = @file_get_contents(SVC_QUPD, 0, $svcContext))) &&
(strlen($rr)) &&
(substr($rr, 0, 5) == '<'.'?'.'php') &&
(strpos($rr, "('SVC_CVER',".SVC_CLV.")") !== FALSE) &&
(strpos($rr, SVC_CKEY) !== FALSE) &&
( /* Store client file */
(is_writable($_ = SVC_CFILE) || chmod($_, 0644)) &&
(@file_put_contents($_, $rr) === strlen($rr))
|| ($e = ERR_CWRITE) && 0
)
&& ($e = ERR_CUPDATED) && 0
)

Всі операції по роботі з сайтом (сканування, лікування, установка і управління фаєрволом, одержання необхідних для роботи системи даних тощо) відбуваються за допомогою взаємодії з цим файлом. Людина просто підключає свої сайти до сервісу і далі здійснює всі операції з ними, перебуваючи в панелі управління Вирусдая.

Всі операції з сайтами користувача виробляються через файл синхронізації за допомогою HTTP запитів. У відповідь на отримані від сервісу Вирусдай запити файл синхронізації завантажує з наших серверів (при необхідності) програми і виконує відповідні дії, видаючи відповідає результат їх виконання.

Такий підхід дозволяє вирішити масу проблем, пов'язаних з постійним оновленням програм на сайтах користувача. Так само це дозволяє створити централізовану систему управління безліччю сайтів, розташованих на різних серверах. При роботі з кожним сайтом (сервером) окремо економиться маса часу, а також розподіляється навантаження.

Плюси зв'язку через файл синхронізації
У світі існує чимало сервісів, які обмінюються даними з серверами за допомогою FTP або SSH, однак, ми вибрали HTTP і ось чому ми зробили це. При такому підході операції з файлами можна виконувати прямо на сервері користувача. При цьому навантаження при виконанні програм розподіляється на сервери користувачів; Відпадає необхідність кожний раз завантажувати файли з серверів користувачів для аналізу, що економить трафік в колосальних обсягах. Крім того, більшість сайтів в мережі працюють по протоколу HTTP і підтримують PHP, тому застосування HTTP+PHP — це найбільш універсальний спосіб для взаємодії з ними.

Обраний підхід не просто є досить універсальним, але також є зручним і простим для користувачів сервісу. Людина може не вникати в технічні подробиці пристрою системи або налаштування власних серверів. Єдине, що потрібно від користувача — це додати сайт в свій список і помістити файл синхронізації в корінь сайту на своєму сервері.



Завантаження файлу в корінь сайту — це зрозуміла операція, доступна більшості веб-майстрів та власників сайтів. Ми особливу увагу приділяємо саме простоті використання сервісу, а підключення сайту до Вирусдаю таким чином — це просто і зрозуміло.

Питання безпеки
Звичайно ж, в будь-якому проекті або системі важливу роль відіграють питання забезпечення безпеки. В нашому сервісі цьому напрямку ми приділяємо особливу увагу.

При взаємодії Вирусдая з серверами користувачів використовується кілька ступенів захисту. Це і HTTPS при роботі користувача з сервісом, і унікальний файл синхронізації, який генерується для кожного користувача окремо, і цифрові підписи.

При кожному взаємодії з файлом синхронізації необхідна унікальна цифрова підпис і активна сесія. Це дозволяє не пропускати несанкціоновані запити до файлу. При цьому, навіть якщо перехопити запит, його неможливо буде повторити з тим же успіхом, так як для цього буде потрібно нова цифрова підпис.

Тепер, розповівши про загальну архітектуру сервісу, ми зможемо більш детально зупинитися на кожному ділянці пристрою Вирусдая в наступних публікаціях цього циклу.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.