Защита от подбора пароля по SSH силами IPTABLES

Модератор: padonki

Ответить
Аватара пользователя
Padonak
padonki
Сообщения: 3842
Зарегистрирован: 14 авг 2006, 20:43
Контактная информация:

Защита от подбора пароля по SSH силами IPTABLES

Сообщение Padonak »

Сей код для того, чтоб не дать возможности подключиться на 22 порт по SSH боле 4 раз за последнюю минуту. Остальные коннекты будут обрываться .
Просто скопировать этот код в командную строку и он сам всё сделает. Если побаловались фаерволом - то идёт проверка каждые три часа, если нет правил, то заново применяцца правила.

Код: Выделить всё

#!/bin/bash
mkdir /root/bin
touch /root/bin/ssh_brutforce.sh
chmod +x /root/bin/ssh_brutforce.sh
touch /root/bin/ssh.sh
chmod +x /root/bin/ssh.sh

cat <<EOCONFIG > /root/bin/ssh_brutforce.sh

#!/bin/sh
iptables -t filter -A INPUT -p tcp --destination-port 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -t filter -A INPUT -p tcp --destination-port 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_BRUTFORCE: "
iptables -t filter -A INPUT -p tcp --destination-port 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

EOCONFIG

cat <<EOCONFIG >> /etc/crontab

# ssh brutforce
* */3   * * * root /root/bin/ssh.sh > /dev/null 2>&1
EOCONFIG

cat <<EOCONFIG > /root/bin/ssh.sh

#!/bin/bash
ssh=`iptables -n -L | grep SSH_BRUTFORCE | awk '{print $27}'`

        if [ -z "$ssh" ];  then
        cd /root/bin && ./ssh_brutforce.sh
                fi

exit
EOCONFIG


Вложения
ssh_brutforce.rar
(280 байт) 72 скачивания
ssh.rar
(234 байт) 69 скачиваний
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Изображение
Аватара пользователя
Padonak
padonki
Сообщения: 3842
Зарегистрирован: 14 авг 2006, 20:43
Контактная информация:

Re: Защита от подбора пароля по SSH силами IPTABLES

Сообщение Padonak »

Код: Выделить всё

#!/bin/bash
#
# ssh_protect.sh — защита SSH от брутфорса через iptables + module recent
#
# Идемпотентный: если правила уже стоят — тихо выходит.
# Рассчитан на запуск из /etc/cron.d раз в 15 минут.
#
# Использование:
#   ./ssh_protect.sh          — поставить правила (если их нет)
#   ./ssh_protect.sh status   — показать текущие правила
#   ./ssh_protect.sh remove   — удалить правила
#

set -euo pipefail

IPTABLES="/sbin/iptables"

PORT="22"
SECONDS_WINDOW="60"
HITCOUNT="4"
LOG_PREFIX="SSH_BRUTFORCE: "

require_root() {
    [ "$(id -u)" -eq 0 ] || { echo "Запускать от root." >&2; exit 1; }
}

require_iptables() {
    [ -x "$IPTABLES" ] || { echo "Не найден $IPTABLES" >&2; exit 1; }
}

rules_present() {
    "$IPTABLES" -n -L INPUT 2>/dev/null | grep -q "$LOG_PREFIX"
}

install_rules() {
    if rules_present; then
        exit 0    # тихо — это норма для cron
    fi

    "$IPTABLES" -I INPUT 1 -p tcp --destination-port "$PORT" \
        -m state --state NEW \
        -m recent --set --name SSH \
        -j ACCEPT

    "$IPTABLES" -I INPUT 2 -p tcp --destination-port "$PORT" \
        -m recent --update --seconds "$SECONDS_WINDOW" --hitcount "$HITCOUNT" \
        --rttl --name SSH \
        -j LOG --log-prefix "$LOG_PREFIX"

    "$IPTABLES" -I INPUT 3 -p tcp --destination-port "$PORT" \
        -m recent --update --seconds "$SECONDS_WINDOW" --hitcount "$HITCOUNT" \
        --rttl --name SSH \
        -j DROP

    logger -t ssh_protect "Установлены правила защиты SSH от брутфорса"
}

remove_rules() {
    if ! rules_present; then
        echo "Правил SSH_BRUTFORCE нет."
        return 0
    fi

    echo "Удаляю правила..."

    while rules_present; do
        num=$("$IPTABLES" -n -L INPUT --line-numbers \
              | grep "$LOG_PREFIX" | head -n1 | awk '{print $1}')
        [ -n "$num" ] || break
        "$IPTABLES" -D INPUT "$num" 2>/dev/null || true
        "$IPTABLES" -D INPUT "$num" 2>/dev/null || true
        "$IPTABLES" -D INPUT "$num" 2>/dev/null || true
    done

    logger -t ssh_protect "Правила защиты SSH удалены"
    echo "Готово."
}

show_status() {
    echo "=== INPUT ==="
    "$IPTABLES" -n -L INPUT --line-numbers 2>/dev/null | head -n 20
}

main() {
    require_root
    require_iptables

    case "${1:-install}" in
        install|"") install_rules ;;
        remove)     remove_rules ;;
        status)     show_status ;;
        *)
            echo "Использование: $0 [install|remove|status]" >&2
            exit 1
            ;;
    esac
}

main "$@"

Код: Выделить всё

/etc/cron.d/ssh_protect

Код: Выделить всё

# Защита SSH от брутфорса — проверка и восстановление правил iptables
*/15 * * * * root /root/bin/ssh_protect.sh
Установка одной командой

Код: Выделить всё

# 1. Скрипт
vim /root/bin/ssh_protect.sh
chmod +x /root/bin/ssh_protect.sh

# 2. Поставить правила сразу
/root/bin/ssh_protect.sh

# 3. Cron-задача
cat > /etc/cron.d/ssh_protect <<'EOF'
# Защита SSH от брутфорса — проверка и восстановление правил iptables
*/15 * * * * root /root/bin/ssh_protect.sh
EOF
chmod 644 /etc/cron.d/ssh_protect

# 4. Проверка
/root/bin/ssh_protect.sh status
cat /etc/cron.d/ssh_protect
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Изображение
Ответить