איסוף לוגים מרכזי עם syslog-ng: TLS, Elasticsearch

כאשר הלוגים מפוזרים על פני שרתים שונים, שחזור אירוע הוא משימה קשה וגוזלת זמן. אנו מגדירים איסוף לוגים מרכזי באמצעות syslog-ng עם הצפנת TLS והעברה ל-Elasticsearch, כך שכל האירועים נמצאים במקום אחד. הצוות שלנו מספק את הפרויקט במפתח מלא—מביקורת ועד תמיכה—ומבטיח תשתית לוגים אמינה ומאובטחת.

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

לאחר תקרית דליפת מידע, לא הצלחנו לשחזר את ציר הזמן המלא — יומנים מחמישה שרתים היו מפוזרים בין auth.log, messages ו-journald. שחזור הכרונולוגיה לקח יומיים במקום כמה שעות, והניתוח הראה שעד 30% מההודעות הקריטיות אבדו עקב היעדר אחסון מרכזי. אז החלטנו לפרוס את syslog-ng — מיקום יחיד ומאובטח לכל היומנים. כיום, ה-MTTR לתקריות הקשורות ליומנים ירד מ-4 שעות ל-30 דקות. הזמן שנחסך בחיפוש יומנים לאחר הפריסה הוא עד 40%.

אנחנו משתמשים ב-syslog-ng בסביבת ייצור כבר למעלה מ-7 שנים. הכלי מבין את syslog RFC3164 ו-RFC5424, journald, קבצים ו-HTTP, וה-DSL שלו לטרנספורמציית הודעות גמיש יותר מזה של rsyslog. תיעוד רשמי מאשר את הבשלות של הפרויקט ואת התמיכה הקהילתית הפעילה. במהלך תקופה זו סיפקנו יותר מ-50 פרויקטים של איסוף יומנים מרכזי — מסטארטאפים ועד סביבות ארגוניות עם 500+ שרתים.

ארכיטקטורה בסיסית: לקוח → שרת

הלקוח (כל שרת בתשתית) שולח יומנים לשרת syslog-ng המרכזי דרך TLS. השרת מנתח לפי מקור, כותב לקבצים או מעביר ל-Elasticsearch.

תצורת לקוח:

# /etc/syslog-ng/conf.d/client.conf
source s_local {
    system();
    internal();
};

destination d_central {
    syslog(
        "syslog.example.com"
        port(6514)
        transport("tls")
        tls(
            ca-file("/etc/syslog-ng/ca.pem")
            cert-file("/etc/syslog-ng/client.pem")
            key-file("/etc/syslog-ng/client.key")
        )
        flags(no-multi-line)
    );
};

log {
    source(s_local);
    destination(d_central);
};

תצורת שרת:

# /etc/syslog-ng/syslog-ng.conf
@version: 4.5
@include "scl.conf"

options {
  time-reap(30);
  mark-freq(0);
  keep-hostname(yes);
  create-dirs(yes);
  dir-perm(0755);
  perm(0640);
};

source s_network_tls {
  syslog(
    ip(0.0.0.0)
    port(6514)
    transport("tls")
    tls(
      key-file("/etc/syslog-ng/server.key")
      cert-file("/etc/syslog-ng/server.pem")
      ca-file("/etc/syslog-ng/ca.pem")
      peer-verify(required-trusted)
    )
  );
};

template t_json {
  template(
    "$(format-json --scope rfc5424 --scope nv-pairs --exclude DATE --key ISODATE @timestamp=${ISODATE})\n"
  );
};

destination d_elasticsearch {
  elasticsearch-http(
    url("http://elasticsearch:9200/_bulk")
    index("syslog-${YEAR}.${MONTH}.${DAY}")
    type("")
    template(t_json)
    flush-lines(100)
    flush-timeout(10000)
  );
};

destination d_files {
  file(
    "/var/log/syslog-ng/${HOST}/${PROGRAM}.log"
    template(t_json)
    create-dirs(yes)
  );
};

filter f_error {
  level(err..emerg);
};

log {
  source(s_network_tls);
  destination(d_files);
  destination(d_elasticsearch);
  flags(flow-control);
};

# /etc/syslog-ng/conf.d/client.conf source s_local { system(); internal(); }; destination d_central { syslog( "syslog.example.com" port(6514) transport("tls") tls( ca-file("/etc/syslog-ng/ca.pem") cert-file("/etc/syslog-ng/client.pem") key-file("/etc/syslog-ng/client.key") ) flags(no-multi-line) ); }; log { source(s_local); destination(d_central); }; — כאשר החוצץ עולה על גדותיו, syslog-ng חוסם במקום להפיל הודעות. חיוני לזרמים קריטיים לביקורת.

טרנספורמציה וסינון

syslog-ng יכול לנתח יומנים מובנים דרך # /etc/syslog-ng/syslog-ng.conf @version: 4.5 @include "scl.conf" options { time-reap(30); mark-freq(0); keep-hostname(yes); create-dirs(yes); dir-perm(0755); perm(0640); }; source s_network_tls { syslog( ip(0.0.0.0) port(6514) transport("tls") tls( key-file("/etc/syslog-ng/server.key") cert-file("/etc/syslog-ng/server.pem") ca-file("/etc/syslog-ng/ca.pem") peer-verify(required-trusted) ) ); }; template t_json { template( "$(format-json --scope rfc5424 --scope nv-pairs --exclude DATE --key ISODATE @timestamp=${ISODATE})\n" ); }; destination d_elasticsearch { elasticsearch-http( url("http://elasticsearch:9200/_bulk") index("syslog-${YEAR}.${MONTH}.${DAY}") type("") template(t_json) flush-lines(100) flush-timeout(10000) ); }; destination d_files { file( "/var/log/syslog-ng/${HOST}/${PROGRAM}.log" template(t_json) create-dirs(yes) ); }; filter f_error { level(err..emerg); }; log { source(s_network_tls); destination(d_files); destination(d_elasticsearch); flags(flow-control); }; ו-flags(flow-control):

parser p_json {
  json-parser(prefix(".json."));
};
filter f_app {
  program("myapp");
};
rewrite r_add_env {
  set("production" value(".json.environment"));
};
log {
  source(s_network_tls);
  filter(f_app);
  parser(p_json);
  rewrite(r_add_env);
  destination(d_elasticsearch);
};

למה לבחור ב-syslog-ng על פני rsyslog?

הבחירה בין syslog-ng ל-rsyslog תלויה בצרכים שלך. syslog-ng מנצח כשצריך טרנספורמציה מורכבת של יומנים ואבטחה; rsyslog עדיף לניתוב פשוט עם ביצועים מקסימליים. להלן השוואה של מאפיינים מרכזיים.

קריטריון syslog-ng rsyslog
תחביר דמוי Python (קל יותר ל-DevOps) דקדוק מותאם אישית (עקומת למידה תלולה יותר)
מפענחים מובנים JSON, KV, CSV, syslog חלקי (דרך מודולים)
תפוקה (EPS) עד 50k לכל מופע עד 250k (אך עם פחות גמישות)
תמיכה ב-TLS מובנית (אישור הדדי) דרך מודול imtcp
פלט Elasticsearch טבעי (מנהל התקן http) דרך omelasticsearch (תצורה נוספת)

למקרה אמיתי: בפרויקט עם 200 שרתים עם דרישות PCI DSS, בחרנו ב-syslog-ng — היינו צריכים סינון גמיש ומשלוח מובטח. rsyslog לא הצליח להתמודד עם הטרנספורמציה של יומנים לא סטנדרטיים.

מדד ערך syslog-ng
תפוקה מקסימלית 50,000 EPS לכל מופע
זמן פריסה (20 שרתים) 1-2 ימים
הבטחת משלוח (עם בקרת זרימה) 99.9%
פרוטוקולים נתמכים syslog, journald, HTTP, Kafka

כיצד syslog-ng פותר את בעיית אובדן היומנים

בעיה: עומס יתר בערוץ או כשל בקבלת השרת מובילים לנפילת הודעות. syslog-ng מטפל בכך עם שני מנגנונים:

  • בקרת זרימה: חוסם את הלקוח כאשר החוצץ מלא.
  • חוצץ דיסק: אלגוריתם json-parser שומר יומנים לדיסק אם הזיכרון נגמר. הגדר עם kv-parser ו-parser p_json { json-parser(prefix(".json.")); }; filter f_app { program("myapp"); }; rewrite r_add_env { set("production" value(".json.environment")); }; log { source(s_network_tls); filter(f_app); parser(p_json); rewrite(r_add_env); destination(d_elasticsearch); }; .

למערכות קריטיות, אנחנו תמיד מפעילים את שניהם. הבטחת משלוח — 99.9% עם תצורה נכונה.

תהליך היישום: מה כלול

  • ניתוח תוכנית איסוף היומנים הנוכחית (מקורות, פרוטוקולים, מדיניות רוטציה).
  • עיצוב ארכיטקטורה: בחירת תוכנית TLS, הגדרת אשכול שרתים.
  • הגדרת לקוחות (playbook של Ansible לפריסה המונית).
  • תצורת שרת: מפענחים, מסננים, יעדים.
  • בדיקת כשלים: נתק את החשמל — ודא שאין אובדן יומנים במהלך הפסקת רשת.
  • תיעוד runbook וסקריפטים לניטור (מדדי Prometheus דרך exporter).
  • הדרכת צוות: כיצד להוסיף מקורות חדשים ולשנות תצורות.

ציר זמן: 3 עד 7 ימים בהתאם למספר השרתים (מ-5 עד 100). העלות מחושבת באופן אישי — צור קשר, נעריך את הפרויקט שלך תוך יום עסקים אחד.

טעויות נפוצות בהגדרת syslog-ng

  • שימוש ב-disk-buffer ללא buf-size — כל לקוח עם אישור חתום על ידי ה-CA שלך יכול לשלוח יומנים. סיכון אבטחה.
  • התעלמות מ-dir ביומנים — אינדקס אובד בעת הפעלה מחדש של השרת.
  • tls() אגרסיבי מדי ביעד Elasticsearch — גורם לבקשות HTTP תכופות ולהפחתת תפוקה. ערך אופטימלי: 10-50.

הניסיון שלנו: במשך שנים של עבודה עם syslog-ng, הקמנו איסוף מרכזי לפרויקטים מסטארטאפים ועד ארגונים עם 500+ שרתים. אנו מבטיחים תמיכה לאחר פריסה — SLA קבוע בחוזה.

הזמן יישום syslog-ng במפתח: נגדיר את השרת, נפרוס לקוחות על כל השרתים ונשלב עם Elasticsearch. קבל ביקורת יומנים מלאה עם עמידה בדרישות אבטחה. צור קשר לייעוץ — נעריך את הפרויקט שלך תוך יום עסקים אחד.