فهرست مطالب
  1. ۱. منابع: CPU، رم، دیسک و شبکه
  2. ۲. دیسک: پیش‌بینی، نه فقط درصد
  3. ۳. آپدیت‌ها و ریبوت معوق
  4. ۴. آنتی‌ویروس و فایروال
  5. ۵. سرویس‌ها، گواهی‌ها و ساعت
  6. ۶. لاگین ناموفق و تغییرات موجودی
  7. ویندوز و لینوکس کنار هم
  8. هشداری که تیم را خسته نکند
  9. به‌جای چک دستی هر روز
  10. پرسش‌های پرتکرار
    1. فاصلهٔ نمونه‌برداری منابع چقدر باشد؟
    2. با کدام مورد شروع کنیم؟
    3. پایش سرور جای پایش اپلیکیشن را می‌گیرد؟
  11. جمع‌بندی

بیشتر خرابی‌های سرور ناگهانی نیستند. دیسکی که امروز پر شد، دو هفته است با نرخ ثابت پر می‌شود؛ گواهی‌ای که امشب منقضی می‌شود، سه ماه پیش تاریخش معلوم بود؛ سرویسی که بعد از ریبوت بالا نیامد، از آپدیت ماه پیش منتظر همین ریبوت بود. فرق تیمی که شب آرام می‌خوابد با تیمی که مدام آتش خاموش می‌کند، معمولاً یک چک‌لیست ساده است که هر روز واقعاً دیده می‌شود.

این چک‌لیست برای سرورهای ویندوز و لینوکس است و برای هر مورد گفته‌ایم چه چیزی را و با چه آستانه‌ای باید دید. در آخر هم یک جدول مقایسه و چند نکته دربارهٔ اینکه هشدار چطور تنظیم شود که تیم از آن خسته نشود.

۱. منابع: CPU، رم، دیسک و شبکه

عدد لحظه‌ای تقریباً بی‌معناست؛ CPU صددرصد برای ده ثانیه هنگام فشرده‌سازی بکاپ طبیعی است. چیزی که مهم است، مقدار پایدار در یک بازه است: مثلاً CPU بالای ۹۰٪ برای ۱۰ دقیقه، یا رم آزاد زیر ۵٪ برای ۱۵ دقیقه. روی ویندوز page file و صف دیسک را هم ببینید؛ روی لینوکس load average را نسبت به تعداد هسته‌ها، و inode را که ممکن است پیش از فضای دیسک تمام شود.

نکتهٔ مهم‌تر، داشتن خط مبنا است. سرور دیتابیسی که همیشه ۸۵٪ رم را مصرف می‌کند احتمالاً سالم است، چون SQL Server عمداً حافظه را نگه می‌دارد؛ ولی سرور وبی که معمولاً ۳۰٪ مصرف داشت و حالا روی ۸۰٪ ثابت مانده، ارزش بررسی دارد. پس تاریخچه را دست‌کم چند هفته نگه دارید تا بتوانید بپرسید «از کِی این‌طور شده؟». آستانه‌ها را هم برای هر نقش سرور جدا تعریف کنید، نه یک عدد برای همه.

# Linux
uptime                      # load average vs. nproc
free -m
df -h ; df -i               # space and inodes
iostat -x 5 3               # disk utilisation and await

# Windows (PowerShell)
Get-Counter 'Processor(_Total)% Processor Time','MemoryAvailable MBytes',
            'PhysicalDisk(_Total)Avg. Disk Queue Length' -SampleInterval 5 -MaxSamples 3

۲. دیسک: پیش‌بینی، نه فقط درصد

هشدار «۹۰٪ پر» روی یک درایو ۴ ترابایتی یعنی هنوز ۴۰۰ گیگابایت جا هست؛ روی یک درایو ۶۰ گیگابایتی یعنی شاید چند ساعت. سؤال درست این است: با نرخ رشد فعلی، کی پر می‌شود؟ رشد هفت تا چهارده روز اخیر هر درایو را بگیرید و روز پر شدن را تخمین بزنید. هر درایوی که کمتر از دو هفته تا پر شدن فاصله دارد، کار این هفته است. در کنار فضا، سلامت فیزیکی دیسک هم مهم است: روی لینوکس smartctl و روی ویندوز وضعیت گزارش‌شدهٔ دیسک‌ها.

۳. آپدیت‌ها و ریبوت معوق

سه عدد را برای هر سرور بدانید: چند آپدیت امنیتی نصب‌نشده دارد، آخرین نصب موفق کِی بوده، و آیا منتظر ریبوت است. سروری که آپدیت را نصب کرده ولی ریبوت نشده، در عمل هنوز آسیب‌پذیر است.

# Debian / Ubuntu
apt list --upgradable 2>/dev/null | grep -i security
[ -f /var/run/reboot-required ] && echo "reboot required"

# RHEL / Rocky
dnf updateinfo list --security
needs-restarting -r

# Windows: pending reboot flags
Test-Path 'HKLM:SOFTWAREMicrosoftWindowsCurrentVersionWindowsUpdateAuto UpdateRebootRequired'
Get-HotFix | Sort-Object InstalledOn -Descending | Select-Object -First 5

۴. آنتی‌ویروس و فایروال

آنتی‌ویروسی که نصب است ولی محافظت بلادرنگش خاموش مانده، یا امضایش دو هفته به‌روز نشده، فقط حس امنیت می‌دهد. روی ویندوز با Get-MpComputerStatus فیلدهای RealTimeProtectionEnabled و AntivirusSignatureLastUpdated را ببینید. وضعیت فایروال هم همین‌طور: پروفایلی که «موقتاً» برای عیب‌یابی خاموش شده، معمولاً ماه‌ها خاموش می‌ماند. روی لینوکس وضعیت ufw، firewalld یا nftables را بررسی کنید.

۵. سرویس‌ها، گواهی‌ها و ساعت

  • سرویس‌ها: هر سرویسی که StartType آن Automatic است ولی در حال اجرا نیست، روی ویندوز؛ و هر واحد failed در systemd روی لینوکس. SQL Server یا IIS که بی‌صدا متوقف شده، معمولاً اول از زبان کاربر شنیده می‌شود.
  • گواهی‌ها: هر گواهی‌ای که کمتر از ۳۰ روز تا انقضا دارد، هم در مخزن گواهی ویندوز و هم گواهی‌های سایت‌ها و APIها.
  • ساعت: اختلاف چند دقیقه‌ای ساعت، احراز هویت Kerberos را می‌شکند، توکن‌ها را نامعتبر می‌کند و ترتیب رویدادها را در لاگ‌ها به هم می‌ریزد.
# Linux
systemctl --failed
timedatectl | grep -i synchronized

# Windows
Get-Service | Where-Object { $_.StartType -eq 'Automatic' -and $_.Status -ne 'Running' }
Get-ChildItem Cert:LocalMachineMy | Where-Object NotAfter -lt (Get-Date).AddDays(30)
w32tm /query /status

۶. لاگین ناموفق و تغییرات موجودی

حدس رمز روی RDP و SSH مدام در جریان است. هدف این نیست که هر لاگین ناموفقی را ببینید؛ هدف دیدن رگبار است: مثلاً بیش از ۲۰ تلاش ناموفق در یک دقیقه از یک آی‌پی، یا هر تلاش روی حساب Administrator و root. روی ویندوز Event ID 4625 و روی لینوکس journalctl -u ssh یا /var/log/auth.log منبع این داده‌اند.

موجودی سرور را هم فهرست کنید و تغییراتش را ببینید: نرم‌افزار تازه‌نصب‌شده، سرویس جدید، پورت تازه باز، و هر کسی که به گروه ادمین یا sudo اضافه شد. خیلی از این تغییرات کار همکاران است، ولی همین فهرست است که نصب ناگهانی rclone یا AnyDesk را لو می‌دهد. جزئیات این نشانه‌ها را در نشانه‌های اولیهٔ باج‌افزار روی ویندوز سرور نوشته‌ایم.

ویندوز و لینوکس کنار هم

موردویندوز سرورلینوکس
منابعPerformance Counters، page file، صف دیسکload average، free، iostat، inode
آپدیتWindows Update، کلید RebootRequiredapt / dnf / yum، فایل reboot-required
آنتی‌ویروسDefender (Get-MpComputerStatus)ClamAV یا EDR نصب‌شده
فایروالGet-NetFirewallProfileufw، firewalld، nftables
سرویس‌هاGet-Service، StartType Automaticsystemctl –failed
لاگین ناموفقEvent ID 4625 با آی‌پی مبدأauth.log یا journalctl برای sshd
ادمین جدیدEvent ID 4732، اعضای Administratorsتغییر گروه sudo یا wheel
سلامت دیسکوضعیت دیسک فیزیکیsmartctl
ساعتw32tmtimedatectl، chrony

هشداری که تیم را خسته نکند

بدترین سیستم پایش آن است که روزی صد پیامک می‌فرستد؛ چون هفتهٔ دوم کسی دیگر نگاهش نمی‌کند و پیامک صد و یکم، همان که مهم بود، هم دیده نمی‌شود. چند قاعده که در عمل جواب می‌دهد:

  • هشدار روی وضعیت پایدار، نه جهش لحظه‌ای.
  • یک مشکل، یک پیام؛ تا حل نشده دوباره نفرستید و وقتی حل شد خبر دهید.
  • شدت را جدی بگیرید: بحرانی پیامک می‌شود، مهم در داشبورد می‌ماند.
  • ساعت سکوت شبانه برای غیربحرانی‌ها، و ارجاع به نفر دوم اگر بحرانی تا چند دقیقه تأیید نشد.
  • سقف روزانهٔ پیامک، تا یک قانون اشتباه هم هزینه نتراشد و هم کانال را کور نکند.

همین منطق در دیتابیس هم صادق است؛ نمونه‌اش را در پر شدن لاگ ترنزکشن SQL Server ببینید.

به‌جای چک دستی هر روز

اسکریپت‌های بالا برای یک یا دو سرور کافی‌اند. وقتی تعداد سرورها به ده‌ها می‌رسد، یا شما شرکت پشتیبانی هستید و سرور چند مشتری را نگه می‌دارید، چک دستی روزانه دیگر واقع‌بینانه نیست. سرورماگ همین چک‌لیست را با یک سنسور سبک روی ویندوز سرور ۲۰۱۶ به بعد و لینوکس اجرا می‌کند: منابع هر ۱۵ ثانیه با نمودار تا یک سال، آپدیت و ریبوت معوق، آنتی‌ویروس و فایروال، سرویس‌ها و systemd، سلامت دیسک، انقضای گواهی‌ها، ساعت، لاگین ناموفق با آی‌پی مهاجم، و تغییرات موجودی. هشدارها با پیامک و webhook می‌رسند، با ارجاع، ساعت سکوت، یک پیام به‌جای صد پیام و سقف روزانه. سنسور فقط به بیرون وصل می‌شود، پورتی روی سرور باز نمی‌کند و عمداً هیچ دستوری روی سرورها اجرا نمی‌کند. فعلاً فقط سرور پایش می‌شود، نه سوییچ و SNMP. جزئیات در servermug.ir.

پرسش‌های پرتکرار

فاصلهٔ نمونه‌برداری منابع چقدر باشد؟

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

با کدام مورد شروع کنیم؟

اگر هیچ پایشی ندارید: پیش‌بینی پر شدن دیسک، سرویس‌های متوقف، و رگبار لاگین ناموفق. این سه بیشترین خرابی و نفوذ قابل پیشگیری را پوشش می‌دهند.

پایش سرور جای پایش اپلیکیشن را می‌گیرد؟

نه. سرور سالم ممکن است اپلیکیشنی داشته باشد که خطا می‌دهد. برای خطاهای سمت مرورگر باگ‌ماگ و برای لاگ بک‌اند لاگ‌ماگ مکمل این چک‌لیست‌اند.

جمع‌بندی

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