متمرکزسازی لاگ‌ها با Journald در Ubuntu 24.04 LTS

مقدمه

مدیریت لاگ‌ها یکی از مهم‌ترین بخش‌های نگهداری و مانیتورینگ سرورهای لینوکسی است. لاگ‌ها فقط برای بررسی خطاها استفاده نمی‌شوند؛ بلکه اطلاعات ارزشمندی درباره عملکرد سرویس‌ها، وضعیت امنیتی سیستم، فعالیت کاربران و اتفاقات مختلفی که روی سرور رخ می‌دهد نیز در اختیار مدیر سیستم قرار می‌دهند.

به‌صورت پیش‌فرض، هر سرور لاگ‌های خود را به‌صورت محلی ذخیره می‌کند. این روش برای یک یا دو سرور مناسب است، اما زمانی که تعداد سرورها افزایش پیدا می‌کند، مدیریت لاگ‌ها به‌صورت جداگانه کار بسیار دشوار و زمان‌بری خواهد شد.

راهکار استاندارد برای حل این مشکل، راه‌اندازی یک سرور متمرکز جمع‌آوری لاگ (Centralized Logging Server) است؛ به‌طوری که تمامی سرورها، لاگ‌های خود را به‌صورت لحظه‌ای (Real-Time) برای آن ارسال کنند.

استفاده از یک سرور متمرکز برای ذخیره و مدیریت لاگ‌ها مزایای زیادی دارد، از جمله:

  • کاهش فضای ذخیره‌سازی موردنیاز روی سرورهای عملیاتی
  • امکان نگهداری لاگ‌ها برای مدت زمان طولانی‌تر
  • تحلیل و بررسی رخدادها در چندین سرور به‌صورت هم‌زمان
  • ساده‌تر شدن عیب‌یابی سرویس‌های توزیع‌شده
  • افزایش امنیت، زیرا مدیر سیستم بدون ورود مستقیم به همه سرورها می‌تواند لاگ‌ها را بررسی کند.
  • امکان اتصال ابزارهای مانیتورینگ و تحلیل لاگ مانند Graylog، OpenSearch یا ELK Stack در آینده

در این آموزش یاد می‌گیرید چگونه با استفاده از systemd-journal-remote که بخشی از مجموعه ابزارهای systemd است، لاگ‌های چندین سرور را روی یک سرور مرکزی جمع‌آوری کنید.

همچنین ارتباط بین سرورهای ارسال‌کننده لاگ و سرور مرکزی با استفاده از TLS رمزنگاری می‌شود تا علاوه بر حفظ محرمانگی اطلاعات، هویت دو طرف نیز احراز شود و لاگ‌ها با امنیت کامل حتی از طریق اینترنت منتقل شوند.


پیش‌نیازها

برای انجام این آموزش به موارد زیر نیاز دارید:

  • دو سرور Ubuntu 24.04 LTS
  • یک کاربر دارای دسترسی sudo روی هر دو سرور
  • فعال بودن فایروال UFW
  • دو دامنه یا زیردامنه که به سرورها اشاره کنند

در این آموزش از نام‌های زیر استفاده می‌کنیم:

نقش دامنه
سرور ارسال‌کننده لاگ client.example.com
سرور جمع‌آوری لاگ server.example.com

اگر از پارمین کلود (Parmin Cloud) استفاده می‌کنید، کافی است این دو رکورد DNS را در پنل DNS دامنه خود ایجاد کنید تا به IP سرورها اشاره کنند.

در ادامه آموزش، در دو ترمینال جداگانه به هر دو سرور متصل شوید تا مراحل پیکربندی را آغاز کنیم.


مرحله اول — نصب systemd-journal-remote

در این مرحله، بسته systemd-journal-remote را روی هر دو سرور نصب می‌کنیم. این بسته شامل ابزارهای لازم برای ارسال و دریافت لاگ‌ها است.

ابتدا مخازن سیستم را به‌روزرسانی کنید.

روی هر دو سرور اجرا کنید:

sudo apt update
sudo apt upgrade -y

سپس بسته موردنیاز را نصب کنید:

sudo apt install systemd-journal-remote -y

پس از نصب، روی سرور مرکزی سرویس دریافت لاگ را فعال کنید:

sudo systemctl enable --now systemd-journal-remote.socket

sudo systemctl enable systemd-journal-remote.service

دستور اول سرویس Socket را هم فعال می‌کند و هم بلافاصله اجرا می‌کند.

سرویس دوم فعلاً اجرا نمی‌شود، زیرا هنوز گواهی TLS برای آن ایجاد نکرده‌ایم و در مراحل بعدی آن را راه‌اندازی خواهیم کرد.

اکنون روی سرور Client سرویس ارسال لاگ را فعال کنید:

sudo systemctl enable systemd-journal-upload.service

در ادامه باید پورت‌های موردنیاز را در فایروال باز کنیم.

روی سرور مرکزی اجرا کنید:

sudo ufw allow 19532/tcp
sudo ufw allow 80/tcp
  • پورت 19532 برای دریافت لاگ‌ها توسط Journald استفاده می‌شود.
  • پورت 80 نیز برای دریافت گواهی TLS توسط Certbot موردنیاز است.

روی سرور Client نیز تنها کافی است پورت 80 را باز کنید:

sudo ufw allow 80/tcp

در پایان این مرحله، زیرساخت اولیه برای ارسال و دریافت لاگ‌ها آماده شده است.

در مرحله بعد گواهی‌های TLS را با استفاده از Let’s Encrypt ایجاد می‌کنیم تا ارتباط بین سرورها به‌صورت رمزنگاری‌شده برقرار شود.


مرحله دوم — نصب Certbot و دریافت گواهی‌های TLS

برای اینکه ارتباط بین سرور ارسال‌کننده لاگ و سرور مرکزی کاملاً رمزنگاری شود، باید برای هر دو سرور گواهی TLS دریافت کنیم.

در این آموزش از Let’s Encrypt استفاده می‌کنیم که یک مرجع صدور گواهی (CA) رایگان و معتبر است. ابزار Certbot نیز فرآیند دریافت و تمدید خودکار این گواهی‌ها را انجام می‌دهد.

نکته: مراحل این بخش روی هر دو سرور کاملاً یکسان است. تنها کافی است هنگام دریافت گواهی، نام دامنه مربوط به همان سرور را وارد کنید.

نصب Certbot

ابتدا روی هر دو سرور Certbot را نصب کنید:

sudo apt update
sudo apt install certbot -y

در Ubuntu 24.04 دیگر نیازی به فعال کردن مخزن Universe نیست، زیرا Certbot به‌صورت مستقیم در مخازن رسمی اوبونتو در دسترس قرار دارد.


دریافت گواهی TLS

روی هر سرور دستور زیر را اجرا کنید.

روی سرور Client:

sudo certbot certonly \
--standalone \
--agree-tos \
--email admin@example.com \
-d client.example.com

و روی سرور مرکزی:

sudo certbot certonly \
--standalone \
--agree-tos \
--email admin@example.com \
-d server.example.com

در دستور بالا:

  • certonly فقط گواهی را دریافت می‌کند و هیچ تغییری در وب‌سرور ایجاد نمی‌کند.
  • --standalone از وب‌سرور داخلی Certbot برای احراز مالکیت دامنه استفاده می‌کند.
  • --agree-tos شرایط استفاده Let’s Encrypt را به‌صورت خودکار می‌پذیرد.
  • --email ایمیلی است که اعلان‌های مربوط به تمدید گواهی برای آن ارسال می‌شود.
  • -d نام دامنه‌ای است که گواهی برای آن صادر خواهد شد.

پس از پایان موفقیت‌آمیز عملیات، فایل‌های گواهی در مسیر زیر قرار می‌گیرند:

/etc/letsencrypt/live/<your-domain>/

برای مثال:

/etc/letsencrypt/live/server.example.com/

دریافت گواهی‌های ریشه (CA)

برای اینکه کلاینت و سرور بتوانند اعتبار گواهی یکدیگر را بررسی کنند، باید گواهی‌های ریشه Let’s Encrypt نیز روی هر دو سرور وجود داشته باشد.

ابتدا فایل ترکیبی گواهی‌ها را دریافت کنید:

curl -s https://letsencrypt.org/certs/{isrgrootx1.pem.txt,letsencryptauthorityx3.pem.txt} \
> ~/letsencrypt-combined-certs.pem

سپس آن را در کنار فایل‌های گواهی قرار دهید:

روی Client:

sudo cp ~/letsencrypt-combined-certs.pem \
/etc/letsencrypt/live/client.example.com/

و روی سرور مرکزی:

sudo cp ~/letsencrypt-combined-certs.pem \
/etc/letsencrypt/live/server.example.com/

در پایان این مرحله، هر دو سرور دارای موارد زیر هستند:

  • کلید خصوصی (Private Key)
  • گواهی TLS
  • فایل شامل گواهی‌های ریشه Let’s Encrypt

در مرحله بعد، سرور مرکزی را طوری پیکربندی می‌کنیم که با استفاده از این گواهی‌ها، لاگ‌های ارسالی از کلاینت‌ها را دریافت و ذخیره کند.


مرحله سوم — پیکربندی سرور مرکزی جمع‌آوری لاگ

در این مرحله، سرور مرکزی را به گونه‌ای پیکربندی می‌کنیم که بتواند با استفاده از گواهی TLS ایجادشده در مرحله قبل، لاگ‌های ارسالی از کلاینت‌ها را دریافت و ذخیره کند.

سرویسی که مسئول دریافت لاگ‌ها است systemd-journal-remote نام دارد.

ابتدا فایل تنظیمات آن را باز کنید:

sudo nano /etc/systemd/journal-remote.conf

سپس بخش [Remote] را به شکل زیر ویرایش کنید:

[Remote]
Seal=false
SplitMode=host

ServerKeyFile=/etc/letsencrypt/live/server.example.com/privkey.pem
ServerCertificateFile=/etc/letsencrypt/live/server.example.com/fullchain.pem
TrustedCertificateFile=/etc/letsencrypt/live/server.example.com/letsencrypt-combined-certs.pem

در صورتی که از دامنه دیگری استفاده می‌کنید، مسیرها را متناسب با دامنه خود تغییر دهید.

بررسی گزینه‌های مهم

تنظیماتی که در بالا اعمال کردیم هر کدام وظیفه مشخصی دارند:

Seal

Seal=false

این گزینه مشخص می‌کند که آیا Journald برای جلوگیری از دستکاری لاگ‌ها از امضای رمزنگاری‌شده استفاده کند یا خیر.

اگر نیاز به بالاترین سطح امنیت و قابلیت اثبات عدم تغییر لاگ‌ها دارید، می‌توانید مقدار آن را روی true قرار دهید.

برای اکثر سناریوهای عملیاتی مقدار false کاملاً مناسب است.


SplitMode

SplitMode=host

این گزینه نحوه ذخیره لاگ‌ها را مشخص می‌کند.

با مقدار host، برای هر سرور یک فایل Journal جداگانه ایجاد می‌شود که مدیریت و بررسی لاگ‌ها را بسیار ساده‌تر می‌کند.

اگر تمام لاگ‌ها را در یک فایل واحد می‌خواهید، می‌توانید مقدار آن را برابر با:

SplitMode=false

قرار دهید.


ServerKeyFile

ServerKeyFile=/etc/letsencrypt/live/server.example.com/privkey.pem

مسیر کلید خصوصی سرور است که هنگام برقراری ارتباط TLS استفاده می‌شود.


ServerCertificateFile

ServerCertificateFile=/etc/letsencrypt/live/server.example.com/fullchain.pem

این فایل شامل گواهی TLS سرور و زنجیره کامل اعتبار (Certificate Chain) است.


TrustedCertificateFile

TrustedCertificateFile=/etc/letsencrypt/live/server.example.com/letsencrypt-combined-certs.pem

این فایل شامل گواهی‌های ریشه Let’s Encrypt است که برای اعتبارسنجی گواهی کلاینت استفاده می‌شود.


تنظیم مجوز دسترسی فایل‌های TLS

به‌صورت پیش‌فرض، سرویس systemd-journal-remote اجازه خواندن کلید خصوصی Let’s Encrypt را ندارد.

ابتدا سطح دسترسی پوشه‌های گواهی را اصلاح کنید:

sudo chmod 755 /etc/letsencrypt/live
sudo chmod 755 /etc/letsencrypt/archive

سپس دسترسی فایل کلید خصوصی را تغییر دهید:

sudo chmod 640 /etc/letsencrypt/live/server.example.com/privkey.pem

در ادامه مالک گروه فایل را نیز تغییر دهید تا سرویس بتواند آن را بخواند:

sudo chgrp systemd-journal-remote \
/etc/letsencrypt/live/server.example.com/privkey.pem

راه‌اندازی سرویس دریافت لاگ

اکنون همه چیز آماده است و می‌توانید سرویس دریافت لاگ را اجرا کنید:

sudo systemctl start systemd-journal-remote.service

برای اطمینان از اجرای صحیح سرویس نیز وضعیت آن را بررسی کنید:

sudo systemctl status systemd-journal-remote.service

اگر همه چیز به‌درستی پیکربندی شده باشد، وضعیت سرویس باید Active (running) باشد.


در پایان این مرحله، سرور مرکزی آماده دریافت لاگ‌های رمزنگاری‌شده از سایر سرورها است.

در مرحله بعد، سرویس systemd-journal-upload را روی سرور Client پیکربندی می‌کنیم تا لاگ‌ها به‌صورت خودکار برای سرور مرکزی ارسال شوند.


مرحله چهارم — پیکربندی سرور Client

در این مرحله، سرور Client را طوری پیکربندی می‌کنیم که لاگ‌های سیستم را به‌صورت خودکار و از طریق ارتباط رمزنگاری‌شده TLS برای سرور مرکزی ارسال کند.

سرویسی که این وظیفه را برعهده دارد systemd-journal-upload است.


ایجاد کاربر اختصاصی سرویس

به‌صورت پیش‌فرض، سرویس systemd-journal-upload هنگام اجرا از یک کاربر موقت (Temporary User) استفاده می‌کند. این موضوع باعث می‌شود دسترسی دادن به فایل‌های گواهی TLS کمی پیچیده شود.

برای حل این مشکل، یک کاربر سیستمی دائمی با همان نام ایجاد می‌کنیم.

دستور زیر را روی سرور Client اجرا کنید:

sudo adduser \
--system \
--home /run/systemd \
--no-create-home \
--disabled-login \
--group \
systemd-journal-upload

این دستور یک کاربر سیستمی ایجاد می‌کند که فقط برای اجرای این سرویس استفاده خواهد شد.

پارامترهای مهم این دستور عبارت‌اند از:

  • --system کاربر را به‌عنوان یک کاربر سیستمی ایجاد می‌کند.
  • --home مسیر Home را مشخص می‌کند.
  • --no-create-home از ایجاد پوشه Home جلوگیری می‌کند.
  • --disabled-login اجازه ورود به سیستم را به این کاربر نمی‌دهد.
  • --group یک گروه همنام نیز ایجاد می‌کند.

تنظیم دسترسی فایل‌های TLS

اکنون باید دسترسی فایل‌های گواهی را تغییر دهیم تا این سرویس بتواند از آن‌ها استفاده کند.

ابتدا مجوز پوشه‌ها را اصلاح کنید:

sudo chmod 755 /etc/letsencrypt/live
sudo chmod 755 /etc/letsencrypt/archive

سپس مجوز فایل کلید خصوصی را تغییر دهید:

sudo chmod 640 \
/etc/letsencrypt/live/client.example.com/privkey.pem

در نهایت مالک گروه فایل را تغییر دهید:

sudo chgrp systemd-journal-upload \
/etc/letsencrypt/live/client.example.com/privkey.pem

ویرایش فایل تنظیمات

اکنون فایل تنظیمات سرویس را باز کنید:

sudo nano /etc/systemd/journal-upload.conf

محتوای بخش [Upload] را به شکل زیر تغییر دهید:

[Upload]
URL=https://server.example.com:19532

ServerKeyFile=/etc/letsencrypt/live/client.example.com/privkey.pem
ServerCertificateFile=/etc/letsencrypt/live/client.example.com/fullchain.pem
TrustedCertificateFile=/etc/letsencrypt/live/client.example.com/letsencrypt-combined-certs.pem

بررسی تنظیمات

URL

URL=https://server.example.com:19532

آدرس سرور مرکزی است که لاگ‌ها به آن ارسال خواهند شد.

در صورتی که از دامنه دیگری استفاده می‌کنید، این مقدار را تغییر دهید.


ServerKeyFile

ServerKeyFile=/etc/letsencrypt/live/client.example.com/privkey.pem

مسیر کلید خصوصی مربوط به کلاینت.


ServerCertificateFile

ServerCertificateFile=/etc/letsencrypt/live/client.example.com/fullchain.pem

مسیر فایل گواهی TLS کلاینت.


TrustedCertificateFile

TrustedCertificateFile=/etc/letsencrypt/live/client.example.com/letsencrypt-combined-certs.pem

این فایل شامل گواهی‌های ریشه Let’s Encrypt است که برای اعتبارسنجی گواهی سرور استفاده می‌شود.


راه‌اندازی مجدد سرویس

پس از ذخیره فایل تنظیمات، سرویس را مجدداً راه‌اندازی کنید:

sudo systemctl restart systemd-journal-upload.service

برای اطمینان از اجرای صحیح سرویس نیز وضعیت آن را بررسی کنید:

sudo systemctl status systemd-journal-upload.service

اگر همه چیز به‌درستی انجام شده باشد، وضعیت سرویس باید به‌صورت Active (running) نمایش داده شود.


در پایان این مرحله، سرور Client آماده است و لاگ‌های خود را از طریق یک ارتباط TLS رمزنگاری‌شده به سرور مرکزی ارسال می‌کند.

در مرحله بعد، صحت عملکرد کل سیستم را بررسی می‌کنیم و مطمئن می‌شویم که لاگ‌ها به‌درستی روی سرور مرکزی دریافت و ذخیره می‌شوند.


مرحله پنجم — بررسی عملکرد سیستم و تست ارسال لاگ‌ها

در این مرحله، مطمئن می‌شویم که سرور Client لاگ‌ها را به‌درستی برای سرور مرکزی ارسال می‌کند و سرور مرکزی نیز آن‌ها را بدون مشکل ذخیره می‌کند.


بررسی فایل‌های لاگ روی سرور مرکزی

تمام لاگ‌های دریافتی از کلاینت‌ها در مسیر زیر ذخیره می‌شوند:

/var/log/journal/remote/

ابتدا وارد سرور مرکزی شوید و محتویات این پوشه را مشاهده کنید:

sudo ls -lh /var/log/journal/remote/

اگر ارتباط بین دو سرور به‌درستی برقرار شده باشد، خروجی مشابه زیر مشاهده خواهید کرد:

total 16M

-rw-r----- 1 systemd-journal-remote systemd-journal-remote 8.0M Jul  1 10:46 remote-CN=client.example.com.journal

وجود این فایل نشان می‌دهد که Journald برای کلاینت یک Journal اختصاصی ایجاد کرده است.


ایجاد یک لاگ آزمایشی

اکنون روی سرور Client یک پیام آزمایشی تولید می‌کنیم.

برای این کار از ابزار logger استفاده می‌کنیم:

sudo logger -p syslog.debug "### TEST MESSAGE from client.example.com ###"

پارامتر -p سطح اهمیت پیام را مشخص می‌کند.

در این مثال از سطح debug استفاده شده تا پیام آزمایشی به‌راحتی قابل تشخیص باشد.


مشاهده لاگ روی سرور مرکزی

اکنون دوباره به سرور مرکزی برگردید.

از آنجایی که فایل‌های Journald به‌صورت Binary ذخیره می‌شوند، امکان مشاهده آن‌ها با دستوراتی مانند cat یا less وجود ندارد.

برای خواندن این فایل‌ها باید از ابزار journalctl استفاده کنید:

sudo journalctl \
--file=/var/log/journal/remote/remote-CN=client.example.com.journal

اگر همه مراحل به‌درستی انجام شده باشد، در خروجی پیام زیر را مشاهده خواهید کرد:

Jun 29 13:10:09 client.example.com root[3576]:
### TEST MESSAGE from client.example.com ###

این خروجی نشان می‌دهد که:

  • لاگ روی Client ایجاد شده است.
  • سرویس systemd-journal-upload آن را ارسال کرده است.
  • ارتباط TLS به‌درستی برقرار شده است.
  • سرور مرکزی لاگ را دریافت و ذخیره کرده است.

بررسی وضعیت سرویس‌ها

اگر پیام آزمایشی دریافت نشد، ابتدا وضعیت سرویس‌ها را بررسی کنید.

روی Client:

sudo systemctl status systemd-journal-upload

روی سرور مرکزی:

sudo systemctl status systemd-journal-remote

در هر دو حالت باید وضعیت سرویس به شکل زیر باشد:

Active: active (running)

بررسی لاگ خطاها

در صورت وجود مشکل، می‌توانید لاگ همان سرویس را نیز مشاهده کنید.

روی Client:

journalctl -u systemd-journal-upload -f

روی سرور مرکزی:

journalctl -u systemd-journal-remote -f

این دستورها لاگ‌های سرویس را به‌صورت زنده (Real-Time) نمایش می‌دهند و معمولاً علت خطا را مشخص می‌کنند؛ مانند:

  • مشکل در اعتبارسنجی گواهی TLS
  • اشتباه بودن نام دامنه
  • خطای دسترسی به فایل‌های Certificate
  • عدم دسترسی به پورت 19532
  • مشکلات مربوط به فایروال

در پایان این مرحله، سرور مرکزی شما با موفقیت لاگ‌های سیستم را از کلاینت دریافت و ذخیره می‌کند و زیرساخت Centralized Logging آماده استفاده در محیط عملیاتی است.


نتیجه‌گیری

در این آموزش یاد گرفتید چگونه بدون استفاده از ابزارهای جانبی مانند ELK Stack یا Graylog، تنها با امکانات داخلی systemd یک زیرساخت Centralized Logging امن راه‌اندازی کنید.

در این معماری، تمامی سرورها لاگ‌های خود را به‌صورت لحظه‌ای برای یک سرور مرکزی ارسال می‌کنند و ارتباط بین کلاینت و سرور نیز با استفاده از TLS رمزنگاری می‌شود تا محرمانگی و صحت داده‌ها حفظ شود.

در طول این راهنما موارد زیر را پیاده‌سازی کردید:

  • نصب و راه‌اندازی systemd-journal-remote
  • ارسال لاگ‌ها با systemd-journal-upload
  • دریافت و ذخیره‌سازی لاگ‌ها روی سرور مرکزی
  • دریافت گواهی SSL رایگان از Let’s Encrypt
  • برقراری ارتباط امن بین کلاینت و سرور با TLS
  • بررسی صحت ارسال لاگ‌ها و عیب‌یابی سرویس‌ها

مزایای این روش

این راهکار نسبت به بسیاری از سیستم‌های لاگ متمرکز، ساده‌تر و سبک‌تر است و برای بسیاری از زیرساخت‌ها کاملاً کافی خواهد بود.

مهم‌ترین مزایای آن عبارت‌اند از:

  • عدم نیاز به نصب Elasticsearch، Logstash یا سایر سرویس‌های سنگین
  • مصرف بسیار کم منابع سیستم
  • استفاده از قابلیت‌های داخلی systemd
  • انتقال امن لاگ‌ها با TLS
  • مدیریت ساده و نگهداری آسان
  • مناسب برای سرورهای لینوکسی در مقیاس کوچک و متوسط

پیشنهادهایی برای توسعه این زیرساخت

اگر تعداد سرورهای شما در آینده افزایش پیدا کرد، می‌توانید این زیرساخت را نیز توسعه دهید.

برای مثال:

  • اتصال Journald به Loki برای ذخیره‌سازی بلندمدت
  • نمایش لاگ‌ها در Grafana
  • ارسال هشدار هنگام رخداد خطاهای مهم
  • آرشیو خودکار لاگ‌های قدیمی
  • ایجاد چند سرور لاگ برای افزونگی (High Availability)

با پیاده‌سازی این معماری، تمام لاگ‌های سرورهای لینوکسی شما در یک نقطه متمرکز جمع‌آوری می‌شوند و فرآیند مانیتورینگ، عیب‌یابی و تحلیل رخدادها بسیار ساده‌تر و سریع‌تر خواهد شد.

از همراهی شما با پارمین کلود سپاسگزاریم.

Click to rate this post!
[Total: 0 Average: 0]

نظرات کاربران

دیدگاهی بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *