В данном материале мы рассмотрим эффективные способы защиты сайта, разработанного на CMS Joomla, которые реализуются с помощью настроек (специальных правил), прописанных в конфигурационном файле веб-сервера htaccess.
В интернете очень много всевозможных материалов, в которых описываются методы защиты сайта, различных инструкций, направленных на повышение безопасности сайта, некоторые из этих способов защиты характерны для всех сайтов, а некоторые — только для сайтов, реализованных на конкретной CMS (системе управления сайтом). Даже я уже рассказывал о том, как защитить сайт на CMS WordPress в материале «17 способов защиты сайта на WordPress».
Сегодня мы поговорим о том, как защитить сайт, который реализован на CMS Joomla.
Однако в данном материале я не буду рассказывать об общих мерах безопасности, которые обязательно должны соблюдаться на сайте, к таким относится:
- Использование не стандартного логина администратора сайта;
- Использование сложных паролей как для админ-панели сайта, так и для панели управления хостингом, включая сложный пароль для базы данных. Также рекомендуется периодически менять все пароли (раз в 3-4 месяца);
- Актуальная версия CMS, шаблона, всех компонентов, плагинов и других расширений, т.е. все это должно постоянно и своевременно обновляться;
- Использование HTTPS;
- Хранение на сервере только тех расширений, плагинов и компонентов, которые задействованы (т.е. все, что не используется, необходимо удалять);
- Использование не стандартного префикса для таблиц в базе данных.
Но это, как я уже отметил, общие меры, к безопасности сайта нужно подходить индивидуально, так как сайты разные и функционал на них тоже разный, поэтому и способы защиты будут также отличаться. Например, у Вас обычный небольшой сайт (блог), на котором отсутствует регистрация пользователей, на сайт информацию добавляете только Вы и функционала на Вашем блоге не так много, поэтому в данном случае имеет смысл запретить использование некоторых PHP функций или просто задать более строгие настройки для PHP. В случае с крупным сайтом или с интернет магазином эту меру безопасности скорей всего не получится выполнить, так как настройки PHP ограничивают некоторые возможности сайта.
В этом материале я расскажу о тех способах защиты сайта, созданного на Joomla, которые можно реализовать с помощью настройки только одного конфигурационного файла – это htaccess.
.htaccess – это файл для дополнительной конфигурации веб-сервера. Не имеет расширения, и точка в начале файла обязательна. Параметры, заданные с помощью файла htaccess, действуют на все файлы в каталоге, в котором располагается файл htaccess, а также на все, что расположено во всех подкаталогах.
Некоторые из рассмотренных сегодня директив файла htaccess можно использовать и для сайтов, работающих на других CMS, но некоторые написаны исключительно для Joomla.
Все, рассмотренное в данной статье, — это, конечно же, не предел, работать над безопасностью сайта можно практически бесконечно, я покажу только способы, которые, на мой взгляд, эффективные и ими стоит пользоваться.
Заметка! ТОП 5 популярных CMS для блога.
- Директивы htaccess для защиты сайта на Joomla
- Basic HTTP аутентификация для входа в админ-панель Joomla
- Запрет просмотра содержимого директорий
- Запрет доступа к файлу htaccess
- Блокировка инструментов взлома по USER AGENT
- Базовая, стандартная защита от вредоносных запросов к сайту
- Дополнительная защита от вредоносных запросов к сайту
- Базовая защита от SQL инъекций
- Запрет на визуальный просмотр расположения позиций модулей в шаблоне
- Защита системных файлов и каталогов
- Ограничение доступа к файлам и каталогам, которые доступны пользователю
- Запрет запуска сторонних PHP файлов для всего сайта
- Расширенная защита от вредоносных запросов и SQL инъекций
- Блокировка плохих поисковых ботов по USER AGENT
Директивы htaccess для защиты сайта на Joomla
Перечисленные ниже настройки разрабатывались для обычного блога на Joomla и они точно работают на хостинге REG.RU. Однако применение некоторых директив может вызвать некие проблемы в работе сайта, я это будут пояснять.
Basic HTTP аутентификация для входа в админ-панель Joomla
Первое, что необходимо сделать для повышения безопасности сайта, причем который работает на любой CMS не только на Joomla, – это добавить дополнительную HTTP аутентификацию для входа в административную часть сайта (админ-панель). Тем самым Вы значительно усложняете действия злоумышленников, которые будут проводить брутфорс атаку на сайт, т.е. подбора пароля к учетной записи администратора сайта. Также в случае таких атак дополнительная HTTP аутентификация снизит нагрузку на сервер, так как все запросы по подбору пароля будут прерваны еще на уровне работы протокола http.
Только в этом случае, как Вы понимаете, для входа в админ-панель Вам необходимо будет два раза вводить логин и пароль, причём они должны быть разные – это очень важно!
Для того чтобы добавить Basic HTTP аутентификация на вход в админ-панель Joomla необходимо создать отдельный файл .htaccess в каталоге «administrator».
Файл должен содержать следующие директивы
AuthType Basic AuthName "Доступ запрещён!" AuthUserFile /Абсолютный_путь_к_файлу/.htpasswd Require valid-user
Где
- AuthType Basic — тип аутентификации, т.е. базовая;
- AuthName «Доступ запрещён!» – сообщение, которое будет появляться при обращении к админ-панели сайта;
- «/Абсолютный_путь_к_файлу/.htpasswd» — это абсолютный путь к файлу .htpasswd, в котором хранится в зашифрованном виде логин и пароль, которые будут использоваться для аутентификации. Сгенерировать содержимое файла можно с помощью специального сервиса — http://www.htaccesstools.com/htpasswd-generator/
- Require valid-user – директива говорит о том, что доступ разрешен только пользователям, которые предоставят логин и пароль, указанные в файле .htpasswd.
Запрет просмотра содержимого директорий
Эти и все последующие директивы мы будет писать в файле .htaccess, который расположен в корне Вашего сайта.
В данном случае сначала мы активируем RewriteEngine, а затем запрещаем просмотр содержимого директорий сайта, даже если в директории отсутствуют индексные файлы, в браузере на клиенте ничего не отобразится.
RewriteEngine On #Запрет просмотра содержимого директорий IndexIgnore * Options +FollowSymLinks All -Indexes
Запрет доступа к файлу htaccess
Доступ к файлу htaccess должен быть запрещён, поэтому мы принудительно пропишем следующую директиву
#Запрет доступа к файлу .htaccess <Files .htaccess> order allow,deny deny from all </Files>
Блокировка инструментов взлома по USER AGENT
Следующей директивой мы блокируем известные приложения по USER AGENT, которые используются для взлома сайтов, это только небольшая часть, Вы, конечно же, можете самостоятельно дополнять данный перечень. Кстати, ниже в разделе по расширенной защите представлен другой способ блокировки вредоносных приложений по USER AGENT и там указаны дополнительные юзер агенты подобных утилит.
#Блокируем инструменты взлома SetEnvIf user-agent "Indy Library" stayout=1 SetEnvIf user-agent "Wget" stayout=1 SetEnvIf user-agent "libwww-perl" stayout=1 SetEnvIf user-agent "Download Demon" stayout=1 SetEnvIf user-agent "GetRight" stayout=1 SetEnvIf user-agent "GetWeb!" stayout=1 SetEnvIf user-agent "Go!Zilla" stayout=1 SetEnvIf user-agent "Go-Ahead-Got-It" stayout=1 SetEnvIf user-agent "GrabNet" stayout=1 SetEnvIf user-agent "TurnitinBot" stayout=1 deny from env=stayout
Базовая, стандартная защита от вредоносных запросов к сайту
Здесь перечислены стандартные директивы безопасности для Joomla.
#Базовая защита RewriteCond %{QUERY_STRING} proc/self/environ [OR] RewriteCond %{QUERY_STRING} mosConfig_[a-zA-Z_]{1,21}(=|\%3D) [OR] RewriteCond %{QUERY_STRING} base64_(en|de)code[^(]*\([^)]*\) [OR] # RewriteCond %{QUERY_STRING} base64_encode\(.*\) [OR] # RewriteCond %{QUERY_STRING} base64_decode\(.*\) [OR] RewriteCond %{QUERY_STRING} (<|%3C)([^s]*s)+cript.*(>|%3E) [NC,OR] RewriteCond %{QUERY_STRING} GLOBALS(=|\[|\%[0-9A-Z]{0,2}) [OR] RewriteCond %{QUERY_STRING} _REQUEST(=|\[|\%[0-9A-Z]{0,2}) RewriteRule .* index.php [F]
Дополнительная защита от вредоносных запросов к сайту
В данном случае мы еще больше фильтруем «плохие» входящие запросы, и в случае если они попадают под фильтр, блокируем их.
#Блокируем плохие запросы RewriteCond %{REQUEST_METHOD} GET RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=http:// [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=(\.\.//?)+ [OR] RewriteCond %{QUERY_STRING} [a-zA-Z0-9_]=/([a-z0-9_.]//?)+ [NC] RewriteRule .* - [F] RewriteCond %{QUERY_STRING} \=PHP[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12} [NC] RewriteRule .* - [F]
Базовая защита от SQL инъекций
Добавляем базовую защиту от SQL инъекций
#Простая защита от SQL инъекций RewriteCond %{QUERY_STRING} concat[^\(]*\( [NC,OR] RewriteCond %{QUERY_STRING} union([^s]*s)+elect [NC,OR] RewriteCond %{QUERY_STRING} union([^a]*a)+ll([^s]*s)+elect [NC] RewriteRule .* - [F]
Запрет на визуальный просмотр расположения позиций модулей в шаблоне
Если добавить к адресу сайта в строке запроса ?tp=1, то можно посмотреть все позиции, на которых могут располагаться модули в данном шаблоне, данную возможность лучше отключать, например следующим образом
#Запрещаем визуальный просмотр расположения позиций модулей RewriteCond %{QUERY_STRING} (^|&)tmpl=(component|system) [NC] RewriteRule .* - [L] RewriteCond %{QUERY_STRING} (^|&)t(p|emplate|mpl)= [NC] RewriteRule .* - [F]
Защита системных файлов и каталогов
Для того чтобы ограничить доступ к системным файлам и каталогам, пишем следующие директивы
#Запрещаем доступ к htaccess.txt, configuration.php, configuration.php-dist и php.ini RewriteRule ^(htaccess\.txt|configuration\.php(-dist)?|php\.ini)$ - [F] #Защищаем системные файлы и папки RewriteRule ^administrator/?$ - [L] RewriteRule ^administrator/index\.(php|html?)$ - [L] RewriteRule ^administrator/index[23]\.php$ - [L] RewriteRule ^administrator/(components|modules|templates|images|plugins)/([^/]+/)*([^/.]+\.)+(jp(e?g|2)?| png|gif|bmp|css|js|swf|html?|mp(eg?|[34])|avi|wav|og[gv]|xlsx?|docx?|pptx?|zip|rar|pdf|xps|txt|7z|svg|od[tsp]| flv|mov|ico)$ - [L] RewriteRule ^administrator/ - [F] RewriteRule ^xmlrpc/(index\.php)?$ - [L] RewriteRule ^xmlrpc/ - [F] RewriteRule ^includes/js/ - [L] RewriteRule ^(cache|includes|language|libraries|logs|tmp)/ - [F]
Ограничение доступа к файлам и каталогам, которые доступны пользователю
В дополнение к защите системных файлов и папок, добавим еще и ограничение на доступ к файлам и папкам, к которым пользователь должен иметь доступ, но полный доступ, например, прямой запуск PHP скриптов, ему точно не нужен. Поэтому нужно поставить ограничение.
Однако некоторые шаблоны и расширения могут требовать прямого доступа к PHP файлам, поэтому в таких случаях у Вас могут возникнуть проблемы в работе сайта, но так делают только не очень ответственные разработчики шаблонов и расширений. Таким образом, после того как Вы пропишите данные директивы, проверяйте работоспособность сайта, и если все хорошо, то обязательно оставляйте данное ограничение.
#Защищаем файлы и папки, которые доступны пользователю RewriteRule ^(components|modules|plugins|templates)/([^/]+/)*([^/.]+\.)+(jp(e?g|2)?|png|gif|bmp|css|js| swf|html?|mp(eg?|[34])|avi|wav|og[gv]|xlsx?|docx?|pptx? |zip|rar|pdf|xps|txt|7z|svg|od[tsp]|flv|mov|ico)$ - [L] RewriteRule ^(components|modules|plugins|templates)/ - [F]
Запрет запуска сторонних PHP файлов для всего сайта
В данном случае мы запретим запускать сторонние PHP файлы для всего сайта, если, конечно, они явно не разрешены.
#Запрет запуска сторонних PHP файлов для всего сайта RewriteCond %{REQUEST_FILENAME} \.php$ RewriteCond %{REQUEST_FILENAME} !/index[23]?\.php$ RewriteCond %{REQUEST_FILENAME} !/fpa-[a-z]{2}\.php RewriteCond %{REQUEST_FILENAME} -f RewriteRule ^([^/]+/)*([^/.]+\.)+php$ - [F]
Расширенная защита от вредоносных запросов и SQL инъекций
Для более эффективной защиты от вредоносных запросов и SQL инъекций можно в htaccess прописать следующие директивы, в которых мы уже будем проверять не только строку запроса, но и тип запроса, и юзер агент приложения, с помощью которого осуществляется обращение к сайту. С помощью данных директив мы блокируем известные популярные программы-скрипты, которые используются для взлома сайтов.
Как показывает практика, обычные «нормальные» запросы к сайту блокироваться не будут.
#Расширенная защита от плохих запросов 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] #Дополнительная защита от SQL инъекций 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} \.[a-z0-9] [NC,OR] RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC] RewriteRule .* index.php [F]
Блокировка плохих поисковых ботов по USER AGENT
В случае если у Вас неоправданно возросла нагрузка на сервер, то Вы можете немного снизить эту нагрузку путем блокировки ненужных поисковых ботов. Например, после анализа логов веб-сервера Вы обнаружили, что некоторые поисковые боты слишком настойчиво посещают Ваш сайт, и если это не основные роботы поисковых систем или это роботы неизвестных Вам систем, то можете смело их блокировать следующим способом (Подробно про такую блокировку я рассказывал в материале «Как заблокировать поисковых ботов по User-Agent с помощью htaccess?»).
Также в случае выявления факта вредоносной активности с определенных IP адресов, Вы можете заблокировать эти IP адреса, т.е. доступ к Вашему сайту с этих адресов будет полностью закрыт.
#Определяем плохих поисковых ботов RewriteEngine on SetEnvIfNoCase User-Agent "DotBot/1.1" bad_bot SetEnvIfNoCase User-Agent "SemrushBot/2~bl" bad_bot SetEnvIfNoCase User-Agent "AhrefsBot/5.2" bad_bot #Блокируем IP адреса и плохие поисковые боты <Limit GET POST PUT HEAD> order allow,deny allow from all deny from env=bad_bot Deny from 1.1.1.1 </LIMIT>
Где вместо 1.1.1.1 напишите IP адрес злоумышленника, которого Вы хотите заблокировать.
Также если кому интересно, как можно очень эффективно, быстро и просто снизить нагрузку на CPU хостинга, если у Вас WordPress, можете почитать материал — «Оптимизация WordPress – быстрый способ снизить нагрузку на CPU хостинга».
Если Вы знаете ещё дополнительные способы защиты сайта на Joomla, которые можно прописать в файле htaccess, то делитесь в комментариях, спасибо!
У меня все, надеюсь, материал был Вам полезен, пока!