Авторские статьи FAQ:Безопасность web сервера

Discussion in 'Статьи' started by zl0ba, 17 Mar 2007.

  1. zl0ba

    zl0ba ПсихолоГ

    Joined:
    10 Oct 2006
    Messages:
    393
    Likes Received:
    301
    Reputations:
    52
    У меня есть хостинг (Free BSD) и на нём хоститься несколько маленьких проектов.
    На них постоянно идут (D)Dos,sql inl,xss,php-include атаки, могу ли я обезопасить
    сервер от этих атак?


    Многие из нас знакомы с распределенной атакой отказа в доступе (Distributed Denial of Servece Attack).
    Как говориться, от этой собаки спасенье нет. Или эффективной sql inj, а также xss и межсайтового скриптинга.
    К решению этой проблемы на помощь к нам приходит, знаменитый модуль mod_security!
    Download : http://www.modsecurity.org/download/modsecurity-apache-1.9.2.tar.gz


    Code:
    <IfModule mod_security.c>
    
        # On or Off движка фильтра
        SecFilterEngine On
    
        # Включения проверки правильности кодирования URL
        SecFilterCheckURLEncoding On
    
        # Использования байтов их этого диапазона
        SecFilterForceByteRange 32 126
    
        # Ведения логов для подозрительных запросов
        SecAuditEngine RelevantOnly
    
        # Имя файла лога
        SecAuditLog logs/audit_log
    
        # Вывод отладочной информации
        SecFilterDebugLog logs/modsec_debug_log
        SecFilterDebugLevel 0
    
        # Проверка POST запросов
        SecFilterScanPOST On
    
        # Запись подозрительных запросов (по дефолту пишет в лог)
        # возрат http ответа с кодом 406 
        SecFilterDefaultAction "deny,log,status:406"
    
        # Redirect user on filter match
        SecFilter xxx redirect:http://www.webkreator.com
    
        # Execute the external script on filter match
        SecFilter yyy log,exec:/home/ivanr/apache/bin/report-attack.pl
    
        # Simple filter
        SecFilter 111
        
        # Only check the QUERY_STRING variable
        SecFilterSelective QUERY_STRING 222
    
        # Only check the body of the POST request
        SecFilterSelective POST_PAYLOAD 333
    
        # Only check arguments (will work for GET and POST)
        SecFilterSelective ARGS 444
    
        # Test filter
        SecFilter "/cgi-bin/keyword"
    
        # Another test filter, will be denied with 404 but not logged
        # action supplied as a parameter overrides the default action
        SecFilter 999 "deny,nolog,status:404"
    
        # Раскритие конфигов
        SecFilter /etc/password
    
        # Чтения выше корня
        SecFilter "\.\./"
    
        # Межсайтовый скриптинг
        SecFilter "<( |\n)*script"
        SecFilter "<(.|\n)+>"
    
        # Защита от sql inj
        SecFilter "delete[[:space:]]+from"
        SecFilter "insert[[:space:]]+into"
        SecFilter "select.+from"
    
        # Атаки с использованием cookie
        SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"
    
        # Forbid file upload
        SecFilterSelective "HTTP_CONTENT_TYPE" multipart/form-data
    
        # Only watch argument p1
        SecFilterSelective "ARG_p1" 555
    
        # Watch all arguments except p1
        SecFilterSelective "ARGS|!ARG_p2" 666
    
        # Only allow our own test utility to send requests (or Mozilla)
        SecFilterSelective HTTP_USER_AGENT "!(mod_security|mozilla)"
    
        # Do not allow variables with this name
        SecFilterSelective ARGS_NAMES 777
    
        # Do now allow this variable value (names are ok)
        SecFilterSelective ARGS_VALUES 888
    
        # Скажи спаму нет!
        <Location /cgi-bin/FormMail>
            SecFilterSelective "ARG_recipient" "[email protected]$"
        </Location>
    
        # Фильтрация форматов изображения 
        <Location /fileupload.php>
            SecFilterInheritance Off
            SecFilterSelective POST_PAYLOAD "!image/(jpeg|bmp|gif)"
        </Location>
    
    </IfModule>

    Также ставим модуль mod_evasive, который поможет уменьшить активность (D)Dos атаки.
    Download: http://www.nuclearelephant.com/projects/mod_evasive/mod_evasive_1.10.1.tar.gz

    Конфигурируем модуль:

    /etc/apache2/modules.d/mod_evasive20.conf

    Code:
    <IfModule mod_evasive20.c>
                DOSHashTableSize 3097
                DOSPageCount 2
                DOSSiteCount 50
                DOSPageInterval 1
                DOSSiteInterval 1
                DOSBlockingPeriod 10
            </IfModule>

    Как мне запретить запуск программ в /tmp, на тот случай если взломщик проник на мой сервер?

    Для этого Вам надо вынести /var/tmp в отдельную файловую систему, при этом /tmp сделаем симлинком
    на /var/tmp. Идём в /etc/fstab ищем строчку для /var/tmp и в опциях добавляем noexex.
    После проделанной операции , запуск программ из /tmp будет не возможна.



    Как мне можно скрыть названия ОС и Apache от всяких (x-toolz) сканеров?

    Apache 1.3.x and 2.x :

    Для Apache 1.3.x мы лезем в src/include/httpd.h и меняем:

    Code:
    # define SERVER_BASEPRODUCT "Apache"
    # define SERVER_BASEREVISION "7.7.7"
    На :

    Code:
    # define SERVER_BASEPRODUCT "Tamagochi"
    # define SERVER_BASEREVISION "1.1.1"
    Для второй ветки Apache, идём в httpd.conf и добавляем:

    Header set Server "version not listed"

    При этом отключаем службу индексации каталогов в
    /etc/httpd/conf/httpd.conf :

    Code:
    ServerSignature Off

    Надо поменять системные переменные sysctl:

    Code:
    # sysctl net.inet.ip.random_id=1
    # sysctl net.inet.tcp.blackhole=2 
    # sysctl net.inet.udp.blackhole=1
    # sysctl -w net.inet.icmp.maskrepl=1 
    
    Далее в /etc/pf.conf вносим директивы:

    Code:
    scrub in all fragment reassemble
    pass in quick proto tcp from to
    $my_ip port $ports flags S/SA
    synproxy state block quick all
    
    Я слышал о модуле "mod_rewrite". Зачем же нужен этот модуль?
    //материал взят с http://blog.excode.ru/post13-protect_site_sql_injection_mod_rewrite.html
    Этот модуль используется в Apache и используется для разных вещей. Кто то делает ссылки более красивыми,
    но использовать его можно для разных целей. А одни используют для защиты своего сайта от sql inj.
    Рассмотрим пример с паролем администратора. Пускай переменная $idmd передаёт GET запрос
    http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5
    Нам нужно заменить адрес http://mysite.ru/script_4k55hk34ghkdf6kh7khf5.html на адрес
    http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5

    Делается это следующей строкой:
    Code:
    RewriteRule http://mysite.ru/script_([a-z0-9]*).html http://mysite.ru/script.php?idmd=$1
    Выражение ([a-z0-9]*) означает, что в данном месте может находиться
    последовательность из цифр и букв любой длины. [a-z0-9] - перечисление
    допустимых символов (в данном примере заданы диапазоны), знак * означает что таких
    символов может быть несколько. Выражение которое соответствует маске находящейся в
    скобках присваивается переменной $1 (цифра обозначает номер скобок) и вставляется
    в адрес на который будем заменять входящий адрес.В результате этой манипуляции после того
    как пользователь введет в строке адреса
    http://mysite.ru/script_4k55hk34ghkdf6kh7khf5.html он автоматически попадет на страницу
    http://mysite.ru/script.php?idmd=4k55hk34ghkdf6kh7khf5. И конечно же переменная $idmd
    будет содержать значение "4k55hk34ghkdf6kh7khf5".Теперь давайте рассмотрим, что же
    произойдет если пользователь попытается ввести
    http://mysite.ru/script_'%20or%20login='admin'#.html (%20 - тоже самое что и пробел).
    В результате этого запроса адрес попадет модулю mod_rewrite, который проанализирует его,
    т.к. выражение '%20or%20login='admin'# не подходит под маску ([a-z0-9]*), т.к.
    содержит недопустимые символы, то mod_rewrite ничего не сделает, так как будто его вообще нет,
    очевидно, что в этом случае пользователю будет возвращена ошибка 404 Page not found
    (404 страница не найдена).
    Это и есть защита. Она не идеальна и имеет минусы, но есть и плюсы.
    Главный минус - это то, что в скрипты, все же можно передать вредоносную информацию,
    но для этого придется воспользоваться методом POST, а не GET. Второй минус - mod_rewrite
    немного нагружает сервер, как и любые регулярные выражения. Главный плюс - пользователь не видит,
    как называются ваши переменные.


    Теперь с помощью mod_rewrite мы сделаем адрес на более красивый, а заодно и реализуем проверку на входные данные.
    Для того чтобы использовать модуль mod_rewrite вам необходимо создать файл .htaccess в корневом каталоге:

    Code:
    RewriteEngine on
    Options +FollowSymlinks
    RewriteBase /
    RewriteRule ^.htaccess$ - [F]
    
    Например, чтобы нам подменить адрес http://mysite.ru/blabla.html на http://mysite.ru/xek.html необходимо написать:

    Code:
    RewriteRule http://mysite.ru/blabla.html  http://mysite.ru/xek.html
     
    #1 zl0ba, 17 Mar 2007
    Last edited: 17 Mar 2007
    6 people like this.
  2. Constantine

    Constantine Elder - Старейшина

    Joined:
    24 Nov 2006
    Messages:
    798
    Likes Received:
    710
    Reputations:
    301
    Незнаю как начало, но mod_rewrite сдут с http://webscript.ru/stories/07/02/01/2099269 (просто узнал), причем линков на источники и списка используемых матерьялов нет
    А как остальное?
     
    1 person likes this.
  3. zl0ba

    zl0ba ПсихолоГ

    Joined:
    10 Oct 2006
    Messages:
    393
    Likes Received:
    301
    Reputations:
    52
    Согласен, не было времени писать свои мысли по поводу mod_rewrite. Но что же писать когда я напишу тоже самое, прость другими словами.
     
  4. Talisman

    Talisman Elder - Старейшина

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    4k55hk34ghkdf6kh7khf5
    4k2jhk34jhkjh6kh7kh33

    не сильно отличаются, неправда? :))
    ЗЫ: неуказание источников наказывается, а вот сбор инфы и ее переработка - приветствуется, хотябы поиск по ачату поюзал:
    http://forum.antichat.ru/thread27498.html - тут лучше про мод реврайт написано.
    ИМХО.
     
  5. Connor

    Connor Elder - Старейшина

    Joined:
    15 Nov 2006
    Messages:
    295
    Likes Received:
    287
    Reputations:
    38
    От народ ранимый пошел,ненужно писать чегото в чем неуверен,а если уже написал тогда слушай поправки другх и исправляйся.
     
  6. Underwit

    Underwit Banned

    Joined:
    6 Oct 2006
    Messages:
    191
    Likes Received:
    137
    Reputations:
    16
    XSS и межсайтовый скриптинг это разве не одно и тоже или я ошибаюсь???
     
    2 people like this.
  7. Constantine

    Constantine Elder - Старейшина

    Joined:
    24 Nov 2006
    Messages:
    798
    Likes Received:
    710
    Reputations:
    301
    Это одно и тоже, просто "аффтор", видимо, этот кусок перепечатывал своими словами
     
  8. Nova

    Nova Green member

    Joined:
    15 Jul 2005
    Messages:
    1,233
    Likes Received:
    420
    Reputations:
    280
    Маленькое дополнение

    Установка mod_security на apache22

    переходим в каталог [root@gw-server]cd /usr/ports/www/mod_security2

    набираем make install clean
    возможно у вас появиться такая ошибка как появилась у меня

    Code:
    [root@gw-server /usr/ports/www/mod_security2]# make install clean
    ===>  Building for mod_security2-2.1.0
    ===>  Generating apache plist
    /usr/local/build-1/libtool --silent --mode=compile cc -prefer-pic -O2 -fno-strict-aliasing -pipe    -I/usr/local/include/apache22  -I/usr/local/include/apr-1   -I/usr/local/include/apr-1 -I/usr/local/include  -c -o apache2_config.lo apache2_config.c && touch apache2_config.slo
    In file included from modsecurity.h:37,
                     from apache2_config.c:15:
    msc_pcre.h:18:18: pcre.h: No such file or directory
    apache2_config.c: In function `cmd_audit_log_relevant_status':
    apache2_config.c:583: error: `PCRE_DOTALL' undeclared (first use in this function)
    apache2_config.c:583: error: (Each undeclared identifier is reported only once
    apache2_config.c:583: error: for each function it appears in.)
    apxs:Error: Command failed with rc=65536
    .
    *** Error code 1
    
    Stop in /usr/ports/www/mod_security2.
    [root@gw-server /usr/ports/www/mod_security2]#
    для коректной установки понадобаиться добавить pcre

    переходим в /usr/ports/devel/pcre и набираем make install clean

    после того как соберёться сможем собрать наконец наш mod_security
     
    _________________________
  9. delay(0)

    delay(0) Member

    Joined:
    22 Nov 2006
    Messages:
    90
    Likes Received:
    41
    Reputations:
    6
    Ошибка... noexeC
    Также, не понятно, зачем
    Права поменять разве нельзя?
    Ещё хороший метод защиты сервера: использование chroot-окружения.
    Статья так се, если честно...
     
  10. p-range

    p-range Elder - Старейшина

    Joined:
    5 Feb 2006
    Messages:
    137
    Likes Received:
    145
    Reputations:
    118
    Во-первых.
    откуда взялась эта решетка #? здесь поидее должен быть комментарий /* или --.

    Во-вторых, методов котороые здесь описаны, недостаточно для нормальной безопасности веб-сервера.
    имхо, на faq не тянет \=
     
    #10 p-range, 10 May 2007
    Last edited: 10 May 2007
  11. nerezus

    nerezus Banned

    Joined:
    12 Aug 2004
    Messages:
    3,191
    Likes Received:
    729
    Reputations:
    266
    Замена php на питон увеличит производимость раз в 35(ну или просто в десяток раз с переходом на перл/руби).

    http://www.alrond.com/ru/2007/jan/25/rezultaty-testirovanija-6-frameworks/
     
  12. pento

    pento Elder - Старейшина

    Joined:
    3 Jul 2006
    Messages:
    126
    Likes Received:
    24
    Reputations:
    -1
    По поводу mod_security. А его кто-нибудь вообще использует?
    Просто пытаться исправлять бреши веб-приложений с помощью сервера - это неправильно.
    Так же надо добавить, что если кто захочет его использовать, то проще заюзать уже готовые, идующие в комплекте с mod_security, наборы правил (в том числе и против XSS, SQL inj, и так далее).
    Причём тут служба индексации и подпись сервера?
    А где ServerTokens?
    Code:
    #
    # ServerTokens
    # This directive configures what you return as the Server HTTP response
    # Header. The default is 'Full' which sends information about the OS-Type
    # and compiled in modules.
    # Set to one of:  Full | OS | Minor | Minimal | Major | Prod
    # where Full conveys the most information, and Prod the least.
    #
    ServerTokens Prod
    
    #
    # Optionally add a line containing the server version and virtual host
    # name to server-generated pages (internal error documents, FTP directory 
    # listings, mod_status and mod_info output etc., but not CGI generated 
    # documents or custom error documents).
    # Set to "EMail" to also include a mailto: link to the ServerAdmin.
    # Set to one of:  On | Off | EMail
    #
    ServerSignature EMail
     
    #12 pento, 13 May 2007
    Last edited: 13 May 2007