Приветствую всех, кто посвящает этим строкам свое драгоценное время.В этой статье я хочу рассказать о способах оптимально настроить сервер и систему управления контентом DataLife Engine. За 4 года работы с интернет сайтами и серверами я усвоил, что безопасность превыше удобства и что ей нужно уделять внимание.
Оговорка: я не претендую на авторство чьей-либо интеллектуальной собственности! Весь материал собран на просторах интернета.
Ниже будут описаны действия, которые помогут распределить нагрузку сервера, обезопасить его от DOS атак, ограничить доступ к FTP протоколу и правильно сконфигурировать систему DataLife Engine.
Защита и конфигурация вашего сервера.
1. Настройка конфигурации сервера с использованием связки front-end Nginx к Apache.Преимущества подобной схемы можно понять на небольшом примере. Представьте себе, что вашему веб серверу Apache необходимо обслужить порядка 1000 запросов одновременно, причем многие из них подключены к медленным каналам связи. В случае использования Apache мы получим 1000 процессов httpd, на каждый из которых будет выделена оперативная память, и эта память не освободится до тех пор, пока клиент не получит запрошенный контент.
В случае схемы с применением front-end сервера получим значительную экономию ресурсов за счет того, что после поступления запроса, nginx передает запрос Apache и быстро получает ответ. В итоге, Apache, после того как отдал ответ nginx, освобождает память. Далее с клиентом взаимодействует веб-сервер nginx, который как раз и написан для раздачи статического контента большому количеству клиентов при незначительном потреблении системных ресурсов.
Для корректной работы нашей связки понадобиться модуль
mod_rpaf для Apache. Возникает такая необходимость по следующей причине: запросы к Apache приходят с IP-адреса, на котором работает nginx, соответственно, в журнальных файлах Apache будет фигурировать только IP-адрес nginx сервера. Также без использования данного модуля начнутся проблемы со скриптами, в которых используется IP-адрес посетителя и перестанет правильно работать механизм ограничения доступа по IP-адресам с помощью .htaccess.
Установка NGINX на популярные ОС.Red Hat Enterprise Linux 4 / CentOS 4Для установки nginx в этих операционных системах вам необходимо подключить дополнительный репозиторий пакетов.
Red Hat Enterprise Linux 5 / CentOS 5Для установки nginx в этих операционных системах вам необходимо подключить дополнительный репозиторий пакетов EPEL.
ASPLinux Server 5 /
Fedoranginx присутствует в стандартной поставке дистрибутива.
Если репозитории подключены или просто не требуются, выполняем:
yum install nginxУстановка Apache.Чтобы установить Apache веб-сервер достаточно выполнить:
yum install httpdУстановка mod_rpaf.1. Устанавливаем пакет httpd-devel:
yum -y install httpd-devel
2. Скачиваем и устанавливаем mod_rpaf:
Входим в директорию /usr/local/src
cd /usr/local/src
Загружаем в /usr/local/src файл mod_rpaf-0.6.tar.gz
wget http://stderr.net/apache/rpaf/download/mod_rpaf-0.6.tar.gz
Распаковываем mod_rpaf-0.6.tar.gz
tar xzf mod_rpaf-0.6.tar.gz
Переходим в каталог в который распаковали
cd mod_rpaf-0.6
Ставим модуль в систему
apxs -i -c -n mod_rpaf-2.0.so mod_rpaf-2.0.c
3. Далее нужно создать файл конфигурации mod_rpaf - /etc/httpd/conf.d/rpaf.conf и добавить в него следующие строки:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
RPAFenable On
RPAFproxy_ips 127.0.0.1 xx.xx.xx.xx yy.yy.yy.yy
где xx.xx.xx.xx и yy.yy.yy.yy - IP адреса вашего сервера. Если на сервере более двух IP, добавьте их по той же аналогии.
Далее требуется перезапустить Apache, для этого выполните команду
service httpd restart
4. В nginx внутри блока http {} должны быть указаны строки:
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
Если данные строки указаны, дописывать не нужно.
Если модифицируется nginx.conf, следует перезапустить nginx:
/etc/init.d/nginx stop
/etc/init.d/nginx start
5. Как проверить, работает ли установленный модуль?
На любом из доменов, которые расположены на Вашем сервере, разместите файл test.php с содержимым:
"<? echo $_SERVER['REMOTE_ADDR']; ?>"
Далее зайдите по ссылке
http://domain.com/test.php, где domain.tcom - имя вашего домена. Если отображается IP, отличающийся от IP вашего сервера, модуль работает корректно.
Настройка NGINX.Ниже приведен конфигурационный файл nginx для работы в качестве front-end сервера. Подразумевается, что nginx будет работать на всех интерфейсах на 80 порту, а Apache будет работать на интерфейсе 127.0.0.1 и порту 8080. Сохраните данный конфигурационный файл в каталоге /etc/nginx/ с именем nginx.conf.
user nginx;
worker_processes 10;
error_log /var/log/nginx/error.log debug;
pid /var/run/nginx.pid;
events {
worker_connections 20000;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] $status '
'"$request" $body_bytes_sent "$http_referer" '
'"$http_user_agent" "http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
send_timeout 900;
server_tokens off;
server {
listen 80;
server_name _;
server_name_in_redirect off;
access_log /var/log/nginx/host.access.log main;
location / {
proxy_pass http://127.0.0.1:8080/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 10m;
}
}
}
Настройка Apache.В файле конфигурации Apache /etc/httpd/conf/httpd.conf найдите строку:
Listen:80
и замените ее строкой:
Listen 127.0.0.1:8080
Настройка mod_rpaf.Добавьте модуль mod_rpaf в файл конфигурации Apache. Для этого в файл /etc/httpd/conf/httpd.conf добавьте следующую строку:
LoadModule rpaf_module modules/mod_rpaf-2.0.so
Затем в этот же файл добавьте строки:
RPAFenable On
RPAFsethostname Off
RPAFproxy_ips 127.0.0.1 192.168.0.1
RPAFheader X-Real-IP
Вместо 192.168.0.1 необходимо поставить IP-адрес сервера.
2. Конфигурация сервера для защиты от dos-атак.Включаем в nginx кеширование главной страницы для тех у кого нет cookie.
Добавляем ограничения в nginx.conf:
limit_req_zone $binary_remote_addr zone=two:20m rate=2r/s;
server{
location / {
limit_req zone=two burst=5;
}
}
}
Пользуемся tail и awk:
tail -f /var/log/nginx/access.log | grep GET / HTTP/1.1" 503
Подключаем лог:
tail -f /var/log/nginx/access.log | grep GET / HTTP/1.1" 503 | awk '{ print $1 }'
Получаем IP машин:
iptables -A INPUT -p tcp -j DROP -s $IP
Заносим IP в Firewall:
tail -f /var/log/nginx/access.log | grep GET / HTTP/1.1" 503 | awk '{ print $1 }' | xargs -t -l iptables -A INPUT -p tcp -j DROP –s
Теперь установим connlimit для iptables чтобы ограничить подключения ботов. В правилах ставим разрешение на 5 подключений с одного IP, и 25 из подсети класса С.
DDOS атака с 16000 ботов - Load average : 1.4 1.9 2.0
Ограничение доступа по FTPДля этого нам понадобитсья файл .ftpaccess. Он поможет запретить или разрешить доступ по FTP с указанных IP адресов. Кто-то может задать вопрос: «У меня динамический IP, как мне правильно использовать .ftpaccess?» Ответ я подразумеваю только такой: «Если вам нужна данная надстройка безопасности - приобретите у вашего провайдера статический IP. Много денег у вас за него не попросят.»
Чтобы создать .ftpacces файл нам понадобиться SSH доступ. Можно воспользоваться программой winscp. Настроек в .ftpaccess может быть большое множество, однако нас интересует только один параметр. Прописав эти строки в файле вы закроете полностью доступ от всех:
<Limit ALL>
Deny from all
</Limit>
После написанного выше, никто не сможет зайти на ФТП. Для добавления разрешения доступа определенному IP нужно указать следующие параметры:
<Limit ALL>
Allow from 127.0.0.1
Deny from all
</Limit>
Естественно адрес 127.0.0.1 указан для примера и его нужно заменить на собственный.
Важно! Лучше всего запретить доступ по FTP абсолютно всем и подклчаться только по SSH.
Защита системы управления контентом DataLife Engine.1. Установите и настройте ZEOS Antivirus.2. Переименуйте файл админпанели и сделайте фейк по старому адресу (www.sait.com/admin.php) при переходе на который пользователь будет заблокирован посредством запрета его ip в .htaccess.Переименовали? Теперь создаем в корневом каталоге файл ip.txt для хранения ip-адресов. Даем ему и .htaccess права CHMOD – 777.
Создаем файл admin.php следующего содержания:
<?php
$ip = getenv ("REMOTE_ADDR");
$log = fopen("ip.txt", "a+");
fwrite($log, "// ".$ip."\n");
fclose($log);
$f = fopen($_SERVER['DOCUMENT_ROOT'] . '/.htaccess', "a");
fwrite($f, "\ndeny from " . $ip);
fclose($f);
echo <<<HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=1251" />
<meta name="author" content="admin" />
<title>Админ панель DataLife Engine</title>
</head>
<body bgcolor="black" text="white">
<center><img src="тут изображение выводимое на странице"></center>
<center><h1>Текст, например: Твой ip в логах, я найду тебя!</h1></center>
</body>
</html>
HTML;
echo "<center><h1>Бойся, ничтожество, ха-ха!</center></h1>"
?>
3. Добавим дополнительную аутентификацию в админцентре.Необходимо придумать еще один логин и пароль (не используйте данные вашего административного аккаунта). Второй логин и пароль должен в корне отличаться от первого. Определились? Отлично! Теперь зашифруем наш пароль в md5 (сделать это можно на сайте md5encryption.com).
Далее открываем admin.php (вспомните, ранее мы его переименовали и, по этому, если вы назвали его superadmin.php - вам необходимо открывать именно этот его) и после строки:
<?php
добавляем:
$login="вписываем придуманный логин";
$password="и сгенерированный пароль в md5";
if (!isset($_SERVER['PHP_AUTH_USER']) || $_SERVER['PHP_AUTH_USER']!==$login ||
md5($_SERVER['PHP_AUTH_PW'])!==$password) {
header('WWW-Authenticate: Basic realm="Admin Panel"');
header('HTTP/1.0 401 Unauthorized');
exit("Access Denied");}
4. Отключим неиспользуемые системой функции php.Для поиска файла php.ini создаем файл phpinfo.php с текстом:
<? phpinfo() ?>
После поиска обязательно удалить phpinfo.php!
Далее открываем php.ini и выключаем следующие функции:
disable_functions = allow_url_fopen, eval, exec, system, passthru, scandir, popen, shell_exec, proc_open, proc_close, proc_nice, get_current_user, getmyuid, posix_getpwuid, apache_get_modules, virtual, posix_getgrgid, getmyinode, fileowner, filegroup, getmypid, apache_get_version, apache_getenv, apache_note, apache_setenv, disk_free_space, diskfreespace, dl, ini_restore, openlog, syslog, highlight_file, show_source, symlink, disk_total_space, ini_get_all, get_current_user, posix_uname, allow_url_fopen
5. Создаем фильтрацию GET и POST запросов, предотвращаем инъекции в БД и получение из нее данных.Создаем файл .php с произвольным названием и следующим содержимым:
<?php
//поставить еденицу если хотите включить отладку запросов
$debug = 0;
$bag_req = array("select", "eval", "echo", "UPDATE", "LIMIT", "INSERT", "INTO", "union", "CONCAT", "INFORMATION_SCHEMA", "OUTFILE", "DUMPFILE", "LOAD_FILE", "BENCHMARK", "SUBSTRING", "ASCII", "CHAR", "database", "HEX", "\\.\\/", "%00", "\\.htaccess", "config\\.php", "document\\.cookie");
$request = serialize($_GET);
$urequest = urldecode($request);
$brequest = base64_decode($request);
if($_GET)
{
foreach ($bag_req as $key => $value) {
if(preg_match("/$value/i", $request) || preg_match("/$value/i", $urequest) || preg_match("/$value/i", $brequest))
{
if($debug == "1") $do_debug = "<br>В массиве найден запрос <b>$value</b> , который блокирует правильную работу<br>$request";
die("BAD REQUEST $do_debug");
}
}
}
if($_POST)
{
$request = str_replace("selected_language", "sl", serialize($_POST));
$urequest = urldecode($request);
$brequest = base64_decode($request);
foreach ($bag_req as $key => $value) {
if(preg_match("/$value/i", $request) || preg_match("/$value/i", $urequest) || preg_match("/$value/i", $brequest))
{
if($debug == "1") $do_debug = "<br>В массиве найден запрос <b>$value</b> , который блокирует правильную работу<br>$request";
die("BAD REQUEST $do_debug");
}
}
}
?>
Сохраняем его на сервере в любом каталоге системы DLE. Открываем файл engine/classes/mysql.php и после:
<?php
if(!defined('DATALIFEENGINE'))
{
die("Hacking attempt!");
}
подключаем созданный файл:
include_once( ENGINE_DIR."/путь_к_файлу/название.php" );
6. Используя бесплатные компоненты к DLE обязательно узнайте мнение специалиста о их надежности.При возникновении вопросов обращайтесь к поисковым системам - весь материал в свободном доступе!
Есть что добавить? Милости прошу к обсуждению!
Удачи вам и вашим проектам!
Замечание модератора:
Эта тема была закрыта автоматически ввиду отсутствия активности в ней на протяжении 100+ дней.
Если Вы считаете ее актуальной и хотите оставить сообщение, то воспользуйтесь кнопкой
или обратитесь к любому из модераторов.
|