Звітування про процес 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