שאלה לא אינטראקטיבי git clone (ssh טביעת אצבע הפקודה) [כפולות]


לשאלה זו כבר יש תשובה:

אני רוצה לשכפל ריפו בצורה לא אינטראקטיבית. כאשר שיבוט, git מבקש לאשר טביעת אצבע של המארח:

The authenticity of host 'bitbucket.org (207.223.240.182)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)? no

איך אני מכריח "כן" בכל פעם השאלות האלה צץ? ניסיתי להשתמש yes yes | git clone ..., אבל זה לא עובד.

עריכה: הנה פתרון: האם ניתן להוסיף באופן אוטומטי מארח חדש ל- known_hosts? (מוסיף entires כדי known_hosts עם ssh-keyscan).


108
2017-11-09 09:04




מעניין לראות כי גם אחרי שנתיים השאלה הזאת אין תשובה נכונה. יש כמה מקרים אחרים שבהם git ינחה, למשל אם אתה מנסה לשכפל מעל http ואת השרת מבקש basic_auth. כיצד לעשות זאת במצב שאינו אינטראקטיבי? - sorin
מוסיף את -q אפשרות (שקט) עשה את זה בשבילי. עכשיו אני תקוע לאוטומטית את משפט הסיסמה.


תשובות:


אני לא חושב שזה הפתרון הטוב ביותר, אבל זה היה פתרון בשבילי.

תשובה:

הוספת שמות הדומיין אל known_hosts קובץ באמצעות ssh-keyscan הפקודה פתרה את הבעיה:

ssh-keyscan <enter_domainname_e.g._github.com> >> ~/.ssh/known_hosts


92
2017-11-02 04:13



בבקשה אל תעשה את זה ככה. זה לגמרי לא מאובטח: טביעות האצבעות לא כאן כדי לעצבן אותך, אבל כדי לוודא שאתה לא מול התקפת אדם באמצע. עיין בתשובה שלי למטה. - autra
כפי שאמרתי, "אני לא חושב שזה הפתרון הטוב ביותר, אבל היה לי פתרון". כי הייתי ממהר, אין ספק שיש "הדרך הנכונה של המשטרה" לעשות את זה ((: - kroe
זה לא עניין של פוליטיקלי קורקט :-) זו שאלה אם זה בטוח או לא. הפתרון שלך מאובטח אם ורק אם אתה בודק ידנית את טביעת האצבע לאחר ssh-keyscan ולפני הוספת אותו .ssh/known_hosts כדי להיות זהה לזה github אחד פרסם באתר האינטרנט שלהם. אתה יכול לעשות את זה בכמה דרכים, ושלי הוא אחד מהם. אתה יכול גם לעשות בדיקה שווה את התסריט, אבל בסוף זה מגיע כל זה: אתה צריך את התסריט כדי לדעת איזה טביעת אצבע זה מצפה, ואתה צריך את זה כדי להיכשל אם הוא לא מקבל את הנכונה. - autra
כדי להוסיף מפתח רק אם הוא אינו קיים ssh-keygen -F github.com || ssh-keyscan github.com >>~/.ssh/known_hosts - transang
ביצוע פעולה זו פעם אחת במסגרת ניהול תצורה או הפעלה של הקצאת משאבים צריך להיות בסדר. אם טביעת האצבע משתנה אי פעם בעתיד, אז ssh יעבוד כמתוכנן ויידע אותך שה- cert השתנה, והחזרת קוד יציאה לא 0. זה עלול לעצור כל סקריפט שבו אתה משתמש ssh או git. - emhohensee


לא אפשרויות "StrictHostKeyChecking לא" ולא "ssh-keyscan" מאובטח. אתה צורך אימות טביעת אצבע ידני בשלב מסוים כדי למנוע התקפה MiTM אם אתה מקל עם ssh.

למעשה, יש לך 2 אפשרויות:

השתמש בפרוטוקול https במקום ב- git

זה לא יבקש ממך טביעת אצבע, כי ssh אינו מעורב, https משמש במקום. עבור נקודת מבט אבטחה אתה בוטח בשורש אישורים על מערכת ההפעלה שלך. אם אתה משתמש בתמונה מינימליסטית או ב- Docker, ייתכן שיהיה עליך להתקין את חבילת ה- ca-certificates.

אם אתה באמת רוצה git + פרוטוקול SSH

האם אתה באמת צריך להוסיף את המפתח בזמן ריצה? זה לא בטוח כי אתה לא לבדוק את טביעת האצבע וזה משאיר אותך פתוח להתקפות MiTM. זה לא רק תיאורטית, וזה הוכח לעבוד.

לפני הפעלת הסקריפט שלך, קבל את המפתח מ- github (במחשב המקומי שלך):

ssh-keyscan github.com >> githubKey

צור את טביעת האצבע:

ssh-keygen -lf githubKey

ובדוק את זה ידנית נגד אלה הרשומים בדף זה (אישור, יש לך אמון https תעודות ו OpenSSL להביא לך את האתר המקורי github, אבל זה עדיין הרבה יותר טוב מאשר בעיוורון לקבל מפתח ציבורי).

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

echo '<copy paste the content of 'cat githubKey' on your machine>'  >> ~/.ssh/known_hosts

לפני שיבוט git.

המפתח הציבורי של GitHub ישתנה רק אם הם מאמינים שהוא נפרץ (או לא בטוח מספיק). אם זה בכלל כך, אתה רוצה סקריפט שלך להיכשל בכל מקרה.


80
2018-06-25 15:39



זה היא התשובה הנכונה והבטוחה היחידה לשאלה. למה זה האחרון? אני מתבייש האנושות; - Jan Warchoł
אתה לא יכול לעשות HTTPS אינטראקטיבי עם GitHub אם אתה משתמש auth שני גורמים, למרבה הצער. - Brett Widmeier
אני לא מבין למה לא. אנחנו מדברים כאן על ריפו ציבורי, אין צורך באימות. שיבוט ריפו פרטי מתוך סקריפט הוא דבר אחר לגמרי: אתה צריך לאשר את התסריט שלך לעשות זאת. - autra
בדיקת טביעת האצבע "ידנית" היא פחות כואבת ממה שהיא נשמעת, בעזרת "סרגל החיפוש" של חוקרים מודרניים (כגון ב Chrome). - Franklin Yu


אני מאמין אפשרות טובה יותר כאן היא לגבות ולרוקן את שלך ~/.ssh/known_hosts קובץ, לבצע ידנית את חיבור SSH, אימות כתובת ה- IP וטביעת אצבע, mv ~/.ssh/known_hosts ~/bitbucket_hosts, ולאחר מכן להשתמש בתוכן של ~/bitbucket_hostsב התסריט שלך באופן אוטומטי לצרף את טביעות האצבעות הידועות לקובץ known_hosts (אל תשכח לשחזר את המקור ~/.ssh/known_hosts).

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


7
2018-04-07 18:53





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

להמשיך בזהירות.

אם אין לך חשש לגבי מקור הקוד על פני החוט, עליך להשתמש בפרוטוקול git: // בעת שיבוט - הוא ללא אימות ובטקסט ברור.


6
2018-01-22 22:34



אני יכול לראות בוודאות מקרים שבהם עלינו לאכוף שימוש לא אינטראקטיבי git clone... וזה לא אומר שאנחנו דורשים לקבל כל המחאה (טביעת אצבע אחת בפרט). במקרה שלי, אני אשמח מאוד להיכשל באופן אוטומטי על דבר כזה. - vaab


כפי שאמר ג 'ף הול, עושה זאת הוא מסוכן כפי שהוא מאפשר unetected אדם- in-the-mid התקפות. עם זאת, אתה יכול להשתמש StrictHostKeyChecking no אפשרות ssh להשבית בדיקת המקשים המארח. עם זאת, אני יהיה זהיר מאוד עם אפשרות זו אם הייתי במקומך.


5
2018-02-03 07:45



זה גם מאפשר אדם באמצע באמצע? - autra


הוספת המפתח אל .ssh/known_hosts נראה הדבר הנכון לעשות.

אמנם כאשר אתה להפוך את המשימה שאתה רוצה לוודא את המפתח הוא כבר לא הכיל והוסיף על כל אחד clone/pull משימות.

קטע זה רק יוסיף את טביעת האצבע אם עדיין לא נמצא:

if [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ]; then ssh-keyscan bitbucket.org >> ~/.ssh/known_hosts 2>/dev/null; fi

4
2018-02-16 10:42



זה היה מושלם. ניתן בקלות להכניס סקריפט לפריסה והוא בטוח יותר מאשר השבתת אימות מארח. הנה אחת אניה עבור github: if [ ! -n "$(grep "^github.com " ~/.ssh/known_hosts)" ]; then ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null; fi; ssh-agent bash -c "ssh-add /path/to/your/deploy/id_rsa; git clone -b master git@github.com:githubAccount/githubRepo.git /your/target/dir - tweak2
זה לא עובד מתי HashKnownHosts מאופשר ב / etc / ssh / ssh_config (או ~ / .shsh / config). במקום [ ! -n "$(grep "^bitbucket.org " ~/.ssh/known_hosts)" ] זה יהיה יותר טוב להשתמש [ ! "$(ssh-keygen -F bitbucket.org)" ], אשר מוצא הן שורות hashed ולא hashed ב known_hosts. - Claus Conrad