מחולל SSH config ועוזר מפתחות

מתארים כל שרת פעם אחת, ומתחברים עם ssh ושם קצר: המשתמש, הפורט והמפתח הנכונים, קפיצה דרך bastion ומנהרות SSH לשירותים שמאזינים רק על השרת. את המפתח יוצרים עם ssh-keygen במחשב שלכם, או, אם תבחרו, בדפדפן הזה. שום דבר לא יוצא מהעמוד.

שרתים
שרת 1
השם הקצר שמקלידים אחרי ssh, למשל app.
הכתובת הציבורית של השרת, או הכתובת הפרטית שלו כשקופצים דרך bastion.
החשבון שמתחברים אליו, למשל deploy. ריק: שם המשתמש המקומי שלכם.
המפתח הפרטי שלכם במחשב הזה. ssh יציע רק אותו (IdentitiesOnly).
כינוי אחר, או user@host:port. לכמה קפיצות מפרידים בפסיקים.
נכתבת כהערה מעל הבלוק.
הודעה כל 60 שניות בתוך הערוץ המוצפן שומרת על חיבור שקט פתוח דרך NAT וחומות אש; ssh מתנתק אחרי 3 הודעות בלי תשובה.
מנהרות SSH ‏(LocalForward)

גישה לשירות שמאזין רק על השרת, למשל אפליקציה שמחולל ה-Compose פרסם על 127.0.0.1 במצב local: כל עוד ssh -N <alias> רץ, פותחים את http://localhost:<local port>.

המפתח

יוצרים את המפתח במחשב שלכם עם ssh-keygen: כך המפתח הפרטי לא קיים בשום מקום אחר, ו-ssh-keygen מבקש passphrase שמגנה עליו. מפתחות Ed25519 קצרים, מהירים ונתמכים בכל OpenSSH עדכני.

לאן ssh-keygen כותב את המפתח הפרטי; המפתח הציבורי נכתב לידו עם ‎.pub.
נכנסת למפתח הציבורי כדי שאפשר יהיה להבדיל בין מפתחות ב-authorized_keys, למשל you@laptop.
make-ssh-key.sh
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519
chmod 600 ~/.ssh/id_ed25519
  1. מריצים את הפקודות בטרמינל במחשב שלכם (macOS, ‏Linux, או Windows עם OpenSSH). ‏ssh-keygen מבקש passphrase: כדאי להגדיר.
  2. ssh-copy-id מוסיף את ~/.ssh/id_ed25519.pub ל-~/.ssh/authorized_keys בשרת הראשון שלמעלה, עם הסיסמה או הגישה שיש לכם עכשיו. בלעדיו מדביקים את שורת ה-‎.pub שם בעצמכם, או מעבירים אותה למחולל ה-cloud-init.
  3. המפתח הפרטי ~/.ssh/id_ed25519 נשאר במחשב שלכם. לא שולחים אותו ולא מדביקים אותו בשום מקום.

או יצירת המפתח בדפדפן הזה (לא חובה)

למקרה ש-ssh-keygen לא זמין. ה-WebCrypto של הדפדפן יוצר את המפתח במכשיר הזה: הוא לא נשלח לשום מקום, לא נשמר, לא נכנס לקישור ולא נמדד.

מה הכלי עושה

הכלי כותב בלוקי Host לקובץ תצורת ה-SSH במחשב שלכם, כך ש-ssh עם שם קצר מתחבר עם הכתובת, המשתמש, הפורט והמפתח הנכונים, דרך bastion כשצריך, עם keep-alive, ועם מנהרות SSH לשירותים שלא פתוחים לאינטרנט. הוא גם נותן את פקודת ssh-keygen למפתח Ed25519, ורק אם מבקשים, יוצר את המפתח בדפדפן הזה.

איך זה עובד

  1. כל שרת הופך לבלוק Host אחד, שנכתב באותו מנוע כמו שאר כלי ה-Linux שלנו. הערכים נבדקים לצורתם: כינוי עם רווח או תו כללי, שם host שאינו שם host, או נתיב מפתח עם .. נדחים, כך ששדה לא יכול להוסיף אפשרויות משלו.
  2. הבדיקות שלנו קוראות כל קובץ לדוגמה בחזרה עם ssh -G ומשוות כל אפשרות, וטוענות עם ssh-keygen -y מפתחות שנוצרו בקוד של העמוד הזה.
  3. שום דבר לא נשלח לשום מקום, ושום דבר לא נשמר בקישור או באחסון הדפדפן.

מה כל אפשרות עושה

HostName
הכתובת האמיתית. הכינוי הוא רק שם במחשב שלכם.
IdentityFile ו-IdentitiesOnly
המפתח הפרטי שמוצע לשרת. ‏IdentitiesOnly מונע מ-ssh לנסות קודם כל מפתח שב-agent, מה שנגמר ב-'Too many authentication failures' בשרתים עם MaxAuthTries נמוך.
ProxyJump
מגיע לשרת דרך שרת אחר (bastion), בהצפנה מקצה לקצה: ה-bastion לא רואה את המפתח שלכם. דורש OpenSSH 7.3 ומעלה.
LocalForward
כל עוד החיבור פתוח, פורט במחשב שלכם (רק על localhost) מוביל לכתובת ולפורט כפי שהשרת רואה אותם.
ServerAliveInterval ו-ServerAliveCountMax
הודעה כל 60 שניות בתוך הערוץ המוצפן שומרת חיבור שקט פתוח דרך NAT, ו-ssh מתנתק אחרי 3 הודעות בלי תשובה במקום להיתקע.

דוגמה

‏bastion בכתובת 203.0.113.10 ושרת אפליקציה בכתובת 10.0.0.5 מאחוריו, עם מנהרה ל-n8n בפורט 5678:

~/.ssh/config
config
# SSH client configuration (ssh_config(5)). ssh keeps the first value it finds for each
# option, so put these blocks above any "Host *" block. Keep this file mode 0600.
# Generated by @anaroq/linux 1.0.0 (ANAROQ). Check with: ssh -G <alias>

# Bastion
Host bastion
  HostName 203.0.113.10
  User deploy
  Port 22
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
  ServerAliveInterval 60
  ServerAliveCountMax 3

# App server, through the bastion
Host app
  HostName 10.0.0.5
  User deploy
  Port 22
  IdentityFile ~/.ssh/id_ed25519
  IdentitiesOnly yes
  ProxyJump bastion
  LocalForward 5678 127.0.0.1:5678
  ServerAliveInterval 60
  ServerAliveCountMax 3
המפתח, שנוצר במחשב שלכם ומותקן ב-bastion:
make-ssh-key.sh
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519 -C you@laptop
ssh-copy-id -i ~/.ssh/id_ed25519.pub [email protected]

מגבלות

  • תצורת לקוח בלבד: הכלי לא משנה את השרת או את הגדרות ה-sshd שלו.
  • Ed25519 בלבד. מפתחות RSA לא נוצרים בדפדפן; אם שרת ישן דורש RSA, השתמשו ב-ssh-keygen -t rsa -b 4096.
  • למפתח שנוצר בדפדפן אין passphrase עד שמוסיפים אחת עם ssh-keygen -p.
  • תבניות Host (‏* ו-?), בלוקי Match ואפשרויות מלבד אלה שלמעלה לא נכתבים; מוסיפים אותם ידנית מתחת לבלוקים האלה.
  • הכלי לא יכול לבדוק שהשרת זמין או שמפתח ה-host שלו הוא המפתח שאתם מצפים לו: משווים את טביעת האצבע בחיבור הראשון.

מתודולוגיה: איך מחושבים המספרים

מקורות

  1. OpenSSH manual: ssh_config(5)
  2. OpenSSH manual: ssh-keygen(1)
  3. OpenSSH 7.3 release notes (ProxyJump)
  4. OpenSSH: PROTOCOL.key, the private key format
  5. RFC 8709: Ed25519 public key algorithms for SSH
  6. MDN: SubtleCrypto.generateKey() (Ed25519)

עודכן

הצעד הבא

cloud-init Generator ל-Ubuntu 24.04

כלי ציבורי חינמי של אנרוק, חברה שבונה תשתיות מחשוב. מה אנרוק בונה