יום רביעי, אוגוסט 23, 2023

איך לעבוד עם לוגים של עשרות מקורות בלי לשבור את הראש יותר מדי, rsyslog for the rescue

כשאנחנו עובדים עם מחשבים אנחנו צריכים לאסוף ולבחון את המידע מהם,ישנם המון פורמטים והמון דרכים לעשות זאת.

אני בדר"כ משתמש בשיטה הישנה והטובה של שרת rsyslog שמקבל פלטי snmp ואפילו את הודעות המערכת המקומיות שלהם. ההודעות מכל הרכיבים שמספקים לוגים  מנתבים, NAS, מחשבים דביאן,מדפסות, מחשב centos ישן, מספר מחשבי windows, שרתי MS SQL, ומספר מערכות חכמות. בעבר הייתי דוגם את ה UPS שלי אבל זה הופסק כי ה UPS מת ולא החלפתי אותו עדיין.
 
כולם מוגדרים לשלוח העתק של הלוגים שלהם למחשב מרכזי המריץ rsyslog כשיש גישה. אני מתכן להחזיר רכיבי מערכת חשמל חכמה וגם ממנה לאסוף הודעות, אבל כרגע אין לי זמן לזה.
 
אני משתמש במתרגמים של הודעות במערכות שלא יכולות לשלוח הודעות rsyslog ברשת (קריאה מקובץ הזרקה לתוך rsyslog), אני משתמש בזה במערכות כמו וינדוס ששם להגדיר event-log-to-remote-syslog זה כאב ראש, אני נותן למתרגם לעקוב אחרי קבצי לוגים שנמצאים בתיקיות שונות, ואז ניתן להם לעבור על הקבצים הללו ולשלוח חלק מהודעות הללו לrsyslog מרוחק, אני בוחר לצנזר חלק מההודעות במקרים כאלה.

יש לי גם מערכת נוספת שאוספת קבצי לוגים בjson , מתרגמת אותם מ json למערכת סבירה ומעבירה אותם לrsyslog גם כן.

את הודעות המערכת של SQL Server אני לוקח ע"י שישמוש ב sp_readerrorlog ועוד מספר פקודות ישירות במקום להשתמש במודל הקנייני של syslog-ng  כי אני מעדיף שתהיה לי שליטה מלאה במה נלקח ואיך.
על מנת שנוכל לקבל הודעות צריך לטעון את המודול המתאים:
  # provides UDP syslog reception
  module(load="imudp")
  input(type="imudp" port="514")
  
  # provides TCP syslog reception
  module(load="imtcp")
  input(type="imtcp" port="514")
 
 בשביל TLS יש לנו קבוצת הגדרות אבל מספיק שתהיה לנו חותמת , אם אנחנו רוצים לבצע התחברות ע"י חותמת ניתן לעשות ע"י שימוש ב (זה חוסם אפשרות חיבור רגילה), הבעיה בגישה הזאת שאת ה CA שלנו לא בהכרח שיהיה ניתן להתקין בכל תוכנה, אני אישית לא משתמש בזה אחרי שראיתי שיש בעייה בציוד ישן עם הגישה הזאת :
# make gtls driver the default
$DefaultNetstreamDriver gtls

# certificate files
$DefaultNetstreamDriverCAFile /etc/rsyslog-keys/ca.pem
$DefaultNetstreamDriverCertFile /etc/rsyslog-keys/server-cert.pem
$DefaultNetstreamDriverKeyFile /etc/rsyslog-keys/server-key.pem

$ModLoad imtcp  # TCP listener
$InputTCPServerStreamDriverMode 1 #https://www.rsyslog.com/doc/v8-stable/concepts/ns_ossl.html#supported-driver-modes
$InputTCPServerStreamDriverAuthMode anon #https://www.rsyslog.com/doc/v8-stable/concepts/ns_gtls.html#supported-authentication-modes
$InputTCPServerRun 6514


צריך לפתוח את פורט 514 ו 6514 (במקרה של TLS) בשרת המארח, ולאפשר שליחת הודעות. ניתן לאבטח את התעבורה ע"י חותמת ורשימת כתובות מותרות לשלוח את ההודעות, אני אישית שולח הכל בתוך הVPN שלי ישירות.

בשרת המארח אני מקנפג את קבלת הלוגים  לפי סוגי החוקים.

למשל תיקייה עבור על מחשב ע"י שימוש ב template בפורמט הישן
  $template RemoteStore, "/var/log/remote/%HOSTNAME%/%timegenerated:1:10:date-rfc3339%"
  :source, !isequal, "corcky" -?RemoteStore
  & stop 
 
תייצר תיקייה לכל ההודעות של המחשבים שהם שונים מ corcky, זו השיטה הפשוטה ביותר בשביל להפריד בין הלוגים של המחשבים השונים.

בכל מחשב שאני צריך לשלוח ממנו את ההודעות אני מגדיר את rsyslog לשלוח העתק לשרת חיצוני, כשאין rsyslog כברירת מחדל אני מתקין agent המתאים לפי מערכת ההפעלה.  agent זה שם יפה ללקוח שיודע להעביר הודעות UDP פשוטות, כתבתי פעם כאלה אפילו ב bash בשביל להעביר הודעות. צריך לזכור שאם כותבים לקוח לבד, לא לחרוג ממגבלת ה MTU שלכם , אחרת דברים רעים יכולים להתקיים.
 
את התוכן על השרת המארח ניתן לשמור על שרת SQL, או מקומית בקבצי טקסט, או אפילו בקבצי journal אם אתם ממש אוהבים צרות.

אם משתמשים בחוקים ניתן להוסיף למשל שחלק מהדברים ישלחו התראת SMS או מייל , ע"י יצרת חוק מיוחד ב rsyslog, אנו שמים קובץ הגדרות קטן תחת /etc/rsyslog.d ומגדירים מה אנחנו רוצים שייקרה , בעבר השתמשתי ב omprog  אבל מצאתי שהשיתה הישנה הייתה לי הרבה יותר נוחה.

אם יש לנו קבצים שצריך לפרסר ניתן להשתמש במודל imfile ופשוט לדחוף את המידע ישירות, אני אישית לא משתמש בו בגלל עצלנות ומשתמש בפתרון שלי , כי אני רוצה להגדיר את ה severity ו facility בהתבסס על לוגיקה חיצונית.

בשביל לקנפג מערכת כזאת ויודעים מה רוצים לעשות, צריך משהוא בסדר גודל של יום עבודה (כי יהיו תקלות), אבל אם לא צריכים כל מני דברים מדובר בעבודה של שעתיים פחות או יותר.

אין תגובות: