Решил подключить коллективный разум к идее создания антивируса для Joomla. Точнее это не антивирус в привычном для нас виде, да и идею я почерпнул из DLE.
Взлом сайта обычно влечет изменение файловой структуры - внедряется вредоносный код в файлы, добавляются новые и т.д. Абсолютно безопасных и надежных систем не существует и взлом - лишь вопрос времени. Часто действия хакера или специальных программ длительное время остаются незамеченными. Тревогу, как правило, поднимает хостер или поисковые системы, информируя о вредоносном коде или превышении максимально допустимой нагрузки на сервер. После этого начинается паника, администратор лихорадочно ищет взломанные файлы и вычищает внедренный код. Да еще и знать нужно, где его искать, исследуются тонны логов. Новички и пионеры, как правило, вычищают результат работы, а сами шеллы или бэкдоры остаются неопознанными.
Моя идея заключается в написании компонента, способного предупредить администратора сайта о взломе, который выявляется сканированием файловой структуры сайта. При выявлении изменения размера файла или даты его последнего изменения администратор незамедлительно информируется. Таким образом можно в режиме реального времени вести мониторинг целостности сайта. Мониторинг может быть осуществлен двумя способами - путем задания периодов запуска сканера через Cron или путем загрузки в память самоперезапускаемого демона (я здесь выкладывал свой код такого демона, который запускал сам себя через сокеты).
Однако встал вопрос сохранения результатов сканирования файловой системы. Эти результаты могут быть как изначально заложенными (при сканировании чистой Joomla), так и созданной отлаженной системы (первое сканирование - создание эталонных записей в базе данных). После чего повторное сканирование - это сверка с эталоном. Однако, как показывает практика, получить доступ к файловой системе - не такая уж проблема для грамотного взломщика, особенно учитывая откровенное разгильдяйство хостеров. Следовательно, имея доступ к файлам и базе, хакер легко может не только внедрить код, но и подменить данные в базе таким образом, что бы сканер не выявил расхождений. Я решил применить один из популярных методов симметричного шифрования записей, к примеру XXTEA, RSA. DES и др. Ключом к шифру хочу сделать пароль пользователя, на мой взгляд это самое простое решение. Например, шифрование делается по хешу, записанному в базе, а дешифруется после ввода пароля пользователем.
Вот, собственно, и встал вопрос, который поставил в тупик всю идею создания этого компонента: пароль должен быть в памяти, что бы работал дешифратор, его можно прочитать из переменной, отснифить при вводе и т.д. Других вариантов создания некого уникального ключа, который был бы недоступен хакеру, я не придумал. Использование дополнительного оборудования не планируется, так как компонент будет бесплатным.
Вопрос: какие вы можете предложить методы защиты эталонного списка в базе данных, обеспечивающие пусть не полную, но высокую сохранность? Какие дадите советы по реализации данного компонента?