Выделенный Web-сервер на основе nginx – отличный способ повышения производительности Web-сайтов. В скорости обработки статического контента ему просто нет равных: он легко выдерживает несколько тысяч одновременных соединений и может быть легко оптимизирован и подогнан под любую конфигурацию. Однако? выступая в качестве фронт-энда для Apache, nginx оказывается наиболее уязвимым местом всей Web-инфраструктуры, поэтому безопасности nginx необходимо уделить особое внимание.
Continue Reading

Ограничение количества подключений

Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.

## Создание цепочки правил sshguard
# Максимум 2 новых запроса в минуту для одного ip
/sbin/iptables -N sshguard
# Вкл. лог по желанию
 Continue Reading 

Небольшая заметка о том, как средствами Nginx-а закрыть доступ к файлам/папке по паролю. В nginx-е это решение не менее элегантно, чем в apache, а может и еще лучше, кому как нравится.

В конфигурационном файле, в папке, которую хотим закрыть надо только указать файл, где хранятся пароли.
Вот два примера для закрытия папки с файлами:

        location ^~ /files/ {
            root   /path/to/server;
            autoindex    on;
            autoindex_exact_size  off;
            auth_basic "Hello, please login";
            auth_basic_user_file /usr/nginx/passwords;
            access_log   /usr/nginx/logs/files.log   download;
        }

и админовской части c дополнительным ограничением по IP:

        location ^~ /admin/ {
            fastcgi_pass unix:/home/project/server.sock;
            include  conf/fastcgi.conf;
            allow 11.11.0.0/16;
            allow 22.22.22.22;
            deny all;
            auth_basic "Hello, Admin, please login";
            auth_basic_user_file /usr/nginx/adminpassword;
            access_log   /usr/nginx/logs/admin.log  main;
        }

Добавить пользователя можно с помощью стандартной утилиты от apache:

htpasswd -b passwords NewUser NewPassword

В файле запись с зашифрованным паролем имеет вид:

NewUser:P47ghZ4kloG78: Your Can Comment Here

Защиту от перебора паролей можно организовать одновременно двумя методами, основанными на использовании iptables:

  • Блокирование IP на время, если количество запросов в секунду превышает какое-либо разумное количество
  • Вести лог неудачных попыток подбора пароля и скриптом раз в минуту проверять лог и заносить IP адреса в iptables

Для первого варианта достаточно создать правила:

iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --set
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -m state --state NEW
            -m recent --name bhttp --update --seconds 120
            --hitcount 360 -j DROP
iptables -A INPUT -p tcp --syn --dport 80 -i eth0 -j ACCEPT

Можно вместо DROP использовать TARPIT, чтобы усложнить жизнь ломателям 🙂

Для второго варианта надо добавить в конфиг:

        location /401.html {
            root   /usr/nginx;
            access_log   /usr/nginx/logs/denied.log  error401;
        }

Формат error401, у меня например такой:

log_format error401  '$remote_addr - $remote_user [$time_local] '
                     '$status "$request"';

Теперь все неправильные попытки будут записываться в отдельный лог, который мы можем обрабатывать по cron-у:

*/1 * * * * root /usr/nginx/parser401.pl >/dev/null 2>&1

например, таким скриптом: parser401.pl Скрипт проверяет лог, и если обнаруживает больше 4-х попыток неправильного набора пароля, блокирует этот IP.

Навожу еще один простой способ обезопасить сервер от сканирования. В данном случаи будем использовать только iptables. В зависимости от того, какие у нас работают сервисы на серверах, набор портов будет разный. Для начала создадим свою цепочку, в которую добавим список IP адресов, которым позволено/запрещено иметь доступ к списку портов.

1
2
3
4
root@srv-19:~# iptables -N antiscan
root@srv-19:~# iptables -A antiscan -s 195.34.25.11 -j ACCEPT
root@srv-19:~# iptables -A antiscan -s 195.34.25.12 -j ACCEPT
root@srv-19:~# iptables -A antiscan -j DROP

В данном случае разрешено доступ только для двух IP-адресов. Теперь нужно добавить в цепочку INPUT список портов, к которым ограничивается доступ. Для начала добавим TCP порты.

1
2
3
4
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 25 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 82 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 3306 -j antiscan
root@srv-19:~# iptables -I INPUT -m tcp -p tcp --dport 8083 -j antiscan

Далее добавим UDP порты.

1
2
root@srv-19:~# iptables -I INPUT -m udp -p udp --dport 111 -j antiscan
root@srv-19:~# iptables -I INPUT -m udp -p udp --dport 161 -j antiscan

Теперь можно добавить правила в автозагрузку.

1
2
3
4
5
root@srv-19:~# iptables-save > /etc/iptables.rules
root@srv-19:~# cat > /etc/network/if-pre-up.d/iptablesup << EOF
#!/bin/bash
iptables-restore </etc/iptables.rulesexit 0 EOF
root@srv-19:~# chmod +x /etc/network/if-pre-up.d/iptablesup

Можно написать маленький скрипт, который добавлять все нужные цепочки и правила.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
root@srv-19:~# cat antiscan.sh
#!/bin/bash
WHITEIP=( `cat /opt/cdn/utils/iptables/whitelist.ip` )
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
if [ ! -f/opt/cdn/utils/iptables/whitelist.ip ]
then
        echo "Please add white list /opt/cdn/utils/iptables/whitelist.ip"
        exit 1
fi
iptables -N antiscan &&echo "Antiscan chain was added" ||echo "Failed to create Antiscan chain"
echo "============== Adding white list ==============="
for IPsin "${WHITEIP[@]}"
do
        iptables -A antiscan -s ${IPs} -j ACCEPT &&echo "${IPs} was added to Antiscan chain" ||echo "Failed to add ${IPs} to Antiscan chain"
done
echo "============== Adding TCP ports ==============="
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -I INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Adding Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to add Antiscan chain for ${TCPPORT} port to INPUT chain"
done
echo "============== Adding UDP ports ==============="
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -I INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Adding Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to add Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -A antiscan -j DROP &&echo "Adding DROP rule for Antiscan chain" ||echo "Failed to add DROP rule to Antiscan chain"
echo "================= ADD rules to autostart ==================="
iptables-save |grep -v fail2ban >/etc/iptables.rules
cat >/etc/network/if-pre-up.d/iptablesup << EOF
#!/bin/bash
iptables-restore </etc/iptables.rules
exit 0
EOF
chmod +x/etc/network/if-pre-up.d/iptablesup
echo "================= DONE ==================="
exit 0

/opt/cdn/utils/iptables/whitelist.ip – это список IP адресов, которые имеют доступ к портам.
Так же можно написать маленький скрипт для добавления нового IP в белый список.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
root@srv-19:~# cat antiscan_append.sh
#!/bin/bash
usage() {
         echo -e"nUsage: $0 IP-address"
         echo -e"Example:n $0 82.50.92.45"
         exit 1
}
if [ $# -lt 1  ]
        then
                echo "Please enter IP to add to white list"
                usage
fi
echo "============== Check if exist ========================"
iptables -C antiscan -s $1 -j ACCEPT &&echo "Already exist" &&exit 1
echo "============== Adding IP to white list ==============="
iptables -I antiscan 1 -s $1 -j ACCEPT &&echo "$1 was added to Antiscan chain" ||echo "Failed to add $1 to Antiscan chain"
echo "================= Saving rules to autostart ==================="
iptables-save |grep -v fail2ban >/etc/iptables.rules
echo "================= DONE ==================="
exit 0

Так же можно написать маленький скрипт для добавления нового IP в белый список.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@srv-19:~# cat antiscan_clean.sh
#!/bin/bash
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
iptables -F antiscan &&echo "Antiscan chain was flushed" ||echo "Failed to flush antiscan chain"
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -D INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Delete Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${TCPPORT} port to INPUT chain"
done
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -D INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Delete Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -X antiscan &&echo "Deleting antiscan chain" ||echo "Failed to delete antiscan chain"
echo "================= Deleting autostart rules ==================="
rm -f/etc/iptables.rules &&echo "Deleting /etc/iptables.rules" ||echo "Failed to delete /etc/iptables.rules"
rm -f/etc/network/if-pre-up.d/iptablesup  &&echo "Deleting /etc/network/if-pre-up.d/iptablesup" ||echo "Failed to delete /etc/network/if-pre-up.d/iptablesup"
exit 0

Также добавим скрипт для удаления и чистки всех правил

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@srv-19:~# cat antiscan_clean.sh
#!/bin/bash
PORTS_TCP=(
25
82
3306
8083 )
PORTS_UDP=(
111
161 )
iptables -F antiscan &&echo "Antiscan chain was flushed" ||echo "Failed to flush antiscan chain"
for TCPPORTin "${PORTS_TCP[@]}"
do
        iptables -D INPUT -m tcp -p tcp --dport ${TCPPORT} -j antiscan &&echo "Delete Antiscan chain for ${TCPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${TCPPORT} port to INPUT chain"
done
for UDPPORTin "${PORTS_UDP[@]}"
do
        iptables -D INPUT -m udp -p udp --dport ${UDPPORT} -j antiscan &&echo "Delete Antiscan chain for ${UDPPORT} port to INPUT chain" ||echo "Failed to del Antiscan chain for ${UDPPORT} port to INPUT chain"
done
iptables -X antiscan &&echo "Deleting antiscan chain" ||echo "Failed to delete antiscan chain"
echo "================= Deleting autostart rules ==================="
rm -f/etc/iptables.rules &&echo "Deleting /etc/iptables.rules" ||echo "Failed to delete /etc/iptables.rules"
rm -f/etc/network/if-pre-up.d/iptablesup  &&echo "Deleting /etc/network/if-pre-up.d/iptablesup" ||echo "Failed to delete /etc/network/if-pre-up.d/iptablesup"
exit 0

Ну и маленький скрипт для удаления определенного IP со списка позволенных.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@srv-19:~# cat antiscan_del_ip.sh
#!/bin/bash
echo "============== Check if exist ========================"
iptables -C antiscan -s $1 -j ACCEPT
if [ $? -eq 0 ]
then
        echo "Entry exist"
        echo "Deleting..."
        iptables -D antiscan -s $1 -j ACCEPT &&echo "$1 was deleted from Antiscan chain" ||echo "Failed to delete $1 from Antiscan chain"
        echo "================= Saving rules to autostart ==================="
        iptables-save |grep -v fail2ban >/etc/iptables.rules
        echo "================= DONE ==================="
        exit 0
else
        echo "Entry doesn't exist"
        exit 1
fi

Пробуйте, может кому-то понадобится.

Когда-нибудь вам может потребоваться сервисы на компьютере за маршрутизатором или же вы просто хотите сделать жизнь проще, подключаясь к локальной сети из интернета. Возможно, вы захотите запустить серверы FTP, HTTP, SSH или VNC на одном или нескольких компьютерах за вашим маршрутизатором и подключаться к ним всем. Есть только одно ограничение — вы можете запускать только по одному сервису на компьютере на каждый порт. Например, невозможно настроить три FTP-сервера за вашим маршрутизатором и попробовать подключиться ко всем трем из интернета через порт 21; только один из них будет на порту 21, когда как остальные будут использовать, скажем, порты 123 и 567.

Все правила проброса портов имеют вид iptables -t nat -A PREROUTING [-p протокол] --dport [внешний порт маршрутизатора] -i ${WAN} -j DNAT --to [IP-адрес/порт для проброса]. К сожалению, iptables не принимает имена узлов при пробросе портов. Если вы пробрасываете внешний порт на порт с тем же номером для внутреннего компьютера, то вы можете опустить порт назначения. См. страницу помощи iptables (8) для большей информации.

Листинг 6.1: Выполнение команд iptables

Скопируйте и вставьте для примера...
# export LAN=eth0
# export WAN=eth1

Пробрасывание порта 2 на ssh внутреннего хоста
# iptables -t nat -A PREROUTING -p tcp --dport 2 -i ${WAN} -j DNAT --to 192.168.0.2:22

Пробрасывание FTP-трафика на внутренний компьютер
# iptables -t nat -A PREROUTING -p tcp --dport 21 -i ${WAN} -j DNAT --to 192.168.0.56

Пробрасывание HTTP-трафика на внутренний компьютер
# iptables -t nat -A PREROUTING -p tcp --dport 80 -i ${WAN} -j DNAT --to 192.168.0.56

Пробрасывание VNC-трафика для внутренних компьютеров
# iptables -t nat -I PREROUTING -p tcp --dport 5900 -i ${WAN} -j DNAT --to 192.168.0.2
# iptables -t nat -I PREROUTING -p tcp --dport 5901 -i ${WAN} -j DNAT --to 192.168.0.3:5900
Теперь, если вам необходимо подключиться к VNC по адресу 192.168.0.3, то просто добавьте «:1» к имени маршрутизатора

Проброс трафика Bittorrent
# iptables -t nat -A PREROUTING -p tcp --dport 6881:6889 -i ${WAN} -j DNAT --to 192.168.0.2

Проброс трафика eDonkey/eMule
# iptables -t nat -A PREROUTING -p tcp --dport 4662 -i ${WAN} -j DNAT --to 192.168.0.55

Поддержка Game Cube Warp Pipe
# iptables -t nat -A PREROUTING -p udp --dport 4000 -i ${WAN} -j DNAT --to 192.168.0.56

Поддержка Playstation 2 Online
# iptables -t nat -A PREROUTING -p tcp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11
# iptables -t nat -A PREROUTING -p udp --dport 10070:10080 -i ${WAN} -j DNAT --to 192.168.0.11

Xbox Live
# iptables -t nat -A PREROUTING -p tcp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69
# iptables -t nat -A PREROUTING -p udp --dport 3074 -i ${WAN} -j DNAT --to 192.168.0.69
# iptables -t nat -A PREROUTING -p udp --dport 88 -i ${WAN} -j DNAT --to 192.168.0.69

В данной статье хотелось бы собрать некоторые виды атак на сервера и средства защиты сервера от хакеров. На тему безопасности написано немерено книг и статей. Упор данной статьи сделан на базовые ошибки администраторов и решения по их устранению. После прочтения этой статьи и проверки собственного сервера администратор так же не сможет спать спокойно, он сможет только сказать я сдал «кандидатский минимум».
Continue Reading