הקשחת שרתים במבט יותר עמוק

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

הדבר הראשון שצריך להבין לגבי ההקשחות זה שתלויות חיצוניות לא תמיד עוזרות או לא עוזרות הרבה. ה-Firewall שיש בחברה לדוגמא כמעט ולא רלוונטי לנושא. כן, הוא יכול לזהות שכתובת IP מסויימת מנסה להיכנס, דרך פורט מסוים, אבל ה-Firewall לא יודע ולא יכול לדעת אם הפורץ הצליח להיכנס, ואם הצליח, באיזה קבצים הוא נגע. בלינוקס יש דבר שנקרא access time לדוגמא שיכול לאמר איזה משתמש נגע באיזה קובץ ומתי, אבל אם הפורץ כבר יצא והמשתמש הלגטימי (עם אותו username) נכנס ועבר על הקבצים, אז הרבה פעולות פורנזיות לא יעזרו הרבה לדעת מי נכנס ובמה הוא נגע (מה עוד שבימינו פורצים רציניים משתמשים ב-VPN ושלל טריקים נוספים להחביא את זהותם כך שמאוד קשה לדעת מי בדיוק נכנס). ישנם כלים אחרים שעובדים עם חתימות שונות כדי לזהות כניסות דרך שיטות ידועות וזה עוזר, אבל שוב – לא תמיד זה יעזור ותיכף ארחיב על כך.

אם לקוח רוצה הקשחת שרת לינוקס, תהיה טעות מצידו לחשוב שמעבר על CIS Benchmark וכתיבת כמה חוקים ב-iptables יספקו. את זה כל אחד יכול לעשות, אבל ההסתכלות צריכה להיות פנימה והחוצה. איך אני מגן על השרת לא רק מתוקפים חיצוניים, אלא גם ממשתמשים פנימיים שאינם אנשים שאמורים להתעסק בקרביים של השרת.

אחת העבודות היותר מורכבות לפני שמגיעים למימוש CIS Benchmark היא עניין החבילות תוכנה שמותקנות על השרת. התקנת גירסת CentOS 7 לדוגמא בתצורה מינימלית מתקינה בסביבות 300+ חבילות. זה שאני יכול לבטל שרותים זה נחמד, אבל פורץ רציני יכול להפעיל את השרותים מחדש ברגע שהוא נכנס, ולכן העבודה הראשונית היא "כיסוח" של החבילות המותקנות שאין צורך בהן ובמקרים מסויימים קימפול מחדש של חבילות מסויימות ויצירת חבילות חדשות יותר מצומצמות על מנת להקטין כמה שיותר את וקטור התקיפה, ביטול גישת אינטרנט להתקנת חבילות ועוד ועוד. רק לאחר מכן אפשר לעבור לשלב מימוש ה-CIS Benchmark.

עוד נקודה שרבים שוכחים היא פורטים 80 ו/או 443. בד"כ הם פתוחים לעולם, וכאן גם מתרכזת בעיה רצינית: קיימים לא מעט סקריפטים שיתנו מעין shell גם אם ל-user שמריץ את שרת ה-web אין בכלל גישת shell מכיוון שלמודולים שרצים תחת אותו שרת web יש אפשרות לבצע דברים שונים הקשורים ל-shell. דוגמא נפוצה עם PHP היא [email protected] ומשם אפשר לבצע נזקים רבים, ולכן צריך לקחת בחשבון מה רץ בשרת ה-web ומה רץ "מאחורה", והכי חשוב – בדיקת ההזנה של המידע המגיע מהאינטרנט אל שרת האפליקציות לדוגמא (זהו החלק שקשור לצוות הפיתוח או מי שמריץ pen-testing).

עוד נקודה חשובה היא היכולת לזהות פורנזית אם מישהו פרץ – במה הוא נוגע. נכון, סביר להניח שחברה רצינית תכניס פתרון IPS/IDS כלשהו, אבל פתרון כזה אינו מסייע אם הפורץ הצליח להיכנס ולפתרון ה-IDS/IPS אין מושג ירוק מה הפורץ עושה בשרת עצמו. אפשר כמובן לגלות עם ה-IPS/IDS אם הוא מעלה/מוריד קבצים לשרת שהוא פרץ, אבל מה אם הפורץ מחליט למחוק קבצים? לשם כך יש צורך בפתרון שהוא בעצם Host IDS (כלומר: HIDS) שיודע לזהות את הדברים ולרשום במה הוא נגע, איזה process הוא הפעיל ועוד ועוד. שילוב פתרון כזה אפשרי אבל מצד שני יכול גם להאיט את ביצועי השרת ולכן אם הלקוח רוצה בפתרון כזה, יש להיערך לכך מבחינת שרתים שנותנים שרות, היכן יאוחסן המידע מהניטור ועוד ועוד.

והדבר הכי חשוב: לא חשוב מי עושה הקשחה לשרת שלכם, לא מדובר בעבודה של "אי בודד" (כלומר האינטגרטור מקבל IMAGE ועושה עבודה משלו, מגיש את ה-IMAGE המעודכן ותיעוד, מקבל כסף ולהתראות), אלא מדובר ב"פינג פונג" בין האינטגרטור למחלקות שונות בחברה. אני יכול להקשיח שרת לעילא ולעילא אבל אם הקוד שרץ על השרת הוא קוד שאינו בודק מה הוא מקבל בצורה רצינית – אז הפורץ יכול להיכנס למערכת די בקלות. אם אין שום Penetration testing, אז שוב – הפורץ יכול להיכנס בקלות. יש גם צורך בלעבוד עם ה-IMAGE כדי לראות האם יש צורך לשנות על מנת לקבל ביצועים יותר גבוהים, כמות clients יותר גבוהה, ועוד ועוד, כך שזהו תהליך שיכול לקחת ימים או שבועות, לא יום או יומיים וזה שונה מחברה לחברה.

לסיכום: בכל הקשור ללינוקס, אפשר להקשיח שרת בצורה מעולה, אבל זה מצריך עבודה ולא איזה סקריפט שישנה דברים פה ושם. אצל כל לקוח הדברים שונים, ויש דגשים שונים בין הצרכים. חשוב לזכור ששרת אינו עובד כדבר עצמאי ולכן יש לדאוג לחלקים נוספים, בין אם השרת רץ כשרת פיזי או VM אצלכם בחברה או רץ כקונטיינר(ים). אם אתם עובדים בענן, אז אחד הדברים בנוסף להקשחות שצריך לדאוג לגביהם – זה Firewall וכלי שנותן גם IPS/IDS כי ספק הענן לא מגן על שום דבר שיש לכם בענן – ומה שהכי חשוב – זה שיתוף פעולה בין מי שמקשיח לבין הצוותים השונים, על זה דברים יפלו או יקומו.

כמה מילים על ZFS (לשנת 2018)

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

כיום, אם חברה מסויימת רוצה לרכוש לעצמה סטורג' כפתרון קצה – היא בהחלט יכולה וישנם פתרונות טובים בשוק שיתנו לכם קופסא עם דיסקים, חיבורי רשת מאחורה, מערכת Appliance שרצה בתוך הקופסא עם ממשק WEB ו-CLI ועם פונקציונאליות בהתאם למחיר ולרשיון שרכשתם. פעם היו EMC, NetApp הכי פופולריים, היום יש מגוון שלם של מוצרים מוכנים – רק להרכיב, להגדיר מספר דברים מצומצם וקדימה – אפשר לעבוד עם הפתרון, ואלו פתרונות שיכולים להתאים לרוב החברות והעסקים.

היכן פתרונות אלו לא מתאימים? בחברות ובמחלקות שכן מחפשים "להתעסק" בפתרון האחסון. ברשותכם, אתן דוגמא פשוטה ודי שכיחה:

להלן צילום מסך מ-vSphere client בגירסה 5.5, כאשר מגדירים LUN חדש ובוחרים את ה-Block Size (לחצו להגדלה):

טעות מאוד נפוצה של עובדי IT היא להגדיר את גודל הבלוקים בגודל 8 מגהבייט מבלי להתייחס לתוכן שישב באותו Datastore. אם לדוגמא ישבו בו קבצים רבים קטנים (בגדלים של מאות קילובייט או מגהבייטים בודדים) אז מדובר בכך שהגישה לקבצים תהיה יותר איטית בהשוואה לדוגמא בבחירה בגודל של 1 או 2 מגהבייט והאיטיות תורגש במיוחד כה-Datastore גדול מאוד בעת כתיבה וכמובן שמדובר בבזבוז מקום.

במקרה לעיל, לא חשוב איזה Storage יש לך, מהרגע שהגדרת iSCSI LUN בסטורג', לסטורג' אין מושג ירוק מה אתה הולך לעשות איתו. מבחינתו זה Block ולך תשבור את הראש מה לעשות ואיך להגדיר ואיך לעשות אופטימיזציה לו ב-Initiator שלך.

במקרים אחרים אנחנו כן יכולים להגדיר את גודל ה-Block Size בפתרונות סטורג' המאפשרים לנו לאחסן קבצים ולהנגיש אותם דרך CIFS או NFS, כך שכשאנחנו "חותכים" חלק מהסטורג' לפונקציה זו, אנחנו יכולים להגדיר זאת וזה כמובן מומלץ בשביל לקבל ביצועים טובים.

אבל מה קורה אם אנחנו רוצים לבנות פתרון סטורג' משלנו ואנחנו מעוניינים לעשות לו אופטימיזציה ולא להיות "שבויים" באיזה פתרון שלא מאפשר לנו להגדיר דברים לעומק? אם אנחנו בונים עם לינוקס מערכת כזו עם File System כמו XFS או EXT4, מאותו הרגע שחילקנו את הדיסק עם או בלי LVM, ואנחנו מפרמטים את כל מערך ה-RAID בזמן ההתקנה, אז כבר אי אפשר לשנות את גודל הבלוקים. ב-XFS לדוגמא, ברירת המחדל היא להגדיר בלוקים בגודל 4K כל בלוק, אבל אם אנחנו הולכים לאחסן רק קבצים שרובם בגודל מס' ג'יגהבייטים, אנחנו נפסיד מהירות.

לעומת זאת ב-ZFS, גם אחרי ששייכנו את כל הדיסקים ל-Pool מסויים, אנחנו תמיד יכולים להגדיר את גודל הבלוקים (ב-ZFS זה נקרא record size) גם אחרי יצירת ה-Pool ויצירת Dataset (חשוב כמובן לשים לב שאם יצרנו Dataset ואנחנו מגדירים לו record size חדש, רק הקבצים החדשים יקבלו את גודל ה-record size החדש, לא הקבצים הישנים) כפי שניתן לראות לדוגמא כאן. (אגב, זה דבר שמאוד עוזר עם MySQL לדוגמא, אתם מוזמנים להציץ כאן)

נקודה נוספת וחשובה היא כמובן הדיסקים. ישנם עדיין מקרים רבים שיש שרתים פיזיים שמריצים אפליקציות מסויימות על דיסקים מקומיים עם כרטיס RAID הכולל זכרון Cache וסוללה, אך עם הדיסקים החדשים שיש כיום שמחירם יורד כל הזמן, יהיו לא מעט חברות שישמחו לקנות דיסקים בגודל 6,8,10,12 או אפילו 14 טרה בייט ויחברו אותם לבקר ה-RAID וכך הם יקבלו כמות אחסון מכובדת, אך יש בעיה מרכזית אחת: כל דיסק מעל גודל 4 או 6 טרהבייט שנדפק ומוחלף, יאיט אוטומטית את הביצועים של כל מערך הדיסקים לזמן רב (זה יכול לקחת ימים או במקרים של דיסקים גדולים כמו 10,12,14 טרהבייט – אפילו שבועות!) מהסיבה הפשוטה שבקר דיסקים הוא דבר די טיפש, הוא יודע לקרוא בלוקים, אבל הוא לא יודע מה יש בבלוקים, כך שבקר ה-RAID מבצע rebuild, הוא יעתיק את כל הבלוקים, גם אם 60% מהדיסק הוא בכלל ריק! לעומת זאת ב-ZFS אם נדפק דיסק והחלפנו אותו, מערכת ה-ZFS תשחזר (מה שנקרא: resilver) רק את הקטעים שלא קיימים בדיסק החדש, כך שה-rebuild יהיה הרבה יותר קצר והמערכת תשוב לאיתנה במהירות הרבה יותר גבוהה מאשר בתהליך rebuild של כרטיס RAID.

חסרונות נוסף שקיימים ל-XFS ול-EXT4 הם לדוגמא:

  • אין בדיקת קבצים מתמשכת. ב-ZFS לכל קובץ יש checksum כך ש-ZFS יודע בדיוק אם מה שהוא קרא תקין או לא ואם לא הוא יטפל בבעיה אוטומטית בכך שהוא יעביר את הנתונים למקום אחר (בערך כמו שבקר SSD טוב עושה) ול-ZFS ישנו גם תהליך scrubbing שעובר אחת לכמה ימים על כל הקבצים בדיסקים לבדוק זאת ולטפל בתקלות באופן אוטומטי. ב-XFS וב-EXT4 יש לך Journal שיכול לעזור בקריסת המכונה, אך זהו פתרון שאינו מספק על מנת לשמור על הנתונים.
  • ב-EXT4 וב-XFS אין מנגנונים לניצול משאבי המכונה מבחינת זכרון. כן, ללינוקס יש שימוש מתוחכם בזכרון החופשי לשם Cache מסוגים שונים, אבל ב-ZFS יש את ARC שלוקח כברירת מחדל מחצית מהזכרון של המערכת להאצת ביצועי דיסק בכך שהוא משתמש באותו זכרון שהוא "גזר" בהתחלה, וכידוע – זכרון RAM הוא הדבר הכי מהיר שיש, יותר מכל SSD שקיים בשוק.
  • שימוש מושכל ב-SSD וב-NVME: עם מערכת כמו bcache או fastcache (לאלו שאוהבים לחיות על הקצה) יכול להיות פתרון די טוב על מנת להאיץ ביצועים של דיסקים מכניים, אך ב-ZFS יש לך 3 מנגנונים שמטפלים בכך:
    • מנגנון ה-ARC (שמשתמש כברירת במחצית הזכרון של המכונה לשם CACHE מהיר)
    • מנגנון ה-ZIL (להאצת ביצועים וטרנזאקציות של קבצים קטנים ורישומי הפניות להיכן קבצים נכתבים, אפשר לקרוא על כך כאן)
    • מנגנון ה-L2ARC – כאן בד"כ יהיה SSD מהיר ששומר עותקים של קבצים שניגשים אליהם בתכיפות גבוהה.
  • מערכת ZDB – לכל File system יש כלים משלו (tune2fs ל-EXT3/EXT4 לדוגמא או ערימת הכלים הזו ל-XFS), אבל ZDB לוקח את זה כמה צעדים קדימה – לבדיקה האם יש Cache אופטימלי, לבדיקה של ביצועים פר דיסק, בדיקות והגדרות ל-B-TREE (כן, ZFS שומר את הקבצים ב-B-Tree) ועוד המון דברים. ZDB הוא ה"אולר השוויצרי" ל-ZFS ועבודה איתו יכולה לתת ביצועים שעוקפים מרחוק כל File System לינוקסי.

יחד עם זאת ל-ZFS יש עדיין חסרונות (שיטופלו בשנה הקרובה):

  • הוספת דיסקים: לא, אתה לא יכול להוסיף עוד דיסק אחד אלא 2 ומעלה. גם החלפת דיסקים קיימים בדיסקים יותר גדולים היא לא בדיוק פיקניק כרגע (אבל זה אפשרי). במהלך 2019 יתווסף קוד להוספה דיסקים – אפילו דיסק בודד כמעט מבלי שנצטרך להתמודד עם איטיות של פריסת DATA מחדש (יועתקו מספר בלוקים בודדים וזהו).
  • עבודה עם SSD – אחד החלקים היותר נחמדים ב-SSD זו פקודת trimfs שאומרת ל-SSD לבצע פקודת TRIM ב-SSD. ב-ZFS יש תמיכה ל-Trim אך היא אינה אוטומטית בגירסת ZFS ללינוקס. יש Pull request שיכול לעבוד ברוב המקרים בגירסה הנוכחית היציבה של ZFS ללינוקס, ובגירסת ה-Master זה עובד בצורה טובה. אני מאמין שבחודשים הקרובים זה יוכנס פנימה.

לסיכום: אפשר להקים שרת ZFS תוך דקות ספורות על מכונה חדשה. יוצרים pool עם תצורת RAIDZ רצויה, מחלקים דיסק SSD ל-2 פרטישנים (אחד log ואחד cache, ככלל עדיף 2 SSD שיעבדו כ-Mirror), מצמידים אותם ל-pool ויאללה – יש מערכת ZFS עובדת. העניין הוא שאם אתה רוצה ביצועים מעולים, תצטרך להשקיע זמן בהגדרות דברים לפי מה שרוצים להריץ ומה ה-ZFS צריך לשרת (ואני ממליץ את הספר הזה ל-ZFS על לינוקס, או את הספרון הזה). האם ZFS הוא פתרון חלופי לסטורג' סגור – במקרים מסויימים כן ובמקרים מסויימים לא (תלוי בדרישות ובצרכים), אבל הוא מאוד מתאים אם חברה מחליטה להקים סטורג' קטן והיא מוכנה להשקיע את שעות העבודה כדי לבצע אופטימיזציה וזה לוקח זמן (לפי הידע של מי שמבצע זאת), זה לא משהו שנעשה בחצי יום, וצריך לעיתים להקים מערכת שלמה כדי להגדיר לבדוק את הביצועים.

סטארטאפים ואבטחת מידע בענן

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

כמעט כל סטארט אפ מתחיל באדם אחד או 2 שבונים מעין אב טיפוס למוצר/שרות שהם מעוניינים לספק כחברה לכשיגדלו. לאחר שמשיגים מימון ממקורות שונים, בד"כ מתחילים לשכור מפתחים שיש להם גם קצת ידע בסיסטם או Devops (כן, אני יודע שזו מתודולוגיה, אבל בפוסט זה אני מתייחס לזה כמו רכזות כ"א שמסתכלות על זה, תזרקו עליי עגבניות אחרי זה) ובד"כ שוכרים איש Devops יעודי רק לאחר שיש כבר צוות פיתוח.

עד לשכירת איש Devops כל עבודות הסיסטם/אוטומציה/אבטחה וכו' נעשים ע"י מאן דהוא. זה יכול להיות יזם החברה שלמד פה ושם (או שהיה בעבר איש סיסטם), וזה יכול להיות אחד (או יותר) מאנשי הפיתוח – הכל תלוי בתקציב של הסטארטאפ וכמות הכסף שהוא השיג.

וכאן בדרך כלל מתחילות הבעיות הקשורות לאבטחת מידע.

לא מעט אנשים שמתחילים סטארטאפים חושבים להם שאם יקימו את התשתית שלהם בענן, ספק הענן יגן עליהם בצורות כלשהן וזו כמובן טעות ענקית. לא חשוב מי ספק הענן, כמות ההגנה המסופקת ללקוח היא ברמה אפסית (אינני מדבר על הגנות בתוספת תשלום כמו נגד DDoS). אתה יכול להפעיל Multi Factor Authentication כדי למנוע כניסת אנשים לא מורשים לחשבון בענן, אבל זה לא אומר כלום לגבי ה-Instances שאתה משתמש. מהרגע שיש לך Instance חי ויש לו כתובת IP ציבורית, עשרות אלפי סקריפטים ינסו לחדור לשרת שלך בכל דרך. כל שרות שתפעיל באותו Instance ושאינו סגור לכתובת הציבורית (כמו שרבים נוטים להשאיר פורטים פתוחים לשרותי SQL/NOSQL, GUI, או SSH עם סיסמא (ללא מפתחות) – הסקריפטים ינסו להיכנס, ואם הם יצליחו, חלקם יעבירו את המידע חזרה מבלי לנגוע במידע בשרת וחלק אחר של סקריפטים פשוט "יגייסו" את המכונה להריץ BOT או תולעים או 1001 דברים מזיקים אחרים ויש כמובן גם סקריפטים שישמחו פשוט למחוק את המכונה.

כשהסקריפטים מצליחים להיכנס ובעלי אותם שרותים נכנסים לפאניקה ורוצים לדעת מי נכנס ומה עשו, מתחילה הבעיה. כל עוד הפורץ נמצא או שהנוזקה נמצאת במכונה ורצה ב-Instance – ניתן לבצע פעולות פורנזיות שונות על מנת לגלות דברים (ויש לא מעט חברות שנותנות את השרות הזה בארץ), אולם מהרגע שפורץ נכנס, שהה ויצא, קשה מאוד לדעת בוודאות באלו קבצים הוא נגע, במיוחד אם הוא לא יצר שום קובץ. אפשר כמובן להסתכל מה הקבצים שהמשתמש ניגש אליהם לאחרונה ואפשר להסתכל על קובץ bash_history. של אותו משתמש לדוגמא, אך אם הפורץ לדוגמא מחק את ההיסטוריה, זו בעיה שאולי חברה שנותנת שרותים פורנזיים תוכל לסייע (אינני נותן שרותים פורנזיים) – כך שפריצות כאלו מצריכות הוצאת ממון רב ולא בטוח שהלקוח יקבל את מבוקשו.

לכן ההמלצה הראשונה שלי לכל סטארט אפ שכולל מס' קטן של מפתחים זה לקחת מישהו חיצוני שיעשה את עבודות הסיסטם ואבטחת מידע ברמה מספקת של הגנה כלשהי על התשתית. הגנה ברמה גבוהה מצריכה הרבה עבודה בכל מיני אספקטים כמו API, שרתי Web שנותנים את השרות, TLS ודברים רבים אחרים וכאן זה תלוי אם איש ה-Devops שלכם יודע לעשות זאת או שילוב של מישהו חיצוני שיעבוד יחד עם איש ה-Devops שלכם.

להלן מספר נקודות בסיסיות שיכולות לסייע לסטארטאפ בתחילת דרכו:

  • אם מדובר במספר עובדים בסטארטאפ אחד שיושבים במשרד כלשהו, דאגו ל-VPN וחברו את ה-VPN כ-Site To Site לחשבון הענן שלכם. מי שרוצה להתחבר מהבית, יתכבד הבחור ויתחבר ל-VPN שלכם ומשם לתשתית.
  • עבודה עם סיסמאות לכניסה לשרתי לינוקס היא no no. השתמשו במפתחות בלבד והחליפו את קבצי ה-PEM שניתנו לכם ע"י שרות הענן שלכם במפתחות שלכם בחלוקה של פרטי/ציבורי (עדיף ליצור עבור כל מפתח מפתח, להכניס את החלק הציבורי לשרת ואת החלק הפרטי למכונה של המפתח כך שאפשר לדעת מי נכנס עם איזה מפתח), כך שמי שצריך להיכנס למכונה יהיה לו את החלק הפרטי של המפתח (החלק הציבורי נמצא בשרת). קבצי ה-PEM למיניהם קל "לדוג" אותם מכל מיני פורומים, אימיילים ושאר מקומות.
  • מקימים DB? ראשית יש להקשיח את ה-DB לפני שמכניסים אליו נתונים. אם זה mysql לדוגמא, יש להריץ קודם כל mysql_secure_install, ואם זה mongoDB יש למחוק משתמש דוגמא,  ובכל המקרים יש לוודא כניסה רק דרך IP מסוים פנימי.
  • משתמשים בשרותים שונים של ספק הענן? ודאו שאתם משתמשים בכתובות IP פנימיות בלבד. זה לא מצליח? יש לכם בעיה עם ה-VPC (במקרה של אמזון), כדאי לבדוק הגדרות.
  • שימוש ב-DB – לפני שכותבים נתונים ל-DB, כדאי "להמליח" דברים כמו סיסמאות ומידע חשוב (להלן לינק לוידאו המסביר איך לעשות זאת ב-MySQL לדוגמא), כך שמי שיצליח לגנוב את ה-DB, לא יוכל לעשות הרבה עם זה. אפשר כמובן לשפר את זה ולהשתמש בכל מיני שרותי Vault לשמור את המפתח להמלחה אך זה כבר עניין אחר.
  • גיבויים ל-S3 או כל מקום ששומר Object Storage – לאחר יצירת הגיבוי, יש להצפין אותו ורק אז להעלות אותו (כמובן שכדאי לוודא שהרשאות ה-S3 שלכם מוגדרות בצמצום).
  • לא לקחת כתובות IP ציבוריות עבור כל Instance (טריק שלצערי ראיתי פעמים רבות שנעשה בחברות שונות). אם אין אפשרות להקים ולהשתמש ב-VPN ויש צורך להתחבר ממקומות שונים עם IP שונה, מומלץ להשתמש בטריק שנקרא Linux Bastion, זו מכונת לינוקס קטנה שבה נשתמש כ"מקפצה" (להלן לינק למאמר שמסביר זאת) ולמכונה זו יש להגדיר Security Groups עם הכתובות שיכנסו אליה (חשוב: לא להוסיף כל פעם כתובות אלא לעדכן ב-SG).
  • תעודות SSL – אם המכונה פונה החוצה ואין לכם עדיין תעודות SSL מסודרות, אפשר להשתמש ב-Let's Encrypt כדי ליצור תעודות SSL תקינות זמניות (שניתנות להארכה בפקודה פשוטה) במקום להשתמש ב-Self Signed Certificates. באותה הזדמנות כדאי לבטל Ciphers ישנים ולאפשר אך ורק ל-TLS מהגירסא האחרונה להיכנס.

לסיכום: לענננים ציבוריים יש שם של תשתיות רציניות ואבטחה גבוהה. זה מדבר על התשתיות הפנימיות לענן עצמו, לא ל-Instances שאתם מקימים או שרותים עצמאיים שאתם מקימים/בונים. אין לכם נסיון מספיק? קחו מישהו חיצוני, סכמו בנק שעות כך שיהיה למי לפנות אם יש תקלה. חשוב לשים לב להרבה דברים שצריך להגדיר כי בסופו של דבר הדבר האחרון שתרצו זה שיפרצו ויגנבו לכם מידע.

קצת על Windows ואוטומציה

תרשו לי להציג אבחנה אישית מעניינת: בחברות רבות שרוב השרתים הם שרתי לינוקס, סביר מאוד להניח שהוטמע בחברה פתרון אוטומציה כלשהו. בחברות אחרות שרוב השרתים הם שרתי Windows, הסיכוי למצוא אוטומציה כמעט מלאה כמו במקרים של לינוקס – הסיכוי הוא קטן עד בינוני. כמובן שברוב החברות יש סקריפטים שונים (ומשונים) לעשות עבודות כלשהן, אבל כשזה מגיע ל-Windows, בחברות רבות "נעולים" על ביצוע עבודה דרך GUI ורק אם אין ברירה – דרך סקריפטים (ב-Windows ברוב המוחץ של המקרים – PowerShell).

בלינוקס, קיימים מספר פתרונות האוטומציה מבוססי קוד פתוח כמו:

  • Chef
  • Puppet
  • Ansible
  • SALT

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

עד לאחרונה Ansible היה זמין בגירסת קוד פתוח לשימוש חופשי אך תוכנת הניהול הוובית היתה זמינה כקוד סגור בלבד (מה שכמובן לא מונע מאף אחד להשתמש במערכת ללא הממשק הוובי). מכיוון שרד-האט לא אוהבים להשאיר מערכות שהם קונים כסגורות, רד-האט החליטה לפתוח את הקוד של Ansible Tower (הממשק הוובי) תחת שם: AWX

אחד היתרונות הגדולים בגירסה האחרונה (2.5) של Ansible היא פתרון מלא ל-Windows. צריכים לעדכן שרתים? צריכים להוסיף אתר ל-IIS? צריכים להעביר קבצים? מעתה כל מה שצריך זה ליצור קבצי Playbooks פשוטים (לא, לא צריך לדעת לתכנת בשביל לכתוב Playbooks) ופשוט להריץ אותם. Ansible ירוץ במקביל לכל המכונות שהגדרתם ויבצע את העבודה. בתוך Ansible יש חלקים שנקראים מודולים שהם בעצם הקוד שירוץ על השרתים (דרך WinRM) והם כתובים ב-Python ולכן חלוקת העבודה יכולה להיות שמי שמבין בפייתון יכתוב מודולים והשאר יכתבו Playbooks בהתאם לצורך. אגב, יש תמיכה במערכות הפעלה אחרות, וירטואליזציה וגם חומרה.

להלן וידאו המדגים את היכולות החדשות על Windows. יכול להיות שתופתעו מכמה הדברים די פשוטים ויכולים לחסוך המון עבודה ידנית או שכתוב סקריפטים בכל פעם.

תכירו את Redfish

אני רוצה להכיר לכם את Redfish. בעקרון, Redfish זה API סטנדרטי לנהל כמעט כל דבר בתחום ה-IT, החל מ-SDDC (כלומר Software Defined Data Center) וכלה בשרתים, שרותים, מתגים ובקיצור כמעט כל דבר שניתן להתחבר אליו. Redfish משתמש בסטנדרטים קיימים (REST API, web services ופלט כ-JSON) על מנת לעשות את החיים הרבה יותר קלים למחלקת ה-IT בחברה.

אחד הדברים שצריך לדעת על Redfish שזה משהו ענק שמשתתפים בו כל המי ומי בתחומי הברזלים לדוגמא. לפוסט הזה, אני מעוניין להתרכז בתחום ה-OOB (שזה אומר כל ה-iDRAC/IMM/ILO/IMC למיניהם).

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

ועכשיו אשאל שאלה: כמה זמן יקח מהרגע שהשרתים יורדים מהמשאית עד שהם פועלים עם ה-OS/וירטואליזציה שבחרתם? אני מאמין שזה לא עניין של שעות, זה יהיה מינימום עניין של ימים עד שבועות. אחרי הכל, במקרים רבים יש צורך להכניס כרטיסים שונים לשרת, אולי לשנות את תצורת הזכרון, להתקין OS, להגדיר את ה-UEFI/BIOS, לחבר למתגים, להגדיר כתובות IP, VLAN וכו', , להגדיר RAID, לפרמט דיסקים, ועוד כמה וכמה דברים.

כשמדובר על כמות של 1-3 שרתים, זה לא כזה ביג דיל, אבל אם מדובר על פרויקט חדש והגיעו 20 שרתים.. אתם יכולים לדמיין את הכאב ראש.

וכאן החלק של ה-OOB ב-Redfish יכול לסייע לנו מאוד, כך שלאחר שהכנסנו את הכרטיסים וחיברנו את כבלי הרשת והחשמל, הדבר היחיד שנצטרך להגדיר זה את כתובת ה-IP ב-OOB שלנו ולוודא שיש PING ל-OOB. כל מה שנותר לנו לעשות פיזית זה להכניס את השרת לארון. את השאר נעשה מבחוץ.

איך? עם ה-API של Redfish. כאן לדוגמא תוכלו למצוא עבור שרתי Dell סקריפטים הן ב-Python או ב-PowerShell על מנת להשתמש עם ה-Redfish בחיבור ל-iDRAC לעשות כמעט הכל, החל מהגדרת UEFI/BIOS, שדרוגי קושחה, הגדרות iDRAC, הגדרות RAID ושלל ירקות נוספים.

הכל טוב, רק שיש בעיה אחת קטנה: יש לי 20 שרתים להקים, להתחיל לשנות כל פעם סקריפטים? לכתוב סקריפט wrapper שמריץ את הסקריפטים שניתנים באותו אתר? זה חתיכת כאב ראש.

נכון. בשביל זה יש דרך אחרת, אוטומציה מקבילית, ואני מדבר כמובן על Ansible.

מערכת Ansible יכולה לתת לנו להשתמש בסקריפטים הקיימים תוך שימוש ב-Playbooks, כך שכל מה שנצטרך בסופו של דבר להגדיר הם את אותם playbooks שנצטרך ועם Ansible אפשר להגדיר קבוצת (או כל) שרתים כך ש-Ansible יריץ עליהם את הסקריפטים במקביל כך שעבודה שהיתה דורשת מספר שעות (נניח עדכון קושחה לכל המכונות) יכולה לקחת דקות ספורות. (אגב, ניתן להשתמש בכלי אוטומציה אחרים אבל לפחות ממה שבדקתי, כל היצרנים נותנים playbooks ומודולים ל-Ansible, הרבה פחות לשאר). בנוסף, מכיוון שהסטנדרטים הם פחות או יותר אותם סטנדרטים לשרתים ולציודים שונים, ניתן בחלק מהמקרים להשתמש באותו playbooks ובאותם מודולים לעשות פעולות לשרתים מיצרנים שונים (רק אל תנסו לעדכן קושחות כך או שחצי מהשרתים יהפכו לברזלים יקרים ודוממים..)

לסיכום: Redfish נותן סוף סוף דרך "לדבר" בצורה מאובטחת עם הציודים שלכם דרך סקריפטים שונים שניתנים לשימוש באוטומציה. אפשר גם להגדיר כך הגדרות שונות וגם לקרוא לדוגמא מה-OOB את התקלות האחרונות מה-Log. אם נחכים להשתמש גם ב-PXE (אני דווקא ממליץ על IPXE במקום PXE, הוא הרבה יותר מהיר כי הוא עובד ב-HTTP ולא TFTP כך שניתן לעבוד מהר ובמקביל) נוכל גם להתקין בצורה אוטומטית תוך שימוש בכלים כמו kickstart או preseed להתקין מערכות הפעלה שונות בתצורה מינימלית ואת השאר לעשות עם Ansible (כן, כולל Windows, אסביר בפוסט הבא) ובכך לחתוך את הזמן להקמת השרתים בעשרות אחוזים וגם התחזוקה תהיה הרבה יותר מהירה ואוטומטית.

להלן וידאו הדגמה של Dell מכנס Red Hat Summit האחרון שנערך לפני ימים ספורים:

הסברים על SSD למשתמשים ביתיים ובחברות

הערה: המאמר הבא מדבר על SSD הן עבור משתמשים ביתיים אך גם לתחנות עבודה, דסקטופים ולאפטופים. הדברים שנכתבים כאן אינם מכוונים עבור SSD לשרתים ששם מדובר על דברים מעט שונים.

כל מי שמשתמש במחשבים בצורה רצינית ומבין בנושא בוודאי מכיר ושמע על SSD, הכוננים האלקטרוניים ששומרים את המידע על שבבי NAND (כלומר: Flash). היתרון העצום שלהם על כוננים מכניים הוא כמובן מהירות הגישה: פי 2-20 בהשוואה לכל כונן דיסקים מכניים.

הבעיה מגיעה לכך שכמעוניינים לקנות כונן SSD, ההיצע בשוק ענק, הטקסט השיווקי מטעה בלא מעט מקרים, ואפשר להוסיף על כך כל מיני הצהרות של אנשים טכניים שהיו נכונים לפני 6-9 שנים אך לחלוטין לא נכונים כיום (כן, קרה לי כבר פעם שמישהו מאוד בכיר טען בישיבה כי כונני ה-SSD לא יחזיקו מעמד 5 שנים. יש לי 4 כונני SSD בשרת ZFS שמחזיקים כבר 6 שנים של SanDisk בלי שגיאה אחת והם דווקא מהסוג הכי פשוט שיש!).

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

ניקח כונן SSD, ונפתח אותו. כך הוא נראה בצידו העליון:

כך נראה הכונן. בחלקו השמאלי יושבים מספר שבבי NAND שעליהם יאוחסן המידע. השבב עם ה-M (של חברת Marvell) הוא בעצם ה"מוח" של כונן ה-SSD. הוא הבקר שמצד אחד "מדבר" עם המחשב (החיבורים מימין) ומצד שני הוא האחראי לפריסת הנתונים על שבבי ה-NAND, תחזוקת הנתונים, טיפול בשגיאות, קריאה, כתיבה וכו'. במקרים רבים יש עוד שבב או יותר שמשמשים כזכרון חוצץ (Buffer) אשר מקבלים את הנתונים מבחוץ (אם לדוגמא אנחנו מעתיקים קובץ מבחוץ אל תוך ה-SSD) והבקר כבר דואג לקבל את הנתונים מהזכרון החוצץ ולפרוס אותם אל שבבי ה-NAND. יש עוד פעולות כמו Garbage Collection ו-TRIM שלא ניכנס אליהם אבל הם דברים מאוד חשובים לאורך חיי ה-SSD.

נעבור מכאן לשבבי ה-NAND. אלו השבבים שבהם מאוחסנים הנתונים שלנו. בתוך כל שבב כזה נמצאים מיליוני תאים שמאחסנים את הנתונים והגישה אליהם נעשית דרך הפינים מתחת לשבב. ישנם מספר סוגי תאים (SLC, MLC, TLC, QLC) פרי פיתוח של השנים האחרונות וההבדל ביניהם הוא בעצם כמות הנתונים שאפשר לאכסן פר תא. SLC לדוגמא זה Single Level Cell, כלומר בכל תא אפשר לאחסן נתון אחד וה-SSD הראשונים היו בנויים מ-SLC, כך שהם היו מהירים מצד אחד, אך כמות המידע שהיה אפשר לאחסן – היתה קטנה. MLC הגיע לאחר מכן ולמרות ש-M זה Multi, כמות הנתונים שהיה אפשרי לאחסן היתה בעצם 2 נתונים בתא. (מדוע לא קראו לזה פשוט DLC ש-D הוא Dual, אין לי מושג ירוק). אחרי MLC הגיע TLC (שנמצא ברוב כונני ה-SSD בשוק היום לסקטורים שאינם שרתים) ששם אפשר לאחסן 3 תאים והאחרון (QLC) יכול לאחסן כמות נכבדה של 4 נתונים בתא אחד.

אחת הבעיות הכי מאתגרות בתחום ה-SSD ו-NAND היתה בעצם האפשרות לאחסן כמות גדולה (אני מדבר על תקופת ה-SLC ו-MLC). יש גבול לגודל שבב שאפשר לייצר (ככל שהשבב יותר גדול, הסיכוי לתקלות בו יותר גבוה, בגלל זה מעבדים ו-GPU הם יקרים), ולכן סמסונג (ולאחר מכן חברות אחרות) החלו לעבוד על טכנולוגיה חדשה – במקום ליצור תאים יותר ויותר קטנים על מנת להכניס נתונים רבים – לבנות לגובה, וזה מה שנקרא 3D. בהתחלה סמסונג יצאה עם שבב שיש בו בעצם 32 "שכבות" ולאחר מכן 64 שכבות וכרגע הם מתחילים לייצר 96 שכבות ועובדים על 128 שכבות, כאשר בין כל השכבות יש מעין "מוטות" ותקשורת בין השכבות והבקר כמובן יכול לגשת לכל השבבים ולכל השכבות.

עכשיו שיש כמות רצינית של תאים פר שבב, ניתן לעשות מאות ג'יגהבייט וטרהבייטים, אבל ישנה בעיה אחרת: זוכרים את ה-SLC/MLC/TLC/QLC? הזמן שלוקח לכתוב לאותם תאים הוא יותר ארוך ככל שמתקדמים מ-SLC ל-MLC, מ-MLC ל-TLC, ומ-TLC ל-QLC (כאשר QLC יהיה די איטי אך יותר מהיר מכונן מכני), ולכן ה-Buffer יכול לסייע ובעצם "להחביא" את האיטיות כאשר הכתיבה בפועל תיעשה בתוך ה-SSD ברקע (בעקרון, כונן SSD הוא הרבה יותר חכם מאשר כונן דיסקים מכני. כונן SSD הוא מחשב שלם בפני עצמו הכולל מעבד, זכרון וכו').

עכשיו שאנחנו מבינים באופן עקרוני מהו SSD ומה הם התאים שבתוכו, נכיר את סוגי ה-SSD. יש מס' סוגים, אך נתרכז ב-2 סוגים, ה"קופסא" וה"מקל".

נתחיל ב"קופסא" – אלו בד"כ כונני ה-SSD שאנחנו מכירים ללאפטופים ושיכולים כמובן להיות מחוברים לתחנות עבודה, דסקטופים וכו'. כל כונני ה-SSD הם בגודל אחיד של 2.5" (יש גם 3.5" אך הם מיועדים לסקטור השרתים והם עולים עשרות אלפי דולרים) והחיבור שלהם הוא חיבור SATA רגיל בדיוק כמו חיבור דיסק קשיח מכני (לאלו שיש להם מחשב ישן דסקטופ, ניתן לרכוש כמובן בזול מתאם בין 3.5" ל-2.5" ב-eBay ובאתרים אחרים, ובחלק מהמוצרים היצרן מוסיף מתכת להתאמה, כמו חברת Kingston). אין צורך בדרייברים על מנת לקבל פעילות של כונן ה-SSD (אך יכול להיות שתצטרכו תוכנה מסויימת, עליה אדבר בהמשך). דיסק SSD כזה הוא דבר מעולה לאלו שיש להם מחשבים ניידים עם דיסקים מכניים והם מעוניינים להשביח את המחשב הנייד שלהם. ישנן מספר תוכנות חינמיות שיכולות להעביר את הנתונים מהדיסק המכני לדיסק SSD (לשם כך תצטרכו לרכוש מתאם USB ל-SATA על מנת לחבר את כונן ה-SSD בחוץ ולהשתמש בתוכנה להעביר את הנתונים ורק לאחר מכן להעביר את ה-SSD לתוך המחשב הנייד).

חוץ מגירסת ה"קופסא" יש לנו את גירסת ה"מקל" – אלו בעצם כונני SSD בתצורה שמתברגת על לוח האם של המחשב (ושל מחשבים ניידים חדשים, בחלק מהמקרים). מדובר ב"מקל" ברוחב 22 מ"מ ובאורך 80 מ"מ (יש גם גירסה של 110 מ"מ) שאותו אנחנו מחברים לחיבור מיוחד ומבריגים. החיבור נראה כך:

כפי שאתם יכולים לראות: ישנם "חורים" היכן שנמצאים הפינים של ה"מקל" והם מאוד חשובים. בכרטיסים עם 2 חורים, ה"מקל" הוא בעצם SSD בחיבור SATA, כלומר המהירות שלו תהיה בדיוק כמו קופסת SSD בחיבור SATA והיתרון היחיד שלו הוא בעצם שהוא לא תופס מקום פיזי במחשב מקדימה. לעומת זאת, אם יש חור אחד, אז מדובר במקל NVME SSD שהוא מהיר פי 4-6 מכונן SSD SATA (ולפיכך הוא גם עולה יותר).

עוד סוג חיבור שיש הוא חיבור ה-U.2, הוא מופיע בריבוע הכחול בתמונה:

חיבור זה הוא חיבור PCIe, כלומר הוא בדיוק כמו חיבור NVME SSD רק שהוא יותר מיועד לכונני SSD שיושבים במחשב דסקטופ מקדימה. החיבור הזה קיים רק בחלק מהלוחות אם החדשים והיקרים והוא מצריך כונן SSD "קופסא" עם חיבור PCIe (בד"כ בקופסת ה-SSD יהיה כבל מתאם מיוחד).

עכשיו שאנחנו מכירים גם את החיבורים וסוגי ה-SSD, נשאלת השאלה: איזה לרכוש? והתשובה, כצפוי, קצת מפותלת..

אם אתם משתמשים שכל מה שאתם עושים זה גלישה באינטנרט, הפעלת אפליקציות Web, קצת אופיס, ודברים שלא ממש גורמים למחשב שלכם "להזיע" – אז כיום כמעט כל כונן SSD יכול לתת לכם מענה. ככלל, אם קונים, אני ממליץ ללכת על גודל של 500 ג'יגהבייט ומעלה (אם התקציב מאפשר זאת).

לאלו שיותר מפתחים אפליקציות, או עובדים עם אפליקציות גרפיות כבדות (פוטושופ, עריכת וידאו, אפקטים, תלת מימד וכו') ולאלו שמעוניינים לקנות את ה-SSD הטובים בשוק, אני אציין מספר דגמים:

  • סמסונג – המלכה בשוק. דגמים של ה-960 וה-970, ה-PRO או EVO (ה-PRO יותר מהיר)
  • אינטל – ה-900P או ה-905P בסידרת ה-Optane. שימו לב שהם יקרים מאוד אך ה-905P הוא ה-SSD הכי מהיר שיש כיום בשוק נכון לשעת כתיבת שורות אלו. שימו לב – הפתרונות של אינטל יעבדו רק אם יש לכם מעבדי AMD Ryzen או i7/i5/i3 מהדור השביעי (Kaby Lake) או דור שמיני (Coffee Lake).
  • Western Digital – סידרת ה-Blue או Black בגירסת M.2 NVME.

אלו שלא מומלצים – אני בד"כ לא פוסל SSD כי כמעט תמיד יש סקטורים שזה יכול להתאים להם גם אם הם לא מהירים כל כך, אך במקרה של אינטל, סידרת ה-Optane Memory Series – בגדלים 16,32,64 ג'יגהבייט אני ממליץ לא לרכוש. הם מבחינה טכנית פשוט זבל וכל דיסק SSD מכל יצרן יתן ביצועים הרבה יותר גבוהים עם הפרשי מחירים זעומים.

אז בחרנו SSD ואנחנו מכניסים אותו למחשב. לפרמט ולהשתמש? כמעט. כלל חשוב הוא לא לפרמט את הדיסק לניצול 100% ממנו אלא רק 90%. הסיבה לכך פשוטה: במסגרת התהליכים שבקר ה-SSD מבצע, הוא בודק תאים לבדוק שהנתונים תקינים וכשהוא נתקל בנתונים שיש סיכוי שתהיה בעיה איתם בקריאה/כתיבה, הוא מעבר אוטומטית את הנתונים לחלק שלא פירמטנו והוא מסמן את המקום שממנו הוא העתיק כמקום לא שמיש, כך שאנחנו אולי מפסידים חלק מהמקום בדיסק, אך מצד שני אנחנו מאריכים את אורך חיי הדיסק, וזה שווה את המחיר.

האם כדאי לוותר על הדיסק המכני? התשובה שלי: לא. דיסק מכני הוא מצד אחד זול ומצד שני יכול להכיל הרבה יותר מידע מאשר SSD (סתם לידיעה, סמסונג 850 EVO בגודל 4 טרהבייט יעלה לכם בחו"ל 1500-1700 דולר). בד"כ יצרן ה-SSD יציע תוכנה יחד עם ה-SSD שתעביר את ה-Windows ל-SSD וידע לנטר את הדיסקים כך שנתונים שהקריאה שלהם שכיחה יועברו ל-SSD והנתונים שבקושי קוראים אותם ישארו בדיסק המכני. לאינטל יש תוכנה כמו RST שעושה זאת ול-AMD יש הסכם עם חברת Enmotus למכור תוכנה ב-20$ שנקראת FuzeDrive (היא אמנם מצריכה התקנה של Windows על ה-SSD מחדש, אבל היא עושה עבודה הרבה יותר רצינית מה-RST של אינטל), ויש כמובן תוכנות צד ג' בשוק ל-Windows (חלקן חינמיות). למשתמשי Linux – אם אתם משתמשים ב-LVM במחשב שלכם, אז ה-LVM יכול לקבל כונן או ווליום או Partition כ-Cache ואפשר כמובן להשתמש בדברים כמו bcache כדי לקבל את אותה תוצאה.

דברים נוספים שכדאי לדעת:

  • מעתיקים קבצים של כמה ג'יגהבייט כל אחד? אל תצפו לכתיבה מהירה לאורך כל ההעתקה ברוב כונני ה-SSD (למעט ה-900P/905P וה-970 PRO). הסיבה? הזכרון החוצץ (Buffer) מתמלא ומתחיל לכתוב את הנתונים לשבבי ה-NAND וברגע שאין זכרון פנוי, הכתיבה נהיית איטית.
  • עובדים בפוטושופ ופתחתם קובץ עם מאות שכבות? אם זה לא SSD מהמהירים – יכול להיות שזה יהיה איטי במעט. זיכרו: דיסקים SSD זולים הם טובים בהעברת נתונים רציפה כאשר מדובר בהעברת קובץ גדול, אולם כשיש לו עוד 200 קבצים נוספים, הוא יהיה איטי.
  • מחירים: מחירי ה-SSD יורדים אבל לאט. אם מחירי הדגמים שציינתי לעיל יקרים, אתם מוזמנים להתסכל דור אחד אחורה או לקרוא כל מיני אתרים שמציינים מיקומים שונים לכונני SSD ומחירים.
  • אחריות – כיום כמעט כל יצרני ה-SSD נותנים מינימום 3 שנות אחריות, אינטל וסמסונג בד"כ נותנים 5 שנות אחריות ולדגמים מסויימים אפילו 10 שנות אחריות. חשוב לכל ה-Corporate.
  • משתמשי לינוקס ובחירת File System – אין ממש הבדל. כיום גם XFS, EXT4, BTRFS תומכים בפרמטר mount או עם פקודת fstrim. מערכת ZFS לעומת זאת תתמוך בגירסה 0.8 בפונקציונאליות הזו (אם כי קיימים טלאים שאפשר להשתמש בהם).
  • קונים גירסה M.2 והולכים לגרום למחשב "להזיע"? חפשו ברשת קירור טרמי ל-M.2. אחד החסרונות של M.2 (בחלק מהמקרים) הוא כשה"מקל" חם מאוד – הביצועים יורדים על מנת לשמור עליו. הפתרון הזה לדוגמא, הוא פתרון טוב.

ומה העתיד? אינטל דוחפת חזק את פתרון ה-XPoint שלה שהוא כרגע המהיר ביותר בשוק (אבל גם היקר ביותר – ה-905P שלהם בגירסת ה-600 ג'יגהבייט עולה 1220$ והוא יותר מהיר מגירסת ה-Enterprise שלהם!) אבל סמסונג לא נמצאת מרחוק עם ה-Z-SSD שלהם שמציע ביצועי קריאה יותר מהירים מכל דבר אחר בשוק (ביצועי כתיבה, לא משהו בדור הנוכחי).
סביר להניח שבשנה הבאה נראה SSD מבוסס QLC (שזה 4 נתונים נכתבים/נקראים בכל תא). החסרון הענק שלו הוא מהירות הכתיבה שתהיה די "זוחלת" (בהשוואה ל-SSD אחרים), אבל מצד שני נוכל לרכוש SSD כאלו בגדלים של 4 ו-8 טרהבייט במחיר שלא מגיע לאלפי דולרים ובכך נוכל להחליף כוננים מכניים ב-SSD.

לסיכום: כונני SSD נותנים ביצועים הרבה יותר מהירים מכונני דיסקים מכניים, אבל הם גם "חיות" שונות וכדאי לשים לב להבדלים. השוק מוצף ב-SSD שונים ולכן כדאי לבצע מחקר קטן לפני ששולפים את כרטיסי האשראי. כדאי לשים לב להוראות יצרן לדברים כמו לא לפרמט SSD ל-100% ואם מדובר ב"מקל" M.2 לגבי עניין החום.

על לינוקס, VMWare וטעות הקשורה לחיישנים

ל-VMWare, ואת זה כולם יודעים – יש משפחה שלמה של מוצרים הקשורים לוירטואליזציה ורוב המנהלים של מערכות כאלו יאמרו ללא היסוס שהמוצרים טובים, החל מ-ESXi וכלה באוטומציה, תכנון משאבים וכו'. בד"כ הסיבה היחידה שרבים רוצים לעבור ממערכת כזו – היא המחיר ש-VMWare גובה עבור רשיונות שונים.

עד לגירסה 5 (גם 5.5) ב-VMware השתמשו בד"כ בדרייברים מבוססי לינוקס כדי להפעיל ציודים, בין אם מדובר בציוד זול או בבקרים יקרים מאוד. בגירסה 6 החליטו ב-VMWare לעבור לדרייברים שהם כותבים (או שהיצרן כותב) עם שינויים מהותיים בקוד כך שלא כל כך קל לקחת דרייבר של לינוקס ולזרוק אותו לגירסה 6 (ולפי השמועות, זה הולך להשתנות שוב בגירסה 7, אבל בינתיים אלו רק שמועות).

אם יש לכם שרתים שמריצים VMWare, אחד הדברים החשובים שתרצו לדעת הוא מה מצב החיישנים במערכת. מה הטמפרטורה של המעבד, דיסקים, ספק כח, חום פנימי בשרת, מצב תקלות זכרון ודברים כאלו ואכן, עד גירסה 6 של vCenter קיבלתם את המידע כולו בתצורת עץ. המידע הזה חשוב (וגם ניתן לקריאה על ידי תוכנת הניטור שלכם דרך SNMP). עד גירסה 6 ה-vCenter עשה משהו פשוט מאוד: הוא פנה לכל שרת ESXi שרשום ב-vCenter וקרא ממנו את הערכים. איך ESXi קורא את הערכים? בעזרת חבילה שכלולה בכל הפצת לינוקס שנקראת lm-sesors והיא קיימת בכל התקנה של שרת ESXi. החבילה הזו מעודכנת כל הזמן וכל עוד הקרנל בלינוקס מעודכן, תוכל לקרוא את כל החיישנים במערכת, וזה רץ על כל מערכת, בין אם מדובר במחשב נייד, בדסקטופ, תחנת עבודה או שרת מפלצתי.

בגירסה 6.5 ל-VMware "קפץ הפיוז" והם החליטו שה-vCenter (בין בגירסת Windows או VCSA) לא יקרא יותר את החיישנים מה-ESXi (שכבר יש לו את הנתונים שמתעדכנים כל 90 שניות), אלא יפנה אל ה-IPMI. למי שלא מכיר – בכל לוח אם של שרת יש רכיבים שנותנים ניהול מרחוק, אתם אולי מכירים את זה בשמות כמו ILO, IMM, iDRAC – וכולם בעצם מממשים פחות או יותר את סטנדרט IPMI לשליטה מרחוק על המכונה. הבעיה, כמו תמיד, שיש לא מעט מקרים שהמימושים הם לא ממש משהו או שהיצרן החליט להתעלם מחלק מסטנדרט ה-IPMI. אחרי הכל, למשתמש יש גישת CLI או גישת Web לניהול מרחוק, אז אפשר להחביא את המימוש העקום מתחת לשטיח.

וזה משהו שב-VMWare לא ממש התעמקו כנראה. מבחינתם, החל מגירסה 6.5, יש שרות שנקרא wbem ויש API לפונקציה שנקראת HostConfigManager.healthStatusSystem והיצרן צריך לכלול (או לשחרר) VIB שכולל את הגישה לניהול מרחוק של השרת, כך שבתאוריה המנהל יצטרך רק להכניס פרטי התחברות ל-IMM/IDRAC/ILO והמערכת תתחיל לקרוא את החיישנים ישירות מהניהול הרחוק.

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

איפה כל הטמפרטורות? הציודים? אה, ב-VMWare החליטו לצמצם את הרשימה רק לכאלו שנותנים מידע ב-Status. כמו שאתם רואים, יש פה לא מעט דברים מיותרים אבל גם לא מעט דברים חסרים (וכן, ה-VIB מותקן).

אז מה קורה פה? מי שיקרא את המאמר הזה יבין שגם אם הוא יתאמץ וינדנד ליצרן לקבל VIB מתאים, יגלה שזה לא יעזור. יש באג, ועד כה (יצא כבר 6.7) זה לא תוקן. המסקנה: רוצה לנטר את המכונות ושדרגת ל-vCenter 6.5 ומעלה? תתחיל לנטר את המכונות עצמם. איך? קרא כאן.

לסיכום: ב-VMware בחרו לממש רעיון של ניטור סנסורים דרך IPMI וזה היה רעיון גרוע. יצרני שרתים לא משקיעים הרבה בניהול גישה מרחוק (תסתכלו על עדכונים – רק כשיש מקרים קריטיים, לא שיפורים ולא כלום אחרי שהדור האחרון התחיל להיות מיוצר, חס ושלום שיפורים לדורות קודמים) וב-VMware אולי לא ידעו – אבל היצרנים גרועים במימוש IPMI סטנדרטי. חבל שה-Feature הזה הוכנס והפוקנציונאליות הקודמת הוסרה.

על בעיה X ופתרון Y

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

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

בשביל לייעץ לבעיה כמו שציינתי לעיל, צריך לשבת עם הלקוח הפוטנציאלי לפגישת יעוץ מלאה, ולשמוע ממנו את הדברים הבאים:

  • מה הפונקציונאליות שהוא מחפש
  • מה הפונקציונאליות שמאוד חשובה לו, ומה הפונקציונאליות שבשבילו זה יהיה "נחמד" אם קיים אך אותה פונקציונאליות אינה קריטית.
  • האם הוא מחפש פתרון Scale Up או Scale Out
  • האם הוא מחפש פתרון שישולב כ-Hyper Converge או שהוא מחפש פתרון של ברזלים נפרדים
  • ויש עוד לא מעט שאלות…

ההבדלים ביני (וכמובן אחרים), כיועץ ואינטגרטור בלתי תלוי (כלומר אחד שהוא אינו בעצם Reseller של ברזלים ממותגים) הם דברים חשובים כגון:

  • אינטגריטי – אם מישהו יבוא אליי ויבקש לדוגמא פתרון סטורג' Scale Out והדבר הכי חשוב לו זה iSCSI לדוגמא, אז אני אומר לו בפשטות שכרגע אין פתרון Scale Out בקוד פתוח (גם כמוצר מסחרי) שיש לו פתרון iSCSI ל-Scale Out בצורה טובה והוא יצטרך פתרון קנייני.
  • על מה הפתרון אמור לענות? לקוח רוצה X על מנת לפתור את בעיית Y. נעזוב לרגע את X, ונשמע מהלקוח מהו אותו Y. אין ספק, דרישותיו של הלקוח הן חשובות, אולם ברגע שמספרים לי מהו אותו Y, אז ניתן להעלות מספר פתרונות שיכולים לענות על Y וגם להתחשב בצרכי הלקוח.
    לדוגמא: ללקוח יש 20 מכונות VM שמשמשות לפיתוח והלקוח רוצה פתרון סטורג' עבורם Scale Up. במקרה כזה אני יכול להציע לדוגמא פתרונות מבוססים ZFS, בין אם כקוד פתוח נטו או מוצרים מסחריים ובהצעה שאגיש לו יוסבר מדוע הפתרון הזה טוב ויוצעו ללקוח מספר פתרונות מבוססים ZFS, כך שבסופו של דבר ה-Y הם אותם 20 מכונות VM וה-X יהיה פתרון מבוסס ZFS.

וכאן בעצם מגיעה השאלה המרכזית שלי…

לא לי ולא לאף פרילאנסר יועץ או אינטגרטור, אין מכונה לקריאת מחשבות, ולא קל "להוציא" מלקוחות פוטנציאליים את אותו Y. יחד עם זאת, בכל חברה, תמיד יש חיפוש לפתרונות לבעיות Y כלשהן, וכאן הייתי רוצה (ובוודאי פרילאנסרים אחרים) לשמוע מהן אותן בעיות Y שחברתכם מחפשת אליהן פתרון (מבוסס לינוקס או מבוסס קוד פתוח). אתם מוזמנים לענות כאן (ללא ציון שם חברה או פרטים מזהים אחרים של מקום עבודתכם) ואולי תקבלו הצעות מעניינות של פתרונות שונים ואם תרצו תוכלו לפנות למציע (כל פרילאנסר יכול כמובן לענות).

חושבים לשדרג את הפצת הלינוקס שלכם? קראו

כפרילאנסר, אני תמיד מחפש עבודות במגוון תחומים (יש רשימה ארוכה של נושאים שאני נותן בהם שרות, מי שרוצה, קורות חיים תמיד זמינים כאן), ולפעמים אני מקבל משימות שבהם הלקוח מעוניין לשדרג את הפצת הלינוקס. לפעמים זה לשרת אחד, לפעמים זה ל-Image של Appliance, ולפעמים מגיעים הפרויקטים של שדרוג שמהווה אתגר גדול – מעבר בין הפצת לינוקס X להפצת לינוקס Y כשאין תאימות (במיוחד שצריך להעביר קבצים בינאריים ללא קוד מקור…).

השדרוגים הכי קלים לביצוע הם בגרסאות minor version. בד"כ כל הפצת לינוקס שמכבדת את עצמה שומרת על תאימות בינארית מלאה כך שאם התקנת לדוגמא CentOS או RHEL גירסה 7.0 ושדרגת לגירסה 7.5, התאימות הבינארית תישאר לגמרי (למעט kernel modules חיצוניים שאותם יש צורך לשדרג, לפעמים בנפרד, אבל בלינוקס יש את GRUB ותמיד אפשר לחזור גירסת kernel אחורה על מנת להעלות את המערכת ולהשתמש ב-DKMS כדי לשדרג לקרנל האחרון באופן אוטומטי).

השדרוגים היותר בעייתיים הם גרסאות Major, נניח מגירסת RHEL 6 ל-RHEL-7 (אגב, RHEL-8 בטא יחל בקרוב). מי שיעיין בתיעוד של ההפצה (כן, יש הפצות שעושים חתיכת תיעוד – כמו SuSE ו-RHEL, ויש כאלו שכותבים תיעוד כמו מברקים) יוכל לראות מה הדברים שהשתנו ולהיערך בהתאם (כן, קרה לי כבר כמה מצבים שהזמינו אותי לאחר שניסו לשדרג מבלי לקרוא והמכונות תקועות..). חשוב לזכור: כל הפצות הלינוקס שוברות תאימות בינארית בצורה זו או אחרת כשמשדרגים גרסאות Major ואם אתה מתעקש להריץ קבצים בינאריים ישנים שלא נוצרו עבור המערכת החדשה, אז תצטרך להכיר מקרוב את ספריות ה-compat למיניהן (וגם זה סיפור לא קל, אם קבצי ה-DEB או RPM מתעקשים לקבל רק ספריות שונות). במקרים רבים יש גם שוני בקבצי קונפיגורציה או בכלל במערכת השרותים (כמו המעבר ל-SystemD). חברות יצרניות ההפצה אינן מאלו ש"יזרקו לקוחות לכלבים" בכל הנוגע למעבר והן מציעות באותה גירסת Major תאימות אחורה (לשרותי upstart לדוגמא) כך שהסקריפטים שלך ירוצו, אבל מומלץ בחום לנצל את ההזדמנות ולעשות פרויקט המרה של הסקריפטים לשרותים החדשים (לאחר השדרוג).

השדרוג היותר מאתגר הוא שדרוג בין 2 גרסאות שונות של אותה הפצת לינוקס (נניח RHEL 5 ל-RHEL 7). במקרים רבים, נסיון שדרוג של החלפת קבצי REPO והרצת YUM UPDATE לדוגמא יתנו מערכת שאולי תרוץ, אבל זו תהיה מערכת שעלולה כל רגע לקרוס, ולכן לא מומלץ לשדרג ב"קפיצות" כאלו כלל וכלל אלא להקים מערכת חדשה, להגדיר אחד אחד את השרותים שצריך, ואז להעביר את האפליקציות. ברוב המקרים גם קבצי הקונפיגורציה יצטרכו להשתנות (ובחלק מהמקרים גם המיקומים שלהם… אהלן Docker עם גירסת CE מול גירסת הפצה!), ולכן שדרוגים כאלו יכולים לקחת גם ימים ספורים (תלוי במורכבות אותה מכונה. יש לא מעט כאלו שהתקינו בעבר לפני מעבר לוירטואליזציה 30 שרותים שונים על מכונת לינוקס אחת, לך תמיר את זה לגירסת לינוקס מודרנית).

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

לכן, אני ממליץ לחשוב לגבי הנקודות הבאות:

  • עדכונים בתוך אותה הפצה (כלומר עדכוני אבטחה ובאגים) – לעדכן תדיר, אחת לשבועיים או אחת לחודש.
  • שדרוג הפצה לגירסת Major הבאה – להמתין מעט ולא לרוץ לעשות זאת מיד כשההפצה יוצאת (במיוחד כשמדובר ב-Ubuntu ששם לצערי כמות הטסטים שמבוצעים היא די זעומה, גם בגרסאות LTS, חטפתי מספיק Kernel Panic גם כזה LTS). חכו עם זה חודשיים שלוש.
  • לא לשדרג הכל במכה אחת! נכון, יש היום Ansible ו-Puppet ו-Chef ומאוד מתחשק להשתמש בכלים הללו לשדרג באופן אוטומטי, אבל יש סיכוי גדול שיחד עם אותה אוטומציה תקבלו מספר מכונות שלא יעבדו, ולכו תסבירו לבוס מדוע המכונות לא עובדות.
  • אם אין לכם מומחה לינוקס ויש לכם מס' מכונות לינוקס שאתם רוצים לשדרג לגירסה החדשה – קחו יעוץ חיצוני לפני השדרוג (אני מכיר מקרה שאיש סיסטם חשב שגירסת שרתים זה גירסת Desktop והוא פשוט הריץ sudo apt update && sudo apt dist-upgrade לכל מכונות הרינדור ופתאום לא היה להם שום מכונת רינדור) וקחו את הזמן לשדרג, לא עושים זאת במהירות.
  • מעבר בין הפצות לינוקס או מעבר "קפיצה" בין גרסאות ישנה מאוד לחדשה – עדיף להתחיל מאפס ולהעביר שרותים וקבצים וקבצי קונפיגורציה לאט ובזהירות. להשאיר את המכונה הישנה פועלת, להעביר, לעבור לחדשה (עוד לא למחוק את הישנה) ורק כשהכל תקין וכולם מאשרים שהשרותים שהם משתמשים פועלים – אז אפשר לכבות את המכונה הישנה ועדיף לא למחוק אותה.

לגבי מכונות דסקטופ/לאפטופים והפצות לדסקטופ – יצאה גירסה חדשה? אחלה, אל תרוצו לשדרג, תנו לזה חודש חודשיים עד שיתקנו את הבאגים, כי מה לעשות, יש לא מעט מצבים בהם שדרוגים שוברים דברים קיימים במחשב, קימפולים של היצרן שמשאירים Unresolved symbol (מה שגורם לאפליקציות לא לרוץ), או שסתם דופקים את כל ה-REPO הפנימי ובשום מקרה לא להשתמש בפרמטר force (אלא אם בא לכם לשרוף כמה שעות טובות ולדפוק את הראש בקיר). נקודה חשובה נוספת: משתמשים בכרטיס nVidia או כל ציוד שמצריך מודול בינארי? המודולים לא יהיו תואמים במרבית המקרים להפצה שיצאה רק אתמול, אז תמתינו בסבלנות.

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

שלח לחמך על פני המים

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

נתחיל בפרילאנסר: כמעט כל עצמאי (למעט אלו שמקושרים ועמוסים בעבודות נון סטופ) מכיר את הסיטואציה הבאה: לא חשוב כמה אתה מעולה בתחומים שאתה נותן בהם שרותים, לפעמים יש זמנים שהטלפון לא מצלצל, אין אימיילים נכנסים ובקיצור – אין שום לידים חדשים שאפשר לפתח אותם לכדי פרויקט, עזרה בתשלום, בנק שעות וכו'. מדינת ישראל, וזה לא סוד – לא ממש שמה קצוץ על עצמאים, ואם לא תשלם בקרוב ביטוח לאומי לדוגמא, תקבל התראה ולאחר מכן עיקול, וזה עוד החלק הקל. מה עושה עצמאי שאין לו במשך חודשיים שלושה עבודה נכנסת? הבנק רוצה תשלום משכנתא ו/או הלוואות, בעל הבית (אם יש) רוצה שכ"ד, הילדים צריכים אוכל ודברים נוספים ויש כמובן מסים. בקיצור, כשאין לידים ואין עבודה – הצרות מגיעות.

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

אישית נתקלתי ב-2 המצבים, גם כאשר חברות יצרו עמי קשר לשאול אולי אני מכיר מישהו שיכול לעשות עבודה X וכן.. גם לי קרה שהיו לי מס' חודשים שלא היתה עבודה. לכן ניסיתי לחשוב על פתרון כלשהו שמצד אחד פרילאנסרים יוכלו לרשום את עצמם ופרטיהם בתוך טופס Google Form ומצד שני את הפלט אוכל להעביר לכל מיני חברות שמחפשות מדי פעם פרילאנסרים וכך יווצרו כל מיני "שידוכים" בין דורשי עבודה לקבלני עבודות לפרילאנסרים. נוסיף את העובדה שגוגל די "מחבב" (מבחינת מיקומים) את הבלוג הזה, כך ש-2 הצדדים יכולים להרוויח מכך (אני בכל מקרה לא מחפש להרוויח כספים מכך, אבל לא אתנגד לפיתה עם שווארמה 🙂 ).

לפיכך, יצרתי טופס שנמצא כאן. בטופס הזה אתם ממלאים את הפרטים שלכם והם מתווספים לקובץ Google Sheets. אני מעביר קישור (שלא ניתן לעריכה) לחברות כך שהם יכולים לשמור את הקישור ובעת הצורך הם יכולים לחפש לפי מילות מפתח ולמצוא פרילאנסרים שנותנים שרות והם יכולים ליצור קשר במייל או בטלפון (אין חובה להשאיר מס' טלפון) עם הפרילאנסר ומשם לסכם תשלום, תנאים וכו' וכו'.

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

תודה,
חץ בן חמו
[email protected]