Перейти к содержанию
Авторизация  

Как защитить WEB сервер под управлением Windows 2003


Описание

Защита WEB сервера.

Стояла задача защитить Web сервер под управлением windows 2003. Как всем известно сервер защищён тогда когда на нём закрыты все возможные порты. И стучать некуда и ломать нечего. Естественно сервер должен был иметь 80 порт открытым.

 

Схема была следующей. Сервер имел отдельный порт например 2754 на который приходили данные в виде ключа доступа сгенерированного по определённым правилам и команда для управления портами. По сути сервер и в рабочем режиме имел два открытых порта: 80 и 2754.

 

Для реализации данной схемы в настройках Apache, в файле httpd.conf было добавлено несколько опций.

 

# port listening

Listen 2754

 

#Vhost on 2754 port

 

DocumentRoot c:\www\portcontroller

 

 

Для любопытных в файле c:\www\portcontroller\.htaccess было добавлено:

 

Options -Indexes

order deny allow

Deny from all

Allow from 10.100.10.123

 

IP 10.100.10.123 это ip с которого приходили наши команды на открытие портов.

 

Далее Был написан скрипт c:\www\portcontroller\portctl.php

 

date_default_timezone_set("Europe/Kiev");

$fm = fopen("portcontroller.log","a");

$fdate = date("d-m-Y H:i:s");

 

if(empty($_GET['key'])){

fpots($fm,$fdate."ALARM!!!!Open Port without SpecialKey!!|\n");

exit();

} else {

 

$_date = date("Y:m:d");

$_date = md5($_date); // - Ключ по дате

$key_val = md5($_date."a1dc248dd2d814c73dw82f99d384f55"); // - усложнение ключа

 

if($key_val === $_GET['key']){

 

$response .= "Server PortController 0.0.1 |";

$response .= "Wellcome! |";

$command = base64_decode($_GET['command']);

 

if($command == "OpenPortPlease"){

fputs($fm,$fdate."Open ports |\n");

exec("netsh firewall add portopening TCP 413 ENABLE",$exec_output);

exec("netsh firewall set portopening protocol=ALL port=445 mode=ENABLE",$exec_output);

exec("netsh firewall add portopening TCP 3306 ENABLE",$exec_output);

exec("netsh firewall set portopening protocol=ALL port=3389 mode=ENABLE",$exec_output);

}

 

if($command == "ClosePortPlease"){

fputs($fm,$fdate."Close ports |\n");

exec("netsh firewall delete portopening TCP 413",$exec_output);

exec("netsh firewall set portopening protocol=ALL port=445 mode=DISABLE",$exec_output);

exec("netsh firewall delete portopening TCP 3306",$exec_output);

exec("netsh firewall set portopening protocol=ALL port=3389 mode=DISABLE",$exec_output);

}

 

if($command != "GetStatus") {

$limit = 21;

} else {

$limit = 13;

}

 

 

$response .= "|| Ports: ||";

 

exec("netsh firewall show state",$exec_output);

$x=0;

foreach($exec_output as $str){

$x++;

if($x > $limit) $response .= $str."|";

 

}

 

$response = base64_encode($response);

print $response;

 

 

} else {

exit();

fputs($fm,$fdate."Alarm!!! Open port with wring SpecialKey!|\n");

}

}

 

 

Ключ генерируется по дате конечно можно его генерировать как угодно, но было выбрано такое решение. Далее $command = base64_decode($_GET['command']); приходила команда с клиента запрашивающая открывать порты или закрывать. А вот закрытие портов или открытие происходило при помощи утилиты NETSH exec("netsh firewall add portopening TCP 333 ENABLE",$exec_output);

Не сложно догадаться как должен был выглядеть клиент для передаче нужных параметров серверу. Он генерировал ключ доступа по дате и секретной hash сумме для усложнения кода + base64encode команду для передачи её на сервер. При валидации всех ожидаемых данных сервер открывал порты для управления. Например по RDP или простой SMB. После окончания работы с сервером надо было не забывать закрывать порты.

 

Также средствами Windows фаервола было отключено ICMP. Для того чтобы если кто то захочет пропинговать ресурс не видел ответов. Тупая но подлянка.Далее на админку сайта было добавлен .htpassword авторизация:

 

В файл .htaccess

 

AuthType Basic

AuthName "WhoAreYou?"

AuthUserFile c:\www\****\admin\.htpasswd

AuthName admin

require valid-user

 

и командочка

 

htpasswd -c .htpasswd admin

 

Вот мы и получили защищённый сервер. С открытым 80 портом и портом управления 2754. Защищённой админкой при помощи HtaccessAuth. Коли ваш сайт написан не дураком (не имеет дыр) то такой сервер будет долго служить.

 

 

Для того чтобы реализовать данную возможность на Linux сервере необходимо переделать команды NETSH на iptables в php скрипте



Рекомендуемые комментарии

Комментариев нет

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
×
×
  • Создать...