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

רק דבר אחד בזה מפחיד: לכבות את הסיסמה ולהישאר בחוץ. הנה הסדר שבו זה לא יקרה.

המפתח

נוצר במכונה שלכם, לא בשרת:

ssh-keygen -t ed25519 -C "work laptop"

ed25519 במקום RSA: קצר יותר, מהיר יותר ובלי שאלות על אורך. RSA דרוש רק אם צריך להגיע למשהו ישן מאוד; אז -t rsa -b 4096.

שווה לשים ביטוי סיסמה על המפתח: קובץ המפתח עלול להיגנב ממחשב נייד, ובלי ביטוי סיסמה הוא עובד מיד. לא תצטרכו להקליד אותו בכל פעם — את זה לוקח על עצמו ssh-agent, ובמערכות macOS וברוב מערכות לינוקס השולחניות הוא כבר רץ.

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

ssh-copy-id -i ~/.ssh/id_ed25519.pub user@203.0.113.25

אם ssh-copy-id אינו זמין, תוכן קובץ ה-.pub נוסף כשורה ל-~/.ssh/authorized_keys בשרת. ההרשאות חשובות: התיקייה .ssh 700, הקובץ 600, והבעלים הוא המשתמש. עם כל דבר אחר sshd מסרב בשקט לקרוא את הקובץ, וזו הסיבה הנפוצה ביותר ל«המפתח לא עובד».

הבדיקה שמכריעה

לפני שאתם מכבים משהו, פתחו חיבור שני בלי לסגור את הראשון:

ssh -o PasswordAuthentication=no user@203.0.113.25

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

כיבוי סיסמאות ומכשול לא מובן מאליו

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

sudo tee /etc/ssh/sshd_config.d/10-hardening.conf <<'EOF'
PasswordAuthentication no
PermitRootLogin no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LogLevel VERBOSE
EOF

העניין הוא ש-OpenSSH משתמש בערך הראשון שהוא מוצא לפרמטר, ולא באחרון כמו כמעט בכל מקום אחר. הקבצים ב-sshd_config.d נקראים לפי סדר אלפביתי, ותמונות הענן של Ubuntu שמות שם את 50-cloud-init.conf, שלעיתים קרובות מכיל PasswordAuthentication yes. הקובץ שלכם עם המספר 90 לא יעשה דבר במצב כזה: ההגדרה נראית במקומה בעוד הסיסמה ממשיכה לעבוד. מכאן המספר 10 — הוא נקרא מוקדם יותר.

מה באמת יצא אפשר לראות בלי לנחש:

sudo sshd -T | grep -Ei 'passwordauth|permitrootlogin|pubkeyauth'

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

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

sudo sshd -t && sudo systemctl reload ssh

sshd -t הוא חובה: שגיאת הקלדה בהגדרות יחד עם restart משאירה את השירות מושבת ואתכם בחוץ. וגם reload אינו קוטע הפעלות פתוחות.

Ubuntu 24.04: הפורט אינו במקום שאתם חושבים

מלכודת נפרדת ב-Ubuntu עדכניים: sshd מופעל שם דרך שקע של systemd. במצב הזה השורה Port ב-sshd_config אינה עושה דבר — השקע מאזין, לא הדמון. אם אתם משנים פורט, זה מה שצריך לערוך:

sudo systemctl edit ssh.socket

ו-ListenStream= (ערך ריק מאפס את הקודם) צריך לציין את הפורט החדש. הסימן שמסגיר זאת: ההגדרות שונו, השירות הופעל מחדש, והשרת עדיין עונה על 22.

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

למי בכלל מותר להיכנס

תוספת שימושית היא רשימה מפורשת:

AllowUsers deploy admin

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

דרך כניסה חלופית

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

  • מפתח שני ממכשיר אחר ב-authorized_keys;
  • עותק של המפתח הפרטי במנהל סיסמאות או בהתקן מוצפן;
  • גישת קונסולה בדוקה אצל הספק שלכם — VNC או טורית. בדוקה פירושה שנכנסתם דרכה לפחות פעם אחת, ולא ש«יש איפשהו כפתור בלוח».

ובעודכם שם, הביטו במה שכבר מונח ב-authorized_keys — גם של המשתמש שלכם וגם של root. מפתח זר שם שורד כל החלפת סיסמה ונשאר גישה פעילה.

ומה אחר כך

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