Выделенный Web-сервер на основе nginx – отличный способ повышения производительности Web-сайтов. В скорости обработки статического контента ему просто нет равных: он легко выдерживает несколько тысяч одновременных соединений и может быть легко оптимизирован и подогнан под любую конфигурацию. Однако? выступая в качестве фронт-энда для Apache, nginx оказывается наиболее уязвимым местом всей Web-инфраструктуры, поэтому безопасности nginx необходимо уделить особое внимание.
Continue Reading
Debian
Защита ssh средствами iptables
Ограничение количества подключений
Для защиты от brute force (перебора паролей), можно ограничить количество подключений на 22 порт с одного ip адреса до нескольких раз в минуту, после чего блокировать попытки подключения для данного ip.
## Создание цепочки правил sshguard # Максимум 2 новых запроса в минуту для одного ip /sbin/iptables -N sshguard # Вкл. лог по желанию Continue Reading
Ограничение доступа средствами Nginx
Небольшая заметка о том, как средствами 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
Навожу еще один простой способ обезопасить сервер от сканирования. В данном случаи будем использовать только 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 .rules exit 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 IPs in "${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 TCPPORT in "${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 UDPPORT in "${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 TCPPORT in "${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 UDPPORT in "${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 TCPPORT in "${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 UDPPORT in "${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 |
Пробуйте, может кому-то понадобится.
Пробрасывание портов на Linux маршрутизаторе
Когда-нибудь вам может потребоваться сервисы на компьютере за маршрутизатором или же вы просто хотите сделать жизнь проще, подключаясь к локальной сети из интернета. Возможно, вы захотите запустить серверы 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