Перейти до змісту

Звітування про процес Postfix

Передумови

  • Повний комфорт роботи з командного рядка на сервері Rocky Linux
  • Знайомство з редактором на ваш вибір (у цьому документі використовується редактор vi, але ви можете замінити його улюбленим редактором)
  • Розуміння DNS (системи доменних імен) та імен хостів
  • Можливість призначати змінні в сценарії bash
  • Знання того, що роблять команди tail, more, grep і date

Вступ

Багато адміністраторів серверів Rocky Linux пишуть скрипти для виконання певних завдань, таких як резервне копіювання або синхронізація файлів, і ці скрипти часто генерують журнали, які містять цінну, а іноді й дуже важливу інформацію. Однак мати лише журнали недостатньо. Якщо процес дає збій і реєструє цю помилку, але зайнятий адміністратор не переглядає журнал, тоді може бути катастрофа.

У цьому документі показано, як використовувати postfix MTA (агент передачі пошти), щоб отримати подробиці журналу з певного процесу та надіслати їх вам електронною поштою. Він також торкається форматів дати в журналах і допомагає визначити, який формат використовувати в процедурі звітування.

Пам’ятайте, що це лише верхівка айсберга щодо того, що ви можете зробити, створюючи звіти за допомогою postfix. Зауважте, що обмежити запущені процеси лише тими, які вам будуть потрібні постійно, завжди є хорошим заходом безпеки.

У цьому документі показано, як увімкнути Postfix лише для звітів, які вам потрібні, а потім знову вимкнути його.

Визначення postfix

Postfix — це серверний демон, який використовується для надсилання електронної пошти. Це більш безпечний і зрозумілий, ніж sendmail, ще один MTA, який роками використовувався за умовчанням. Ви можете використовувати його як частину повнофункціонального поштового сервера.

Встановлення postfix

Окрім postfix, вам знадобиться s-nail, щоб перевірити вашу здатність надсилати електронні листи. Щоб установити ці та будь-які необхідні залежності, введіть наступне в командному рядку сервера Rocky Linux:

dnf install postfix s-nail

Тестування та налаштування postfix

Тестування пошти

Перш ніж налаштовувати postfix, вам потрібно дізнатися, як виглядатиме пошта після відправлення із сервера, оскільки ви, ймовірно, захочете це змінити. Для цього запустіть postfix:

systemctl start postfix

Перевірте з поштою, наданою s-nail:

mail -s "Testing from server" myname@mydomain.com

Це відобразить порожній рядок. Введіть своє тестове повідомлення тут:

testing from the server

Натисніть Enter, а потім одну крапку ++крапка++:

Система відповість наступним чином:

EOT

Мета полягає в тому, щоб побачити, як ваша пошта виглядає для зовнішнього світу. Ви можете отримати уявлення про це з журналу пошти, який стає активним під час запуску postfix.

Використовуйте цю команду, щоб переглянути вихідні дані файлу журналу:

tail /var/log/maillog

Ви побачите щось подібне, хоча файл журналу матиме різні домени для адреси електронної пошти та інших елементів:

Mar  4 16:51:40 hedgehogct postfix/postfix-script[735]: starting the Postfix mail system
Mar  4 16:51:40 hedgehogct postfix/master[737]: daemon started -- version 3.3.1, configuration /etc/postfix
Mar  4 16:52:04 hedgehogct postfix/pickup[738]: C9D42EC0ADD: uid=0 from=<root>
Mar  4 16:52:04 hedgehogct postfix/cleanup[743]: C9D42EC0ADD: message-id=<20210304165204.C9D42EC0ADD@somehost.localdomain>
Mar  4 16:52:04 hedgehogct postfix/qmgr[739]: C9D42EC0ADD: from=<root@somehost.localdomain>, size=457, nrcpt=1 (queue active)
Mar  4 16:52:05 hedgehogct postfix/smtp[745]: connect to gmail-smtp-in.l.google.com[2607:f8b0:4001:c03::1a]:25: Network is unreachable
Mar  4 16:52:06 hedgehogct postfix/smtp[745]: C9D42EC0ADD: to=<myname@mydomain.com>, relay=gmail-smtp-in.l.google.com[172.217.212.26]
:25, delay=1.4, delays=0.02/0.02/0.99/0.32, dsn=2.0.0, status=sent (250 2.0.0 OK  1614876726 z8si17418573ilq.142 - gsmtp)
Mar  4 16:52:06 hedgehogct postfix/qmgr[739]: C9D42EC0ADD: removed

"somehost.localdomain" показує, що вам потрібно внести зміни. Спочатку зупиніть демон postfix:

systemctl stop postfix

Налаштування postfix

Оскільки ви не налаштовуєте повний, повністю функціональний поштовий сервер, параметри конфігурації, які ви використовуватимете, не такі великі. Перше, що потрібно зробити, це змінити файл main.cf (буквально, головний файл конфігурації для postfix). Спочатку зробіть резервну копію:

cp /etc/postfix/main.cf /etc/postfix/main.cf.bak

Потім відредагуйте його:

vi /etc/postfix/main.cf

У цьому прикладі ім'я вашого сервера — "bruno", а ім'я вашого домену — "ourdomain.com". Знайдіть у файлі рядок:

#myhostname = host.domain.tld

Ви можете видалити примітку (#) або додати новий рядок під цим рядком. Виходячи з прикладу, рядок буде виглядати так:

myhostname = bruno.ourdomain.com

Далі знайдіть рядок для доменного імені:

#mydomain = domain.tld

Або видаліть зауваження та змініть його, або додайте новий рядок:

mydomain = ourdomain.com

Нарешті, перейдіть у нижню частину файлу та додайте цей рядок:

smtp_generic_maps = hash:/etc/postfix/generic

Збережіть зміни та вийдіть з файлу.

Перш ніж продовжити редагування загального файлу, вам потрібно побачити, як виглядатиме електронний лист. Зокрема, вам потрібно створити «загальний» файл, на який ви посилалися раніше у файлі main.cf:

vi /etc/postfix/generic

Цей файл повідомляє postfix, як виглядатиме будь-який електронний лист, що надходить з цього сервера. Пам'ятаєте свій тестовий електронний лист та файл журналу? Ось тут ви все це виправляєте:

root@somehost.localdomain       root@bruno.ourdomain.com
@somehost.localdomain           root@bruno.ourdomain.com

Далі вам потрібно вказати postfix використати всі ваші зміни. Зробіть це за допомогою команди postmap:

postmap /etc/postfix/generic

Запустіть postfix та знову перевірте свою електронну пошту, виконавши ту саму процедуру, що й раніше. Тепер ви побачите, що всі екземпляри "localdomain" тепер є фактичним доменом.

Команда date і змінна, яка називається today

Не кожна програма використовуватиме однаковий формат дати. Можливо, вам доведеться проявити креативність до будь-якого сценарію, який ви пишете для звітності за датою.

Скажімо, ви хочете переглянути системний журнал, витягнути все, що стосується dbus-daemon за сьогоднішню дату, і надіслати це собі електронною поштою. (Це, мабуть, не найкращий приклад, але він дасть вам уявлення про те, як це зробити.)

Вам потрібно використовувати змінну у вашому скрипті. Назвіть це "today". Ви хочете, щоб він був пов’язаний з виводом команди «date» та був відформатований певним чином, щоб ви могли отримати потрібні дані з системного журналу (у /var/log/messages). Для початку проведемо розслідування.

Спочатку введіть команду date в командному рядку:

date

Це показує вихідну системну дату за замовчуванням, яка може бути подібною до цієї:

Thu Mar  4 18:52:28 UTC 2021

Перевірте системний журнал і подивіться, як у ньому записується інформація. Для цього скористайтеся командами more та grep:

more /var/log/messages | grep dbus-daemon

Що дасть вам щось подібне до цього:

Mar  4 18:23:53 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher'
Mar  4 18:50:41 hedgehogct dbus-daemon[60]: [system] Activating via systemd: service name='org.freedesktop.nm_dispatcher' unit='dbus-org.freedesktop.nm-dispatcher.service' requested by ':1.1' (uid=0 pid=61 comm="/usr/sbin/NetworkManager --no-daemon " label="unconfined")
Mar  4 18:50:41 hedgehogct dbus-daemon[60]: [system] Successfully activated service 'org.freedesktop.nm_dispatcher

Дата та вивід журналу повинні точно збігатися у вашому скрипті. Давайте розглянемо, як відформатувати дату за допомогою змінної під назвою "today".

Перевірте, що вам потрібно зробити з датою, щоб отримати той самий результат, що й системний журнал. Ви можете посилатися на довідкову сторінку Linux або ввести man-date у командному рядку, щоб відкрити сторінку посібника з датою та отримати потрібну інформацію.

Що ви знайдете, це форматувати дату так само, як /var/log/messages , вам потрібно використовувати рядки формату %b і %e з %b це місяць із 3 символів, а %e — день із пробілами.

Сценарій

Для вашого bash-скрипту, як ви можете бачити, ви збираєтеся використовувати команду date та змінну з назвою "today". (Майте на увазі, що "today" є довільним. Ви можете назвати цю змінну як завгодно). У цьому прикладі ви викличете свій скрипт test.sh та помістите його в /usr/local/sbin:

vi /usr/local/sbin/test.sh

На початку зверніть увагу, що хоча в коментарі до файлу зазначено, що ви надсилаєте ці повідомлення на електронну пошту, наразі ви просто надсилаєте їх до стандартного виводу журналу, щоб перевірити їх правильність.

Також, під час першого запуску скрипта ви отримуєте всі повідомлення за поточну дату, а не лише повідомлення dbus-daemon. Ви незабаром розберетеся з цим.

Майте на увазі, що команда grep поверне ім'я файлу у вихідних даних, що вам не потрібно в цьому випадку. Щоб видалити це, додайте опцію "-h" до grep. Крім того, коли ви встановлюєте змінну "today", вам потрібно шукати всю змінну як рядок, для якого потрібен рядок у лапках:

#!/bin/bash

# set the date string to match /var/log/messages
today=`date +"%b %e"`

# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages

Це все. Збережіть зміни та зробіть сценарій виконуваним:

chmod +x /usr/local/sbin/test.sh

А потім перевірте:

/usr/local/sbin/test.sh

Якщо все працює правильно, ви отримаєте довгий список усіх повідомлень у /var/log/messages за сьогоднішній день, включаючи, але не обмежуючись повідомленнями dbus-daemon. Наступним кроком є обмеження повідомлень повідомленнями демона dbus. Знову змініть сценарій:

vi /usr/local/sbin/test.sh
#!/bin/bash

# set the date string to match /var/log/messages
today=`date +"%b %e"`

# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages | grep dbus-daemon

Повторний запуск скрипта поверне лише повідомлення dbus-daemon, і лише ті, що відбулися сьогодні.

Потрібен ще один останній крок. Пам’ятайте, вам потрібно надіслати це електронною поштою адміністратору для перевірки. Ви не хочете залишати службу запущеною, тому що ви використовуєте лише postfix на цьому сервері для звітування. Запускайте його на початку сценарію та зупиняйте в кінці. Тут команда sleep призупиняється на 20 секунд, забезпечуючи надсилання електронної пошти перед повторним вимкненням postfix. Це остаточне редагування додає проблеми зупинки, запуску та сну, які щойно обговорювалися, а також передає вміст на електронну пошту адміністратора.

vi /usr/local/sbin/test.sh

І змініть сценарій:

#!/bin/bash

# start postfix
/usr/bin/systemctl start postfix

# set the date string to match /var/log/messages
today=`date +"%b %e"`

# grab the dbus-daemon messages and send them to email
grep -h "$today" /var/log/messages | grep dbus-daemon | mail -s "dbus-daemon messages for today" myname@mydomain.com

# make sure the email has finished before continuing
sleep 20

# stop postfix
/usr/bin/systemctl stop postfix

Перезапустіть скрипт, і ви отримаєте електронний лист від сервера з повідомленням dbus-daemon.

Тепер ви можете використовувати crontab, щоб запланувати його виконання в певний час.

Висновок

Використання postfix може допомогти вам відстежувати журнали процесів, які ви хочете контролювати. Ви можете використовувати його разом зі скриптами bash, щоб отримати чітке розуміння системних процесів та отримати цю інформацію електронною поштою, якщо виникнуть проблеми.

Author: Steven Spencer

Contributors: Ezequiel Bruni, Ganna Zhyrnova