Вопрос или проблема
У меня есть обучающая среда на базе Linux CentOS с работающими Postfix и SquirrelMail, но мое задание более общее.
Мне нужно найти в maillog электронные письма, полученные определенным пользователем в определенный промежуток времени, основываясь только на его имени пользователя в Linux.
Я вижу свой maillog, но не имею опыта в его чтении и у меня есть две проблемы:
-
Станут ли эти шаблоны, которые я вижу в логе, чем-то надежным, т.е. будет ли лог для входящей почты всегда содержать
to=<EMAIL>
в себе.2 янв 20:31:17 tmcent01 postfix/local[27450]: B58C4330038: to=<[email protected]>, orig_to=<postmaster>, relay=local, delay=9.7, delays=9.6/0.03/0/0.02, dsn=2.0.0, status=sent (доставлено в почтовый ящик)
-
Как имя пользователя в Linux соответствует имени электронной почты пользователя? Это не всегда совпадает (username@domain), верно? У нас может быть алиас для этого, как я могу учесть это, когда составляю Regex для
grep
?
Мои две первые попытки оказались неудачными.
sudo grep "to=<jsmith@" /var/log/maillog | grep 1[2-4]:[0-5][0-9]:[0-5][0-9]
sudo grep -w "jsmith" /var/log/maillog | grep 1[2-4]:[0-5][0-9]:[0-5][0-9]
Вот простой пример скрипта, который вы можете попробовать. Он будет искать алиасы пользователя в общем файле /etc/aliases.
#!/bin/bash
# Аргументы:
# $1 = имя пользователя для поиска
# $2 = место для файла журнала электронной почты
# Сначала создадим временный рабочий каталог.
WORKDIR=$(mktemp -d)
cd "${WORKDIR}" || exit
# Создадим файл для имени пользователя и всех алиасов.
echo "to=<""$1" > search_key.txt
# Затем узнаем возможные алиасы для пользователя.
# Awk используется просто для разделения первого столбца.
grep "$1" /etc/aliases | awk 'BEGIN { FS=":" }; {print "to=<" $1}' >> search_key.txt
# Далее, будем искать электронные письма, отправленные для всех этих адресов.
grep -f search_key.txt "$2"
# Наконец, удалим рабочий каталог.
rm -rf "${WORKDIR}"
# Все готово.
Не являются ли эти шаблоны, которые я вижу в логе, чем-то надежным, т.е. будет ли лог для входящей почты всегда содержать to= в себе
Да, любое электронное письмо, обработанное Postfix, будет иметь запись с to=…, но это будет включать электронные письма, которые не доставляются локально. Также имейте в виду, что часть почтового ящика в адресе электронной почты не обязательно совпадает с одним локальным пользователем – Postfix может применять расширение/замену, и MDA может также применять расширение/замену к этому.
Единственным надежным механизмом для захвата информации, которую вы, похоже, хотите, будет инструментирование MDA, а не MTA.
Ответ или решение
Чтобы найти в файле журнала почты (maillog) все письма, полученные определённым пользователем на Linux-системе с установленным Postfix, необходимо учитывать несколько факторов. Рассмотрим этот процесс более подробно.
Анализ вопросов пользователя:
-
Надёжность паттерна
to=<EMAIL>
в журнале:
Да, каждая запись о входящем e-mail, обработанном Postfix, будет содержать строку сto=<EMAIL>
. Это связано с тем, что MTA (Mail Transfer Agent) всегда фиксирует получателя всех входящих сообщений. -
Соответствие Linux-имени пользователя и адреса электронной почты:
Обычно адрес электронной почты формируется по шаблонуusername@domain
. Однако, это не всегда может соответствовать имени пользователя в системе, так как могут быть настроены алиасы (псевдонимы). Для этого нужно учитывать файл/etc/aliases
, где может быть указано соответствие между пользователем и его адресом электронной почты.
Шаги по поиску писем в maillog:
Для того чтобы найти все письма, полученные пользователем в определённый промежуток времени, можем воспользоваться следующими шагами:
-
Соберите возможные адреса электронной почты:
- Начните с простого соответствия
username@domain
. - Затем проверьте файл
/etc/aliases
на наличие алиасов для пользователя.
- Начните с простого соответствия
-
Сформируйте регулярное выражение:
- Вам нужно составить регулярное выражение для
grep
, которое будет включать все возможные адреса из предыдущего шага.
- Вам нужно составить регулярное выражение для
-
Ищите записи в maillog:
- Используйте команду
grep
, чтобы найти необходимые записи в/var/log/maillog
и отфильтруйте их по времени.
- Используйте команду
Пример скрипта на bash:
Вот пример скрипта, который реализует вышеописанный процесс. Он принимает имя пользователя и местоположение файла журнала, ищет все возможные письма и выводит результаты.
#!/bin/bash
# Проверка аргументов
if [ $# -ne 2 ]; then
echo "Использование: $0 <имя_пользователя> <путь_к_файлу_журнала>"
exit 1
fi
USER_NAME="$1"
LOG_FILE="$2"
DOMAIN="yourdomain.com" # Замените на ваш домен
WORKDIR=$(mktemp -d)
cd "${WORKDIR}" || exit
# Создание файла для ключевых слов
echo "to=<${USER_NAME}@${DOMAIN}>" > search_key.txt
# Поиск алиасов
grep "^${USER_NAME}:" /etc/aliases | awk -F':' '{print "to=<" $1 "@${DOMAIN}>" }' >> search_key.txt
# Поиск в файле журнала
grep -f search_key.txt "${LOG_FILE}"
# Удаление временного каталога
rm -rf "${WORKDIR}"
Заключение:
В этом ответе мы рассмотрели, как можно искать электронную почту, используя логи Postfix в CentOS. Описанный скрипт может быть дополнительно адаптирован для фильтрации по времени. Не забудьте заменить yourdomain.com
на фактический домен вашей почтовой системы. Понимание структуры логов и правильная интерпретация при помощи регулярных выражений позволят вам грамотно анализировать почтовые записи.