ssh user@IP, למשל ssh root@203.0.113.10. בהתחברות הראשונה מאשרים את טביעת האצבע של השרת ומזינים סיסמה. מיד אחר כך כדאי ליצור מפתח עם ssh-keygen -t ed25519, להעתיק אותו לשרת עם ssh-copy-id ולבטל כניסה בסיסמה.SSH (Secure Shell) הוא הדרך הסטנדרטית להתחבר לשרת לינוקס מרחוק: חיבור מוצפן לשורת הפקודה של השרת, כאילו אתם יושבים מולו. כל מה שצריך הוא שלושה פרטים שמקבלים עם הקמת שרת הענן: כתובת IP, שם משתמש (לרוב root או ubuntu) וסיסמה או מפתח. הלקוח (התוכנה שמתחברת) מובנה היום בכל מערכות ההפעלה הנפוצות.
איך מתחברים ב-SSH מ-Windows?
ב-Windows 10 ו-11 מתחברים ישירות מ-PowerShell או מ-Windows Terminal, כי לקוח OpenSSH מותקן כברירת מחדל. פותחים PowerShell ומקלידים:
ssh root@203.0.113.10
אם מתקבלת הודעה ש-ssh אינו מוכר, מתקינים את הרכיב (PowerShell כמנהל):
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH.Client*'
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
החלופה הוותיקה היא PuTTY: מזינים את כתובת ה-IP בשדה Host Name, פורט 22, ולוחצים Open. PuTTY משתמש בפורמט מפתח משלו (.ppk), וכלי PuTTYgen ממיר אליו מפתחות OpenSSH. למי שמתחיל היום, OpenSSH המובנה פשוט יותר כי הפקודות זהות בכל המערכות.
איך מתחברים ב-SSH ממק או מלינוקס?
במק ובלינוקס פותחים את אפליקציית Terminal ומריצים את אותה פקודה - הלקוח מותקן מראש:
ssh root@203.0.113.10
# פורט שאינו 22:
ssh -p 2222 dana@203.0.113.10
בהתחברות הראשונה תופיע שאלה כמו "Are you sure you want to continue connecting (yes/no)?" עם טביעת האצבע של השרת. כשמקלידים yes, הטביעה נשמרת בקובץ ~/.ssh/known_hosts, ומעכשיו הלקוח יתריע אם השרת שעונה בכתובת הזו השתנה. מי שרוצה לוודא שאין "איש באמצע" יכול להשוות את הטביעה למה שמוצג בקונסולת השרת.
איך יוצרים מפתח SSH מסוג ed25519?
יוצרים מפתח עם הפקודה ssh-keygen -t ed25519, שעובדת זהה ב-PowerShell, במק ובלינוקס. היא יוצרת זוג קבצים: מפתח פרטי שנשאר אצלכם ולא נשלח לאף אחד, ומפתח ציבורי (סיומת .pub) שמתקינים על השרת.
ssh-keygen -t ed25519 -C "dana@office-laptop"
# Enter file in which to save the key: (Enter לברירת המחדל)
# Enter passphrase: (מומלץ להגדיר)
הקבצים נוצרים ב-~/.ssh/id_ed25519 וב-~/.ssh/id_ed25519.pub (ב-Windows: C:\Users\<שם>\.ssh\). ה-passphrase מצפינה את המפתח הפרטי על הדיסק, כך שגניבת המחשב לא מספיקה כדי להיכנס לשרת. כדי לא להקליד אותה בכל חיבור, משתמשים ב-ssh-agent (במק - גם דרך ה-Keychain).
| סוג מפתח | המלצה | הערות |
|---|---|---|
| ed25519 | ברירת המחדל המומלצת | קצר, מהיר ונתמך בכל שרת מודרני |
| RSA 4096 | רק למערכות ישנות | נתמך בכל מקום; מפתחות RSA קצרים מ-2048 ביט אינם מומלצים |
| ECDSA | אפשרי | אין סיבה מיוחדת להעדיף על פני ed25519 |
| ed25519-sk | לאבטחה מוגברת | מפתח שקשור למפתח חומרה (FIDO2/YubiKey) |
איך מעתיקים את המפתח לשרת?
במק ובלינוקס הדרך הקלה היא ssh-copy-id, שמתחברת פעם אחת עם סיסמה ומוסיפה את המפתח הציבורי לקובץ ~/.ssh/authorized_keys בשרת:
ssh-copy-id dana@203.0.113.10
ב-Windows אין ssh-copy-id, אבל שורה אחת ב-PowerShell עושה את אותו הדבר:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh dana@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"
עכשיו ssh dana@203.0.113.10 אמור להתחבר בלי סיסמת שרת. רק אחרי שווידאתם זאת - בחלון נפרד - בטלו כניסה בסיסמה ובהתחברות root, כפי שמפורט בצ'קליסט אבטחת שרת לינוקס. אצל ספקי ענן רבים, כולל אצלנו, אפשר גם להזין את המפתח הציבורי כבר בזמן הקמת השרת, וכך הוא עולה בלי סיסמה בכלל.
איך משתמשים בקובץ ~/.ssh/config כדי לחסוך הקלדה?
הקובץ ~/.ssh/config מאפשר לתת לכל שרת כינוי קצר עם כל הפרמטרים שלו, כך שבמקום פקודה ארוכה מקלידים ssh web1. הוא עובד זהה ב-Windows, במק ובלינוקס.
Host web1
HostName 203.0.113.10
User dana
Port 22
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ServerAliveInterval 60
Host db1
HostName 10.0.0.5
User dana
ProxyJump web1
שתי הגדרות שכדאי להכיר: ServerAliveInterval שולח "פינג" כל דקה ומונע ניתוק של חיבור שקט ברשתות משרדיות, ו-ProxyJump מאפשר להגיע לשרת פנימי (למשל מסד נתונים ללא IP ציבורי) דרך שרת אחר, בלי לפתוח אותו לאינטרנט. הכינויים עובדים גם עם scp, rsync ו-VS Code Remote-SSH.
איך לא להקליד את ה-passphrase בכל חיבור?
משתמשים ב-ssh-agent, תהליך רקע שמחזיק את המפתח הפתוח בזיכרון לאורך הסשן, כך שמקלידים את ה-passphrase פעם אחת בלבד. בכל מערכת ההפעלה ההפעלה מעט שונה:
# Windows (PowerShell כמנהל, פעם אחת):
Get-Service ssh-agent | Set-Service -StartupType Automatic
Start-Service ssh-agent
ssh-add $env:USERPROFILE\.ssh\id_ed25519
# macOS - שמירה ב-Keychain:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519
# Linux:
eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519
במק אפשר להוסיף ל-~/.ssh/config את השורות AddKeysToAgent yes ו-UseKeychain yes, והמפתח ייטען אוטומטית גם אחרי הפעלה מחדש.
איך ניגשים לשירות פנימי בשרת דרך מנהרת SSH?
מנהרת SSH (Port Forwarding) מעבירה פורט מהמחשב המקומי לפורט בשרת דרך החיבור המוצפן. כך אפשר לעבוד מול מסד נתונים או פאנל ניהול שמאזינים רק ל-localhost בשרת, בלי לפתוח אותם לאינטרנט:
ssh -L 3307:127.0.0.1:3306 web1
# עכשיו כלי ה-DB המקומי מתחבר ל-127.0.0.1:3307 ומגיע ל-MySQL שבשרת
זו דרך פשוטה ובטוחה יותר מחשיפת פורט 3306 או phpMyAdmin לכל העולם, והיא עובדת זהה ב-PowerShell, במק ובלינוקס.
למה החיבור ב-SSH נכשל? שגיאות נפוצות ופתרונות
רוב כשלי ה-SSH נופלים לחמש קטגוריות, וההודעה עצמה אומרת באיזו שכבה הבעיה. הכלי הראשון לאבחון הוא מצב מפורט: ssh -v dana@203.0.113.10, שמציג אילו מפתחות נוסו ואיפה החיבור נעצר.
| הודעת שגיאה | מה זה אומר | מה לבדוק |
|---|---|---|
| Permission denied (publickey) | השרת זמין, אבל דחה את האימות | שם משתמש נכון? המפתח הנכון נשלח (-i או IdentityFile)? הרשאות בשרת: ~/.ssh ב-700 ו-authorized_keys ב-600, והבעלים הוא המשתמש |
| Connection refused | הכתובת הגיעה, אבל אין שירות שמאזין בפורט | פורט שגוי? שירות ssh כבוי (systemctl status ssh דרך הקונסולה)? |
| Connection timed out | אין תשובה בכלל - החבילות נחסמות או הולכות לאיבוד | כתובת IP נכונה? חומת אש (ufw או בפאנל) חוסמת את הפורט? השרת דלוק? רשת המשרד חוסמת פורט 22 יוצא? |
| REMOTE HOST IDENTIFICATION HAS CHANGED | מפתח השרת שונה ממה שנשמר ב-known_hosts | אם התקנתם את השרת מחדש - זה צפוי: ssh-keygen -R 203.0.113.10. אם לא שיניתם כלום - עצרו ובררו לפני שממשיכים |
| Too many authentication failures | הלקוח ניסה יותר מדי מפתחות לפני הנכון | הוסיפו IdentitiesOnly yes ו-IdentityFile ספציפי ב-config |
| UNPROTECTED PRIVATE KEY FILE | הרשאות המפתח הפרטי פתוחות מדי | במק/לינוקס: chmod 600 ~/.ssh/id_ed25519. ב-Windows: להסיר הרשאות של משתמשים אחרים מהקובץ |
איך בודקים בצד השרת למה ההתחברות נדחתה?
הלוג של שירות ה-SSH בשרת מסביר בדרך כלל את הסיבה המדויקת, למשל הרשאות שגויות על תיקיית הבית. מריצים (דרך הקונסולה אם אין גישת SSH):
sudo journalctl -u ssh -n 50 --no-pager
sudo sshd -T | grep -Ei 'passwordauth|permitroot|pubkey'
הודעה כמו "Authentication refused: bad ownership or modes" אומרת שההרשאות על ~/.ssh או על תיקיית הבית פתוחות מדי, ותיקונן פותר את הבעיה.
מה עושים אחרי שהתחברתם לשרת בפעם הראשונה?
אחרי ההתחברות הראשונה עוברים על ארבעה צעדים בסיסיים: מעדכנים חבילות, יוצרים משתמש אישי עם sudo, מעבירים את הכניסה למפתחות בלבד ומפעילים חומת אש. ההסבר המלא עם הפקודות נמצא במדריך אבטחת שרת לינוקס. מי שמעדיף שצוות אחר ינהל את כל זה יכול לבחור שרת ענן מנוהל, ומי שעובד עם Windows ימצא את ההתחברות ב-RDP בעמוד שרת ענן Windows.