Скрипт автоматической установки rkhunter и chkrootkit

Модератор: padonki

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

Скрипт автоматической установки rkhunter и chkrootkit

Сообщение Padonak »

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

#!/bin/bash
# install-rootkit-checker.sh
# Установка rkhunter + chkrootkit, настройка ежедневной проверки.
# Приоритет отправки: сначала локальный Postfix/sendmail, если он работает.
# Если Postfix нет или он не отправляет — предлагается внешний SMTP (msmtp).
# Postfix НЕ трогается и НЕ ломается.
# Кодировка: UTF-8

set -e

# ========== Проверка прав root ==========
if [[ $EUID -ne 0 ]]; then
    echo "Запустите скрипт от имени root или через sudo."
    exit 1
fi

# ========== Определение дистрибутива ==========
detect_distro() {
    if [[ -f /etc/debian_version ]]; then
        echo "debian"
    elif [[ -f /etc/redhat-release ]]; then
        echo "rhel"
    else
        echo "unknown"
    fi
}

DISTRO=$(detect_distro)

echo "=========================================="
echo " Установка средств проверки руткитов"
echo "=========================================="
echo ""
echo "Обнаружена система: $DISTRO"
echo ""

# ========== Интерактивный ввод адреса ==========
read -r -p "Введите email для получения оповещений: " ALERT_EMAIL

if [[ -z "$ALERT_EMAIL" ]]; then
    echo "Ошибка: адрес email не может быть пустым."
    exit 1
fi

echo ""
echo "Адрес для оповещений: $ALERT_EMAIL"
echo ""

# ========== Установка пакетов ==========
echo "[1/6] Установка rkhunter и chkrootkit..."

if [[ "$DISTRO" == "debian" ]]; then
    apt update -qq
    apt install -y -qq rkhunter chkrootkit 2>/dev/null || true
elif [[ "$DISTRO" == "rhel" ]]; then
    yum install -y -q epel-release 2>/dev/null || dnf install -y -q epel-release 2>/dev/null || true
    yum install -y -q rkhunter chkrootkit 2>/dev/null || dnf install -y -q rkhunter chkrootkit 2>/dev/null || true
else
    echo "Неподдерживаемый дистрибутив. Установите rkhunter и chkrootkit вручную."
    exit 1
fi

echo "Установка завершена."
echo ""

# ========== Проверка локального MTA ==========
echo "[2/6] Проверка локального Postfix/sendmail..."

USE_MSMTP=0
MSMTP_CONFIG=""
LOCAL_MTA_OK=0

if command -v sendmail >/dev/null 2>&1; then
    echo "Найден sendmail: $(command -v sendmail)"

    if command -v postfix >/dev/null 2>&1; then
        POSTFIX_STATUS=$(postfix status 2>&1 || true)
        if echo "$POSTFIX_STATUS" | grep -qi "is running"; then
            echo "Postfix запущен и работает."
            LOCAL_MTA_OK=1
        else
            echo "Postfix найден, но, похоже, не запущен:"
            echo "  $POSTFIX_STATUS"
        fi
    else
        echo "Postfix не найден, но sendmail присутствует. Попробуем использовать его."
        LOCAL_MTA_OK=1
    fi
else
    echo "sendmail не найден."
fi

echo ""

# ========== Тест локального MTA ==========
if [[ "$LOCAL_MTA_OK" == "1" ]]; then
    echo "[3/6] Тест отправки через локальный MTA..."
    echo ""

    TEST_SUBJECT="[ТЕСТ] Rootkit checker — проверка локального MTA на $(hostname)"
    TEST_BODY="Это тестовое письмо для проверки локального Postfix/sendmail.

Хост: $(hostname)
Дата: $(date '+%Y-%m-%d %H:%M:%S')

Если вы получили это письмо — локальный MTA работает и будет использоваться."

    if printf 'To: %s\nSubject: %s\n\n%s\n' "$ALERT_EMAIL" "$TEST_SUBJECT" "$TEST_BODY" | sendmail -t 2>/tmp/mail-test-local.log; then
        echo "Письмо передано локальному MTA без ошибок."
        echo ""
        echo "Проверьте почту: $ALERT_EMAIL"
        read -r -p "Вы получили письмо? (y/n): " LOCAL_CONFIRM
        if [[ "$LOCAL_CONFIRM" == "y" || "$LOCAL_CONFIRM" == "Y" ]]; then
            echo "Отлично! Будем использовать локальный Postfix/sendmail."
            USE_MSMTP=0
        else
            echo ""
            echo "Письмо не дошло через локальный MTA."
            echo "Возможно, Postfix не настроен на отправку во внешний мир"
            echo "(например, relayhost не задан)."
            echo ""
            read -r -p "Настроить внешний SMTP (msmtp) как резервный вариант? (y/n): " SETUP_SMTP
            if [[ "$SETUP_SMTP" == "y" || "$SETUP_SMTP" == "Y" ]]; then
                LOCAL_MTA_OK=0
            else
                echo "Оставим локальный MTA. Проверьте его настройки вручную."
                USE_MSMTP=0
            fi
        fi
    else
        echo "Не удалось передать письмо локальному MTA."
        echo ""
        echo "Ошибка:"
        cat /tmp/mail-test-local.log 2>/dev/null || echo "  (лог пуст)"
        echo ""
        read -r -p "Настроить внешний SMTP (msmtp) как резервный вариант? (y/n): " SETUP_SMTP
        if [[ "$SETUP_SMTP" == "y" || "$SETUP_SMTP" == "Y" ]]; then
            LOCAL_MTA_OK=0
        else
            echo "Оставим локальный MTA. Проверьте его настройки вручную."
        fi
    fi
    rm -f /tmp/mail-test-local.log
    echo ""
fi

# ========== Настройка внешнего SMTP (если нужно) ==========
if [[ "$LOCAL_MTA_OK" != "1" ]]; then
    echo "[3/6] Настройка внешнего SMTP через msmtp..."
    echo ""

    read -r -p "SMTP сервер (например smtp.gmail.com): " SMTP_HOST
    read -r -p "SMTP порт (587 для STARTTLS, 465 для SSL): " SMTP_PORT
    read -r -p "SMTP пользователь (ваш email): " SMTP_USER
    read -r -s -p "SMTP пароль или код приложения: " SMTP_PASS
    echo ""

    if ! command -v msmtp >/dev/null 2>&1; then
        if [[ "$DISTRO" == "debian" ]]; then
            apt install -y -qq msmtp 2>/dev/null || true
        elif [[ "$DISTRO" == "rhel" ]]; then
            yum install -y -q msmtp 2>/dev/null || dnf install -y -q msmtp 2>/dev/null || true
        fi
    fi

    MSMTP_CONFIG="/etc/msmtprc-rootkit"
    cat > "$MSMTP_CONFIG" <<EOF
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        /var/log/msmtp-rootkit.log

account        default
host           $SMTP_HOST
port           $SMTP_PORT
from           $SMTP_USER
user           $SMTP_USER
password       $SMTP_PASS
EOF

    chmod 600 "$MSMTP_CONFIG"
    USE_MSMTP=1

    echo "Настройка внешнего SMTP завершена."
    echo "Конфиг: $MSMTP_CONFIG (Postfix не тронут)"
    echo ""
fi

# ========== Функция отправки письма ==========
send_mail() {
    local subject="$1"
    local body="$2"
    local to="$3"

    if [[ "$USE_MSMTP" == "1" ]]; then
        printf 'To: %s\nSubject: %s\n\n%s\n' "$to" "$subject" "$body" \
            | msmtp --file="$MSMTP_CONFIG" "$to"
    else
        printf 'To: %s\nSubject: %s\n\n%s\n' "$to" "$subject" "$body" \
            | sendmail -t
    fi
}

# ========== Инициализация базы rkhunter ==========
echo "[4/6] Обновление баз rkhunter и создание эталонных свойств файлов..."
rkhunter --update --nocolors 2>/dev/null || true
rkhunter --propupd --nocolors 2>/dev/null || true

echo "База создана (важно: делать это на чистой системе)."
echo ""

# ========== Создание скрипта ежедневной проверки ==========
echo "[5/6] Создание скрипта ежедневной проверки..."

CHECK_SCRIPT="/usr/local/bin/rootkit-daily-check.sh"

cat > "$CHECK_SCRIPT" <<SCRIPT_EOF
#!/bin/bash
# Ежедневная проверка руткитов.
# Письмо отправляется ТОЛЬКО при обнаружении проблем.
# Приоритет: локальный Postfix/sendmail, если не работает — msmtp.
# Кодировка: UTF-8

MAILTO="$ALERT_EMAIL"
HOSTNAME=\$(hostname)
DATE=\$(date '+%Y-%m-%d %H:%M:%S')
USE_MSMTP=$USE_MSMTP
MSMTP_CONFIG="$MSMTP_CONFIG"

send_mail() {
    local subject="\$1"
    local body="\$2"
    local to="\$3"

    if [[ "\$USE_MSMTP" == "1" ]]; then
        printf 'To: %s\nSubject: %s\n\n%s\n' "\$to" "\$subject" "\$body" \\
            | msmtp --file="\$MSMTP_CONFIG" "\$to"
    else
        printf 'To: %s\nSubject: %s\n\n%s\n' "\$to" "\$subject" "\$body" \\
            | sendmail -t
    fi
}

RKHUNTER_LOG=\$(mktemp /tmp/rkhunter.XXXXXX)
CHKROOTKIT_LOG=\$(mktemp /tmp/chkrootkit.XXXXXX)
COMBINED=\$(mktemp /tmp/rootkit-combined.XXXXXX)

rkhunter --check --skip-keypress --report-warnings-only --nocolors > "\$RKHUNTER_LOG" 2>&1 || true
chkrootkit -q > "\$CHKROOTKIT_LOG" 2>&1 || true

{
    echo "=== Предупреждения rkhunter ==="
    cat "\$RKHUNTER_LOG"
    echo ""
    echo "=== Подозрительные находки chkrootkit ==="
    cat "\$CHKROOTKIT_LOG"
} > "\$COMBINED"

FILTERED=\$(mktemp /tmp/rootkit-filtered.XXXXXX)
grep -v -E '^\s*\$|^===|not found|not infected|not tested' "\$COMBINED" > "\$FILTERED" 2>/dev/null || true

sed -i -E '/\/usr\/lib\/modules\/.*\/vdso\/\.build-id/d' "\$FILTERED" 2>/dev/null || true
sed -i -E '/\/usr\/lib\/python3\/dist-packages\/fail2ban\/tests\//d' "\$FILTERED" 2>/dev/null || true
sed -i -E '/\/usr\/lib\/python3\/dist-packages\/twisted\//d' "\$FILTERED" 2>/dev/null || true
sed -i '/^\s*\$/d' "\$FILTERED" 2>/dev/null || true

if [[ -s "\$FILTERED" ]]; then
    BODY="Обнаружены подозрительные объекты
Хост: \$HOSTNAME
Время: \$DATE
----------------------------------------
\$(cat "\$FILTERED")
----------------------------------------

Пожалуйста, проверьте систему вручную."
    send_mail "Rootkit WARNING: \$HOSTNAME" "\$BODY" "\$MAILTO"
fi

rm -f "\$RKHUNTER_LOG" "\$CHKROOTKIT_LOG" "\$COMBINED" "\$FILTERED"
SCRIPT_EOF

chmod +x "$CHECK_SCRIPT"

echo "Скрипт проверки создан: $CHECK_SCRIPT"
echo ""

# ========== Добавление в crontab ==========
echo "[6/6] Добавление ежедневного задания в cron..."

CRON_LINE="0 3 * * * $CHECK_SCRIPT"

if crontab -l 2>/dev/null | grep -q "$CHECK_SCRIPT"; then
    echo "Задание уже существует, пропускаем."
else
    (crontab -l 2>/dev/null; echo "$CRON_LINE") | crontab -
    echo "Добавлено в crontab: ежедневно в 03:00."
fi

echo ""

# ========== Финальный тест отправки ==========
echo "=========================================="
echo " Финальная проверка отправки почты"
echo "=========================================="
echo ""
echo "Отправляем тестовое письмо на $ALERT_EMAIL ..."
echo ""

TEST_SUBJECT="[ТЕСТ] Rootkit checker установлен на $(hostname)"
TEST_BODY="Это тестовое письмо от скрипта установки rootkit-checker.

Если вы получили это письмо — отправка почты настроена правильно.

Хост: $(hostname)
Дата: $(date '+%Y-%m-%d %H:%M:%S')
Способ отправки: $( [[ "$USE_MSMTP" == "1" ]] && echo "внешний SMTP (msmtp)" || echo "локальный Postfix/sendmail" )
Скрипт проверки: $CHECK_SCRIPT
Расписание: ежедневно в 03:00

Письма с предупреждениями будут приходить только при обнаружении проблем."

if send_mail "$TEST_SUBJECT" "$TEST_BODY" "$ALERT_EMAIL" 2>/tmp/mail-test-error.log; then
    echo "Тестовое письмо отправлено."
    echo "   Проверьте почту: $ALERT_EMAIL"
    echo ""
    read -r -p "Вы получили письмо? (y/n): " MAIL_CONFIRM
    if [[ "$MAIL_CONFIRM" != "y" && "$MAIL_CONFIRM" != "Y" ]]; then
        echo ""
        echo "Письмо не получено. Возможные причины:"
        echo "   - Проверьте папку Спам"
        if [[ "$USE_MSMTP" == "1" ]]; then
            echo "   - Проверьте настройки SMTP: $MSMTP_CONFIG"
            echo "   - Посмотрите лог: /var/log/msmtp-rootkit.log"
            echo "   - Для Gmail нужен 'код приложения', а не обычный пароль"
        else
            echo "   - Проверьте логи Postfix: /var/log/mail.log или /var/log/maillog"
        fi
        echo ""
        echo "Установка продолжится, но проверьте почту вручную."
    else
        echo "Отлично! Почта настроена корректно."
    fi
else
    echo "Не удалось отправить тестовое письмо."
    echo ""
    echo "Ошибка:"
    cat /tmp/mail-test-error.log 2>/dev/null || echo "  (лог пуст)"
    echo ""
    if [[ "$USE_MSMTP" == "1" ]]; then
        echo "Проверьте настройки в $MSMTP_CONFIG"
        echo "Лог msmtp: /var/log/msmtp-rootkit.log"
    else
        echo "Проверьте логи Postfix: /var/log/mail.log или /var/log/maillog"
    fi
fi

rm -f /tmp/mail-test-error.log

echo ""
echo "=========================================="
echo " Установка завершена!"
echo "=========================================="
echo ""
echo "Итоговая конфигурация:"
echo "  Email для оповещений: $ALERT_EMAIL"
echo "  Способ отправки:      $( [[ "$USE_MSMTP" == "1" ]] && echo "внешний SMTP (msmtp)" || echo "локальный Postfix/sendmail" )"
[[ "$USE_MSMTP" == "1" ]] && echo "  Конфиг msmtp:         $MSMTP_CONFIG"
echo "  Скрипт проверки:      $CHECK_SCRIPT"
echo "  Время запуска:        ежедневно в 03:00"
echo "  Условие отправки:     только при обнаружении проблем"
echo ""
echo "Ручной тест проверки:"
echo "  $CHECK_SCRIPT"
echo ""
echo "Просмотр crontab:"
echo "  crontab -l"
echo ""
if [[ "$USE_MSMTP" == "1" ]]; then
    echo "Просмотр логов msmtp:"
    echo "  tail -f /var/log/msmtp-rootkit.log"
else
    echo "Просмотр логов Postfix:"
    echo "  tail -f /var/log/mail.log   (Debian/Ubuntu)"
    echo "  tail -f /var/log/maillog    (RHEL/CentOS)"
fi
echo ""

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

vim /usr/local/bin/install-rootkit-checker.sh
# в vim: :set fileencoding=utf-8 → i → вставить → Esc → :wq

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

chmod +x /usr/local/bin/install-rootkit-checker.sh

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

/usr/local/bin/install-rootkit-checker.sh
Как проверить кодировку и синтаксис:

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

file -i /usr/local/bin/install-rootkit-checker.sh
bash -n /usr/local/bin/install-rootkit-checker.sh
Моя характеристика с детского сада: Хорошо кушает, спит, гуляет! Прошло много лет, ничего не изменилось.
Изображение
Ответить