Назад | Перейти на главную страницу

Как получить по электронной почте отчет о последнем сканировании на мальдет?

В maldet / Rfxn Linux MalDetect документы дайте это для получения отчета по электронной почте, даже если ничего не было найдено:

-e, --report SCANID email
   View scan report of most recent scan or of a specific SCANID and optionally
   e-mail the report to a supplied e-mail address
   e.g: maldet --report
   e.g: maldet --report list
   e.g: maldet --report 050910-1534.21135
   e.g: maldet --report SCANID user@domain.com

Все очень просто, но я не уверен, как я могу передать здесь адрес электронной почты в качестве второго аргумента, позволяя при этом первому аргументу (идентификатору сканирования) вернуться к его значениям по умолчанию, так что maldet отправляет по электронной почте любой последний отчет на этот настраиваемый адрес электронной почты. Я хотел бы иметь возможность использовать это (например, в cron) для периодической проверки того, что Maldet сканирует и может отправлять отчеты по электронной почте, как ожидалось.

я пробовал maldet --report "" user@domain.com на основе стандартные способы передачи пустой переменной в bash, но игнорирует его и выводит в консоль то, что выглядит как пустой отчет.

Я также пробовал такие вещи, как maldet --report 0 user@domain.com и maldet --report " " user@domain.com но он отвечает {report} no report found, aborting.

Окружающая среда - это Centos, если это актуально.

Извините, что воскресил старый вопрос. У меня была такая же проблема, когда я пытался заставить Maldet отправлять отчет по электронной почте после каждого сканирования. Я покопался в исходном коде, как это было предложено @Tilman. Функцию, отвечающую за отправку отчетов по электронной почте, view_report (), можно найти в /usr/local/maldetect/internals/functions строки 645-706 в v1.6.4. Если посмотреть конкретно на ответственный код (строки 681-696), мы увидим, что почта отправляется только в том случае, если SCANID хранится как $rid, суффикс, т.е. 190429-0343.31494, соответствует имени файла отчета, представленного в /usr/local/maldetect/sess/ Такие как session.190429-0343.31494

if [ -f "$sessdir/session.$rid" ] && [ ! -z "$(echo $2 | grep '\@')" ]; then
    if [ -f "$mail" ]; then
        cat $sessdir/session.$rid | $mail -s "$email_subj" "$2"
    elif [ -f "$sendmail" ]; then
        if ! grep -q "SUBJECT: " "$sessdir/session.$rid"; then
            echo -e "SUBJECT: $email_subj\n$(cat $sessdir/session.$rid)" > $sessdir/session.$rid
        fi
        cat $sessdir/session.$rid | $sendmail -t "$2"
    else
        eout "{scan} no \$mail or \$sendmail binaries found, e-mail alerts disabled."
        exit
    fi

    eout "{report} report ID $rid sent to $2" 1
    exit
fi

Код, обрабатывающий пустой SCANID, сразу же следует за этим (строки 697-705):

if [ "$rid" == "" ] && [ -f "$sessdir/session.last" ]; then
    rid=`cat $sessdir/session.last`
    $EDITOR $sessdir/session.$rid
elif [ -f "$sessdir/session.$rid" ]; then
    $EDITOR $sessdir/session.$rid
else
    echo "{report} no report found, aborting."
    exit
fi

Я бы подумал, что код, обрабатывающий пустой SCANID, просто возьмет самый последний и отправит его по электронной почте. На самом деле он смотрит на /usr/local/maldetect/sess/session.last где maldet хранит самый последний SCANID. И по какой-то причине он затем открывает соответствующий отчет в редакторе терминала, а не просто распечатывает его. Обратите внимание, что на самом деле нет рабочего кода для отправки последнего отчета по электронной почте.

- Обновленное исправление - 5 мая 2019 г. -

Поскольку предотвращение выполнения LMD проверок целостности, как того требует мое исходное исправление, представляет собой потенциальную угрозу безопасности, я создал альтернативное решение, используя custom.cron LMD. Преимущество заключается в том, что проверки целостности остаются на месте, и сценарий электронной почты должен сохраняться при обновлении. Вам не нужно трогать внутренние файлы LMD или ежедневно выполнять cron.

Обеспечить $email_alert="1" и $email_addr= установлен хотя бы один правильный адрес электронной почты в /usr/local/maldetect/conf.maldet. Затем добавьте следующее в /usr/local/maldetect/cron/custom.cron и он будет запускаться автоматически в конце ежедневной хроники maldet:

##
# Please use this file for preservation of custom LMD execution code for the daily cronjob.
# NOTE: scripts in this file are called at the end of maldet daily cron as $custom_cron_exec
##

# log_cron="1" enable logging, log_cron="0" disable logging 
# applies only to the code in this file
log_cron="1"

# logging function borrowed from /maldetect/internals/functions
eout() {
    if [ "$log_cron" == "1" ]; then
        msg="$1"
        stdout="$2"
        appn=maldet
        if [ ! -d "$logdir" ]; then
            mkdir -p $logdir ; chmod 700 $logdir
        fi
        if [ ! -f "$maldet_log" ]; then
            touch $maldet_log
        fi
        log_size=`$wc -l $maldet_log | awk '{print$1}'`
        if [ "$log_size" -ge "20000" ]; then
            trim=1000
            printf "%s\n" "$trim,${log_size}d" w | ed -s $maldet_log 2> /dev/null
        fi
        if [ ! "$msg" == "" ]; then
            echo "$(date +"%b %d %H:%M:%S") $(hostname -s) $appn($$): $msg" >> $maldet_log
            if [ ! -z "$stdout" ]; then
                echo "$appn($$): $msg"
            fi
        fi
    fi
}

eout "{cron} running $cron_custom_exec"

##
# LMD Daily Email v1.0.0
# Author: kdub Email: kdubdev@gmail.com Date: May 5th, 2019
# https://github.com/kdubdev/linux-malware-detect/blob/master/files/cron/custom.cron
# Script to send email of newest report after daily scan. More info:
# https://serverfault.com/questions/805158/how-to-get-an-email-report-of-whatever-the-most-recent-maldet-scan-is
# #
de_version='v1.0.0'
eout "{cron} starting LMD Cron Email $de_version"
eout "{cron} $intcnf shows email_alert=$email_alert email_addr=$email_addr"

# Default email subject defined in /usr/local/maldetect/internals/internals.conf
# is email_subj="maldet alert from $(hostname)"
# comment this line to use the default email_subj or change to what you want
printf -v email_subj '[%s] %s: Scan Report' "$(hostname)" "$appn($$)"

# uncomment email_addr below to override recipients. Separate multiple emails with ,
# use $email_addr to include recipient defined in /usr/local/maldetect/conf.maldet
# email_addr="$email_addr,second@domain.tld,third@domain.tld"

# this is the email text inserted before the report
body_intro="Here are the results of the latest LMD scan:"
# this is the email text inserted after the report
printf -v body_footer "Email provided by LMD Cron Email %s\nCron file: %s\nLog file: %s" "$de_version" "$cron_custom_exec" "$maldet_log"

# this is a very weak email validation, just looking for @
if [ "$email_alert" == "1" ] && [ ! -z "$(echo $email_addr | grep '\@')" ]; then
# email_alert is true and email provided, send newest report
    if [ -f "$sessdir/session.last" ]; then    
        # Get most recent scan id
        rid=$(cat "$sessdir/session.last")
        if [ ! -z "$rid" ]; then
            # session.list contains something
            if [ -f "$sessdir/session.$rid" ]; then
                # report exists, get contents
                body=$(cat "$sessdir/session.$rid")
                eout "{cron} reading report $sessdir/session.$rid"
            else
                # report doesn't exist   
                body="{cron} unable to find report $sessdir/session.$rid."
            fi
            if [ -z "$body" ]; then
                # report file exists but is empty
                body="{cron} report $sessdir/session.$rid is empty."
            fi          
        else
            # session.last is empty  
            body="{cron} $sessdir/session.last is empty."
        fi
    else    
        # session.last doesn't exist
        body="{cron} unable to find $sessdir/session.last."
    fi
    # log if body starts with {cron} ie there's a problem reading report
    if [[ $body == '{cron}'* ]]; then
        eout "$body"
    fi

    # add intro and footer to body
    body=$(printf "%s\n\n%s\n\n%s\n\n" "$body_intro" "$body" "$body_footer")

    if [ -f "$mail" ]; then
        printf "%s" "$body" | $mail -s "$email_subj" "$email_addr"
        eout "{cron} mail sent using $mail to $email_addr, subject: $email_subj."
    elif [ -f "$sendmail" ]; then
        printf "%s\n%s" "$email_subj" "$body" | $sendmail -t "$email_addr"
        eout "{cron} mail sent using $sendmail to $email_addr, subject: $email_subj."
    fi
fi
eout "{cron} mail latest report finished."
eout "{cron} done running $cron_custom_exec"

Вы также можете проверить наличие обновлений здесь https://github.com/kdubdev/linux-malware-detect/blob/master/files/cron/custom.cron

В сценарии вы можете отключить ведение журнала, переопределить тему и / или получателей электронного письма, а также настроить вступление и нижний колонтитул тела письма. Сценарий сильно прокомментирован, поэтому вы можете следить за ним или вносить изменения.

Я приветствую любые отзывы или предложения по улучшению.

- Оригинальное исправление ниже -

Чтобы исправить это и добавить другие улучшения, я внес следующие изменения в view_report ():

  • добавлена ​​опция 'newest' как псевдоним для --report и --report "" позволять $ maldet --report newest user@domain.com
  • правильно отправить последний отчет по электронной почте при использовании $ maldet --report newest user@domain.com или $ maldet --report "" user@domain.com
  • отказаться от ненужного использования редактора для просмотра отчетов, вместо этого просто распечатать на терминал
  • улучшенное ведение журнала

ПЕРВЫЙ: Вам нужно установить autoupdate_version_hashed="0" в /usr/local/maldetect/conf.maldet чтобы LMD не перезаписывал автоматически любые изменения, которые вы вносите при запуске проверки обновлений. Имейте в виду, что это потенциальная проблема безопасности:

# This controls validating the LMD executable MD5 hash with known
# good upstream hash value. This allows LMD to replace the the
# executable / force a reinstallation in the event the LMD executable
# is tampered with or corrupted. If you intend to make customizations
# to the LMD executable, you should disable this feature.
# [0 = disabled, 1 = enabled]
autoupdate_version_hashed="0"

ВТОРОЙ: Замените ваш текущий view_report() /usr/local/maldetect/internals/functions (строки 645-706) с этим:

view_report() {
    # $1 is first arg passed from command line ex. $ maldet --report $1 $2
    rid="$1"
    # $ maldet --report list
    if [ "$rid" == "list" ]; then
        tmpf="$tmpdir/.areps$$"
        for file in `ls $sessdir/session.[0-9]* 2> /dev/null`; do
            SCANID=`cat $file | grep "SCAN ID" | sed 's/SCAN ID/SCANID/'`
            FILES=`cat $file | grep "TOTAL FILES" | sed 's/TOTAL //'`
            HITS=`cat $file | grep "TOTAL HITS" | sed 's/TOTAL //'`
            CLEAN=`cat $file | grep "TOTAL CLEANED" | sed 's/TOTAL //'`
            TIME=`cat $file | grep -E "^TIME|^STARTED" | sed -e 's/TIME: //' -e 's/STARTED: //' | awk '{print$1,$2,$3,$4}'`
            TIME_U=`date -d "$TIME" "+%s" 2> /dev/null`
                        ETIME=`cat $file | grep "ELAPSED" | awk '{print$1,$2}' | sed 's/ELAPSED/RUNTIME/'`
            if [ -z "$ETIME" ]; then
                ETIME="RUNTIME: unknown"
            fi
            if [ ! -z "$SCANID" ] && [ ! -z "$TIME" ]; then
                clean_zero=`echo $CLEAN | awk '{print$2}'`
                if [ -z "$clean_zero" ]; then
                    CLEAN="CLEANED:  0"
                fi
                echo "$TIME_U | $TIME | $SCANID | $ETIME | $FILES | $HITS | $CLEAN" >> $tmpf
            fi
        done
        if [ -f "$tmpf" ]; then
            if [ "$OSTYPE" == "FreeBSD" ]; then
                cat $tmpf | sort -k1 -n | cut -d'|' -f2-7 | column -t | more
            else
                cat $tmpf | sort -k1 -n | tac | cut -d'|' -f2-7 | column -t | more
            fi
            rm -f $tmpf 2> /dev/null
            exit 0
        else
            eout  "{list} unable to find report data for list, check \$sessdir"
            exit 1
        fi
    fi
    # If no SCANID is provided or "recent" then set $rid to most recent. 
    # $ maldet --report "" or $maldet --report newest
    if { [ "$rid" == "" ] || [ "$rid" == "newest" ]; } && [ -f "$sessdir/session.last" ]; then
        rid=`cat $sessdir/session.last`
    fi
    # make sure report exists
    if [ -f "$sessdir/session.$rid" ]; then
        # if email is provided, then send the report and exit
        if [ ! -z "$(echo $2 | grep '\@')" ]; then
            if [ -f "$mail" ]; then
                cat $sessdir/session.$rid | $mail -s "$email_subj" "$2"
            elif [ -f "$sendmail" ]; then
                if ! grep -q "SUBJECT: " "$sessdir/session.$rid"; then
                    echo -e "SUBJECT: $email_subj\n$(cat $sessdir/session.$rid)" > $sessdir/session.$rid
                fi
                cat $sessdir/session.$rid | $sendmail -t "$2"
            else
                # eout is an internal function to log to maldet_log and echo
                eout "{scan} no \$mail or \$sendmail binaries found, e-mail alerts disabled."
                exit
            fi
            eout "{report} report ID $rid sent to $2" 1
            exit        
        # no email is provided so show report and exit
        else
            printf '%b\n' "$(cat $sessdir/session.$rid)"
            exit
        fi
    # can't find requested report so log & echo error
    else
        eout "{report} unable to find report session.\$rid, aborting."
        exit
    fi
}

Вы можете найти все обновленное /usr/local/maldetect/internals/functions файл в запросе на перенос также здесь: https://github.com/kdubdev/linux-malware-detect/blob/patch-1/files/internals/functions

ПОСЛЕДНИЙ: Добавьте следующую строку в конец /etc/cron.daily/maldet если вы хотите получать электронное письмо после каждого ежедневного сканирования: $inspath/maldet --report newest user@domain.com

Примечание: если это не ясно, вы можете использовать -e или --report взаимозаменяемо.

Автор maldet либо не предоставили такой возможности, либо не задокументировали ее. Со стороны угадать невозможно. Лучший путь вперед - это UTSL: посмотрите в исходном коде программы, как она обрабатывает -e вариант и есть ли способ запустить ветвь «самое последнее сканирование» и одновременно активировать параметр электронной почты.

Вам следует отредактировать свой /usr/local/maldetect/conf.maldet и в строке 22. Заменить email_addr="your@domain.com" на действующий адрес.

редактировать:

Я неправильно прочитал исходный пост, но этот параметр может помочь кому-то другому.

Вот правильный способ сделать это: maldet -e reportID email

Вам не нужен переключатель --report