В 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. И по какой-то причине он затем открывает соответствующий отчет в редакторе терминала, а не просто распечатывает его. Обратите внимание, что на самом деле нет рабочего кода для отправки последнего отчета по электронной почте.
Поскольку предотвращение выполнения 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 ():
--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