Надежная защита веб-сайта от большинства видов атак
Когда создаётся новый сайт на любом языке программирования, фреймворке или CMS (система управления контентом), его устойчивость к атакам из-вне полностью и целиком зависит от разработчиков всех компонентов кода для этого сайта.
Особенно это опасно, когда Вы доверяете разработку непроверенному или неопытному разработчику с фриланса!
Не всегда программистам удаётся предотвратить использование опасных запросов со стороны клиента, позволяющие злоумышленникам (или сетевым вирусам) проникать в систему управления сайтом и получать полный контроль над управлением всем сайтом (или его части) или даже, целым сервером, на котором этот сайт находится.
После установки "чужого" кода на Ваш сайт (кроме обычных действий с копированием и/или изменением данных на сайте), он может стать частью бот-net'а (сеть из нескольких, таких же, "зомбированных" хост-площадок) и управляться командами из-вне.
После этого, с сайта могут похитить всю базу данных (включая аккаунты пользователей и всю их личную конфиденциальную информацию), провести спам-рассылку от имени вашего сайта, отредактировать/заменить/удалить любые файлы, разместить рекламу на вашем сайте и т.д.
Минимальные и универсальные правила помогут предотвратить понизить риск проникновения. Для максимальной уверенности - необходимо заказывать услугу профессионального полного аудита кода на возможность проникновения со всеми необходимыми исправлениями.
Итак, начнём!
Это правило №0 и оно самое главное для всего в логике!
Правило №0: При переходе от одной технологии, процесса, этапу к любому другому,
ВСЕГДА ПРОВЕРЯЙТЕ ВХОДНЫЕ ДАННЫЕ!,
т.к. вероятность выхода из строя разнородных узлов без видимой ошибки - близка к 100%.
Правила защиты веб-сайта:
1. Права на папки и файлы (устанавливаются сразу после распаковки архива веб-сайта на хостинг):
- все папки: 755;
для папок кэша, медиа, бэкапа: 777 (все могут создавать и изменять файлы): здесь мы запретим выполнение скриптов веб-сервером, чтобы исключить возможный запуск "чужих" скриптов в этих папках (имена папок - заменить на свои!). Делаем так (в .htaccess):
RewriteCond %{REQUEST_URI} /(media|tmp|cache|images|assets|upload)/($|(.*\..?(php|cgi|exe|asp|pl|.html|py|jsp|do))) [NC] RewriteRule ^.*$ - [R=404,L]
- все файлы: 644;
для файлов-конфигураций: 444 (все могут только читать);
для файлов-баз-данных: 666 (все могут читать и изменять);
Пример выполнения команды chmod из под root-пользователя в консоли хостинга (например, через putty) для установки прав 755 на все вложенные папки в директории www и все её подпапки:
chmod -R go=rX,u=rwX /home/www
2. Настройка фильтрации опасных запросов со стороны веб-сервера.
Добавляем следующий код в начало файла .htaccess в корневой web-директории (веб-сервер Apache):
ServerSignature Off RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR] RewriteCond %{THE_REQUEST} (\\r|\\n|%0A|%0D) [NC,OR] RewriteCond %{HTTP_REFERER} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{HTTP_COOKIE} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|”>|”<|/|\\\.\.\\).{0,9999} [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^$ [OR] RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR] RewriteCond %{HTTP_USER_AGENT} ({|}|<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] #Block mySQL injects RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR] RewriteCond %{QUERY_STRING} \.\./\.\. [OR] RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] RewriteCond %{QUERY_STRING} \.ht [NC,OR] RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC] # Note: The final RewriteCond must NOT use the [OR] flag. # Return 403 Forbidden error. RewriteRule .* index.php [F]
3. Настраиваем доступ к админ-панели только с доверенных IP-адресов. Можно указать или полный адрес, или подсеть (не забыв точку в конце!), или DNS-имя хоста.
Добавляем следующий код в начало файла .htaccess в директории Admin-панели (веб-сервер Apache) и заменяем нужную запись на свой IP/хост (# - символ комментария):
deny from all allow from XXX.XXX.XXX.XXX #allow from YYY.YYY.YYY. #allow from host.domain.com
4. Не забывайте создавать резервную копию сразу после настройки нового сайта, а также настроить систему автоматического создания резервных копий на хостинге в определенную папку (не внутри www-root, а вне её!) и периодически синхронизируйте содержимое этой папки с хостинга к себе в локальное хранилище (на диск ПК, USB-флешку и т.д.).
5. Периодически просматривайте отчеты нагрузки и логи для выявления проблем на ранних стадиях.
Эти простые правила помогут максимально уберечь Ваш сайт от большинства возможных атак. Также, существуют различные системы предварительной проверки настроек хостинга и периодического мониторинга изменения файловой структуры.