Website protection rules

Надежная защита веб-сайта от большинства видов атак

Когда создаётся новый сайт на любом языке программирования, фреймворке или 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. Периодически просматривайте отчеты нагрузки и логи для выявления проблем на ранних стадиях.

Эти простые правила помогут максимально уберечь Ваш сайт от большинства возможных атак. Также, существуют различные системы предварительной проверки настроек хостинга и периодического мониторинга изменения файловой структуры.

Самые полезные и признанные экспертами публикации в сферах IT-бизнеса и Web-разработки: