שאלה "הוסף את המפתח המארח הנכון ב known_hosts" / מרובים SSH המארח המארח לכל hostname?


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

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

אכן שיניתי את המפתח. ואני קורא כמה עשרות הודעות אומר כי הדרך לפתור בעיה זו היא על ידי מחיקת מפתח הישן מ known_hosts קובץ.

אבל מה שהייתי רוצה זה לקבל את המפתח הישן ואת המפתח החדש. השפה בהודעת השגיאה ("Add correct host key") מציע כי יש דרך להוסיף את המפתח המארח הנכון מבלי להסיר את הישן.

לא הצלחתי להבין כיצד להוסיף את המפתח החדש המארח מבלי להסיר את הישן.

האם זה אפשרי, או האם הודעת השגיאה מטעה ביותר?


121
2017-10-13 14:01




זהו המפתח המארח שמייצר את השגיאה. מארח צריך מפתח אחד בלבד. זה אין שום קשר עם הלקוח או מפתחות המשתמש. האם יש לך כתובת IP אחת שצף בין המארחים נפרדים או משהו? - David Schwartz
במקרה שלי אני יודע שאני הולך לעבור בין שני המפתחות הרבה בעתיד הקרוב תוך התעסקות עם כמה דברים. נראה שזה יהיה גם שימושי אחד IP עם מספר המארחים המצב שאתה מציע. בעיקר אני רק רוצה לדעת אם זה אפשרי עבור החינוך שלי מלבד כל יישום מעשי מסוים. - Samuel Edwin Ward


תשובות:


  1. קבל את המפתח rsa של השרת שלך:

    $ ssh-keyscan -t rsa server_ip
    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. ועל הלקוח, הוסף את המפתח ~/.ssh/known_hostsYou

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    

126
2017-10-13 14:38



זה עבד! עם זאת, אני משתמש "HashKnownHosts", ולכן הערך נראה קצת מחוץ למקום. למזלי ssh_config (5) הצביע לי ssh-keygen (1) אשר הסביר כי אני יכול להשתמש "ssh-keygen -H" כדי hash את ערכי unhashed. תודה! - Samuel Edwin Ward
זה "עובד" אבל אתה לא מאמת את המפתח, אז אתה חשוף התקפות mitm ... - JasperWallace
@JasperWallace, כל עוד השלב הראשון נעשה על חיבור מאובטח (למשל באמצעות localhost) זה צריך להיות די בטוח, אני חושב - ony
האם יש דרך לאסוף את כל סוגי המפתח מהשרת? לפעמים אתה לא יודע אם הם RSA, DSA, ECDSA, RSA1 ... וכו ' - Sopalajo de Arrierez
@SopalajodeArrierez אותו manpage גם אומר שאתה יכול להפריד בין סוגים עם פסיקים, כך ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip - אבל הסיבה היחידה למצוא rsa1 ו dsa מפתחות היא לזהות שרתים שיש לשדרג / להגדיר מחדש - kbolino


הסר את הערך מ- known_hosts באמצעות:

ssh-keygen -R *ip_address_or_hostname*

פעולה זו תסיר את ה- IP הבעייתי או את שם המארח known_hosts ונסה להתחבר שוב.

מדפי האיש:

-R hostname
  מסיר את כל המקשים השייכים לארח hostname מקובץ known_hosts. אפשרות זו שימושית למחיקת מארחים מחורצים (ראה אפשרות -H   לעיל).


74
2018-02-09 06:49



"כיצד להוסיף את המפתח המארח החדש מבלי להסיר את הישן." - Samuel Edwin Ward
זהו הפתרון הטוב ביותר! - Thomas Decaux
איך זה יש 19 הצבעות? זה לא מתקרב לענות על השאלה שנשאלה .. - Molomby
השאלה שלך מגיע השני כאשר אני עבור "git ssh עדכון עדכון המפתח באופן אוטומטי". תשובה זו היא מה שחיפשתי. פתיחת שאלה חדשה עם מה בדיוק אני רוצה עלול לקבל את זה סגור כמו כפולות. - Jason Goemaat
גם שם המארח עובד - damluar


דרך פשוטה מאוד היא:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

לאחר מכן ערוך את known_hosts כדי לנקות את המקש המקורי ולאחר מכן ssh למארח באמצעות:

ssh name@computer

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

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

עריכה 2015/06

אני צריך להוסיף, עכשיו revisiting את זה, כי אני שם לב אפילו דרך פשוטה יותר (כל עוד את הערך ניתן לזיהוי, בדרך כלל מן שם המארח / כתובת ה- IP די מלבד הודעת השגיאה המפנה את המיקום הספציפי שלה);

  1. ערוך known_hosts להוסיף # בתחילת הערך 'הישן' ב known_hosts באופן זמני
  2. התחבר [ssh למארח], מסכים להנחה כדי להוסיף את המפתח החדש 'באופן אוטומטי'
  3. לאחר מכן, ערוך מחדש את known_hosts כדי להסיר את #

יש אפילו את האפשרות HostKeyAlias ​​כמו ב

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

לאחר מכן, לאחר הלקוח ssh מוסיף את המפתח החדש תחת כינוי, אתה יכול גם לערוך את known_hosts להחליף את שם המארח "אמיתי" / כתובת ה- IP עבור כינוי או להתחבר לגלגול זה של המארח עם אפשרות כינוי אי פעם


16
2018-04-30 22:29



זה מרותק? meldmerge.org - Samuel Edwin Ward
כי הוא meld :) apt-get / yum להתקין שם פשוט מתמזגים - Mark
עשיתי גרסה של ההצעה שלך שעבדה טוב - במקום cp, mv, ואז ssh, ולאחר מכן cat ~ / .shsh / known_hosts.bak ~ / .shsh / known_hosts> tmp; mv tmp ~ / .shsh / known_hosts - Peter N Lewis


יש לי את אותה בעיה עם pi פטל שבו אני אתחול עם מספר מערכות שונות (מערכת dev עבור בינארי קומפילציה זרוע, פרוייקט, xbmc, וכו ') יש להיתקל באותה בעיה. הם משתמשים ב- DHCP ברשת מקומית והנתב שלי משתמש תמיד באותה כתובת IP מכיוון שכתובת ה- MAC הייתה זהה. פתרתי אותו באמצעות שמות דומיינים שונים בקובץ המארח שלי:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

הקובץ known_hosts שומר טביעות אצבע לפי שם המארח כך למרות שזו אותה כתובת IP, כל שם מארח ייחודי מקבל ערך אחר.

נמאס לי להוסיף את השמות המארחים קבצים בכל פעם שאני משתמש במערכת חדשה אז הגעתי עם דרך lazier אפילו באמצעות אפסים מובילים על כתובות IP כמו:

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110

כל וריאציה של (unanonicized) כתובת ה- IP מקבל את זה הערך עצמו ב- known_hosts.


7
2017-11-04 02:28



האנשים OpenSSH יש לי חכם, הפרצה זו כבר לא עובד בגרסאות האחרונות. - Mike
אתה יכול להשתמש CheckHostIP no in ~/.ssh/config כדי להיות מסוגל עדיין להשתמש פרצה. אתה יכול אפילו להגדיר את שם כינויים שם אתה לא צריך להתעסק עם /etc/hosts ולהגדיר CheckHostIP no רק עבור 3 המארחים. - GnP


אם גם הלקוח וגם השרת שלך יש OpenSSH 6.8 או חדש יותר, אתה יכול להשתמש UpdateHostKeys yes האפשרות שלך ssh_config או ~/.ssh/config. לדוגמה:

Host *
    UpdateHostKeys yes

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


2
2017-09-22 04:28



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


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

פתרון נוסף עשוי להיות שימוש StrictHostKeyChecking=no אפשרות עבור מארח ספציפי זה:

ssh -o StrictHostKeyChecking=no user@host

אשר אתה יכול לשים שם בדוי שלך ~/.profile או משהו דומה.

alias hc=ssh -o StrictHostKeyChecking=no user@host

1
2017-10-13 14:49



נראה כי StrictHostKeyChecking לא עוזר במקרה זה; כנראה שזה רק מציין את ההתנהגות כאשר המארח אינו בקובץ known_hosts. המוזכרים כאן: gossamer-threads.com/lists/openssh/dev/45349#45349 - Samuel Edwin Ward
זה עובד כאן. תקבל את האזהרה, אך ההתחברות נמשכת. - Sven♦
זה מוזר. האם אתה משתמש באימות סיסמה? האם אתה משתמש ב- OpenSSH? - Samuel Edwin Ward


אם אתה רק ssh על גבי רשת מקומית אז ...

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

למשל

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

לאחר מכן הקש רווח, backspace cntl + x ו- y כדי לשמור את המאגר החדש (קובץ). תרגול רע שלה אבל בסדר בתנאי שאתה לא ssh'ing באופן קבוע מחוץ לרשת המקומית שלך (למשל uni או שרת עבודה)

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

שלה תמיד טוב יותר להשתמש בקוד אתה מבין!


0
2018-06-15 21:44



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


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

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

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

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • חזור עם כתובות IP או שמות מארח אחרים אם אתה משתמש בהם.

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

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

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

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


-1
2017-09-18 01:56