Поиск в /var/log/maillog электронной почты для определенного пользователя, основываясь только на его имени в Linux.

Вопрос или проблема

У меня есть обучающая среда на базе Linux CentOS с работающими Postfix и SquirrelMail, но мое задание более общее.

Мне нужно найти в maillog электронные письма, полученные определенным пользователем в определенный промежуток времени, основываясь только на его имени пользователя в Linux.

Я вижу свой maillog, но не имею опыта в его чтении и у меня есть две проблемы:

  1. Станут ли эти шаблоны, которые я вижу в логе, чем-то надежным, т.е. будет ли лог для входящей почты всегда содержать 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 (доставлено в почтовый ящик)
    
  2. Как имя пользователя в 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, необходимо учитывать несколько факторов. Рассмотрим этот процесс более подробно.

Анализ вопросов пользователя:

  1. Надёжность паттерна to=<EMAIL> в журнале:
    Да, каждая запись о входящем e-mail, обработанном Postfix, будет содержать строку с to=<EMAIL>. Это связано с тем, что MTA (Mail Transfer Agent) всегда фиксирует получателя всех входящих сообщений.

  2. Соответствие Linux-имени пользователя и адреса электронной почты:
    Обычно адрес электронной почты формируется по шаблону username@domain. Однако, это не всегда может соответствовать имени пользователя в системе, так как могут быть настроены алиасы (псевдонимы). Для этого нужно учитывать файл /etc/aliases, где может быть указано соответствие между пользователем и его адресом электронной почты.

Шаги по поиску писем в maillog:

Для того чтобы найти все письма, полученные пользователем в определённый промежуток времени, можем воспользоваться следующими шагами:

  1. Соберите возможные адреса электронной почты:

    • Начните с простого соответствия username@domain.
    • Затем проверьте файл /etc/aliases на наличие алиасов для пользователя.
  2. Сформируйте регулярное выражение:

    • Вам нужно составить регулярное выражение для grep, которое будет включать все возможные адреса из предыдущего шага.
  3. Ищите записи в 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 на фактический домен вашей почтовой системы. Понимание структуры логов и правильная интерпретация при помощи регулярных выражений позволят вам грамотно анализировать почтовые записи.

Оцените материал
Добавить комментарий

Капча загружается...