Код: Выделить всё
#!/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Код: Выделить всё
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
