MaxSessions, MaxStartups או רישום מכשיר: איזה גבול SSH לבחור
MaxSessions סופר ערוצים בתוך תעבורה אחת, MaxStartups מגן על לחיצות ידיים לא מאומתות, ואף אחד מהם לא סופר מכשירים. קבעו קודם את ההבטחה.
שירותי מנהרה שמבטיחים מכשיר אחד לכל מנוי מקבלים את ההבטחה הזו מ-MaxSessions לעיתים רחוקות, והמבחן הראשון בדרך כלל מוכיח זאת. המנוי פותח תהליך ssh שני, הסשן הראשון ממשיך לרוץ, ושתי המנהרות נושאות תעבורה. כל אפשרות תצורה סופרת משהו אחר, ואף אחת מהן לא סופרת מכשירים. מתן שם להבטחה קודם הוא מה שהופך את הבחירה ביניהן לברורה.
מה כל אפשרות באמת סופרת
MaxSessions מגביל את מספר הסשנים הפתוחים שנושא חיבור רשת מאומת אחד. סשן כאן פירושו מעטפת, בקשת exec, תת-מערכת כמו SFTP או ערוץ דומה שמרובה בתוך תעבורת SSH אחת. קריאת ssh שנייה פותחת תעבורה שנייה, מאמתת מחדש ומקבלת הקצבה משל עצמה. מספר הסשנים של החיבור הראשון אינו רלוונטי לו.
MaxStartups מגביל חיבורים במקביל שעדיין לא אומתו, מבוטאים כסף התחלה, קצב וסף מלא. הוא קיים כדי שפרץ של לחיצות ידיים חצי-פתוחות לא יוכל לרוקן את משאבי הדמון לפני האימות. ברגע שלקוח מאמת, החיבור הזה מפסיק להיספר נגד MaxStartups והופך לסשן של מישהו. הוא מעולם לא היה מכסה לכל משתמש, והעלאתו אינה מאפשרת למנוי לעשות יותר.
כלל רישום מכשיר אינו אפשרות sshd כלל. הוא שייך למערכת כלשהי שמנפיקה פרטי גישה ועוקבת איזה מכשיר מחזיק בהם, כלומר הוא זקוק לרישום, מלאי וביטול ולא למונה. ערבוב הדרישה הזו בתצורת sshd הוא המקום שבו רוב התכנונים האלה נתקעים.
איפה MaxSessions מפסיק להיות מכסה
בלוק Match User משנה אילו ערכי תצורה חלים על אותו משתמש, ולכן זה המקום הטבעי לקבוע MaxSessions מחמיר יותר לחשבון שירות. מה שהוא לא יכול לעשות הוא לצבור בין חיבורים, כי האפשרות מוערכת לכל תעבורה בנפרד. שתי תעבורות מקבלות כל אחת את המגבלה שלה, והמשתמש נשאר עם כפול ממה שהבלוק מתיר.
העברה היא הפתעה נפרדת. העברת TCP אינה זקוקה לערוץ סשן, ולכן MaxSessions 0 יכול לאסור מעטפות ותת-מערכות ועדיין להתיר מנהרות -L ו-R-. שירות שרק מעביר ומתייחס למספר הסשנים כמכסת המנהרה שלו לא מודד דבר בכלל. ההתנהגות הזו מתועדת במדריך תצורת שרת OpenSSH, וכדאי לקרוא אותו לפני שמתכננים סביב שם של אפשרות.
הדפיסו את התצורה האפקטיבית ולא את הקובץ שאתם חושבים שנטען. הכללות ותיקיות drop-in אומרות לעיתים קרובות שהערך שבתוקף אינו הערך שערכתם.
MaxStartups מגן על הדמון, לא על המנוי
הצורה התלת-חלקית של MaxStartups מתארת כמה חיבורים לא מאומתים יכולים להתקיים לפני שהדמון מתחיל להפיל אחוז מהחדשים. צורת ברירת המחדל שלו קיימת מפני שחיבור SSH לא מאומת זול לפתוח ויקר להחזיק. זהו בקרת הגנת משאבים לשרת, והיא חלה על כולם בבת אחת.
העלאתו בזמן סערת התחברויות מחליפה הגנת דמון בקבלה, שזה לפעמים המחליף הנכון ותמיד מחליף מכוון. הוא לא עושה דבר למנוי שרוצה מנהרה שנייה, כי המנהרה הראשונה כבר מאומתת. ערבוב בין השניים מוביל לשינוי שמתקן את התסמין הלא נכון ומחליש את השרת בו-זמנית.
כשהתחברויות נדחות בפרצים, הביטו ביומן הדמון בהודעה שלפני האימות לפני שאתם נוגעים באחת משתי האפשרויות. ההודעה מציינת איזה שומר הופעל, והשומרים אינם ניתנים להחלפה.
משבצת לכל משתמש דורשת מצב משותף
מדיניות אמיתית של תעבורה פעילה אחת זקוקה להזמנה שנשמרת במקום כלשהו מחוץ ל-sshd. שלב הקבלה חייב לתפוס באופן אטומי את המשבצת של החשבון, לשחרר אותה כשהחיבור נסגר, לתת לה לפוג כשלקוח נעלם בלי לסגור, ולהחליט אם ניסיון חדש נדחה או מחליף את הישן. ההחלטה האחרונה היא החלטת מוצר, לא פרט טכני, כי החלפת מנהרה פעילה מנתקת מישהו.
ההזמנה צריכה להיות משותפת גם לכל שרת שמקבל את החשבון. שני מארחים עם מונים מקומיים עצמאיים אוכפים שתי מגבלות נפרדות, ומנוי שמתחבר מחדש דרך השער האחר מקבל משבצת שנייה בחינם. כל מה ששומר את המצב זקוק להתנהגות כשל משלו, כי מאגר שאינו נגיש לא צריך לנעול את כל המנויים בחוץ.
כדי לקיים הבטחה של מכשיר אחד, הנפיקו פרטי גישה נפרדים לכל מכשיר רשום ושלוטו ברישום ובביטול באותה שכבה. מפתח פרטי שהועתק עדיין מאמת את עצמו מכל מקום, ולכן הנפקת מפתח אחד לכל משתמש אינה הוכחה לכמה מכונות מחזיקות בו.
בדקו את המדיניות עם שני חיבורים אמיתיים
כתבו את מבחני הקבלה כפקודות לפני שכותבים את המדיניות. חמשת המקרים הם תעבורה שנייה שנפתחת כשהראשונה פעילה, כמה ערוצים בתוך תעבורה אחת, לקוח שרק מעביר פורטים, התחברות מחדש אחרי קישור שנפל, ואותו חשבון שמגיע לשער אחר.
קראו קודם את המגבלות האפקטיביות, ואז פתחו את החיבורים שהמדיניות אמורה לדחות. שני החצאים של המבחן הזה חשובים, ואף אחד מהם אינו תחליף לשני.
sshd -T | grep -iE "maxsessions|maxstartups|allowtcpforwarding|permitopen"
ss -tn state established '( sport = :22 )' | head
ssh -N -L 8080:127.0.0.1:80 [email protected]הריצו את פקודת המנהרה פעמיים בשני מסופים וספרו את החיבורים שהוקמו בפורט 22. אם שניהם נושאים תעבורה בעוד המדיניות שלכם טוענת לתעבורה פעילה אחת, המדיניות היא תיעוד ולא אכיפה. תקנו את הפער הזה בשכבת הקבלה, לא על ידי הורדת MaxSessions וקיווי שהתעבורה השנייה תבחין בכך.