שאלה האם ניתן להוסיף באופן אוטומטי מארח חדש ל- known_hosts?


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

הבעיה שיש לי היא הראשונה ssh הפקודה לרוץ נגד מופע וירטואלי חדש תמיד מגיע עם הנחיה אינטראקטיבית:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

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


217
2018-04-16 04:15




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


תשובות:


הגדר את StrictHostKeyChecking אפשרות no, או בקובץ ההגדרות או באמצעות -o You

ssh -o StrictHostKeyChecking=no username@hostname.com


126
2018-04-16 04:34



זה משאיר אותך פתוח לאדם בהתקפות האמצעיות, כנראה לא רעיון טוב. - JasperWallace
@ JasperWallace, בעוד זה בדרך כלל עצה טובה, במקרה השימוש הספציפי (פריסת בדיקות VMs ושליחת פקודות אליהם) צריך להיות בטוח מספיק. - Massimo
זה נותן Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts. כדי למנוע את האזהרה, וכדי למנוע את הוספת הערך לכל קובץ known_hosts, אני עושה: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Downvoting כמו זה לא עונה על השאלה ופותח פגיעויות אבטחה חמורות. - marcv81
@Mnebuerquo: אם היית מודאג אבטחה אז לא היה לך שום דבר בכלל לעשות עם השאלה הזאת. היה לך את המפתח המארח הנכון מולך, שנאסף מהמסוף של המערכת שרצית להתחבר אליה, ואתה היית מאמת אותה ידנית עם ההתחברות הראשונה. אתה בהחלט לא יעשה שום דבר "באופן אוטומטי". - Ignacio Vazquez-Abrams


IMO, הדרך הטובה ביותר לעשות זאת היא הבאה:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

זה יהיה לוודא שאין ערכים כפולים, כי אתה מכוסה הן את המארח ואת כתובת ה- IP, וגם hash פלט, אמצעי אבטחה נוסף.


210
2017-09-27 20:51



למה אתה צריך את כל 3 ssh-keyscan של? אתה לא יכול להסתדר עם הראשון רק מאז זה עובד הן hostname ו ip? - Robert
אתה יכול להיות בטוח כי המכונה עונה על הבקשה ssh-keyscan הוא באמת אחד אתה רוצה לדבר? אם לא פתחת את עצמך לאיש בהתקפה האמצעית. - JasperWallace
כן, בשביל זה אתה צריך לפחות את טביעת האצבע או אפילו טוב יותר את המפתח הציבורי, ובמקרה זה אתה יכול להוסיף אותו ישירות ל known_hosts, מה שהופך את השאלה לשאוף. אם יש לך רק את טביעת האצבע, תצטרך לכתוב צעד נוסף אשר מאמת את המפתח הציבורי שהורדת עם טביעת האצבע שלך ...
שיחות אל ssh-keyscan היו נכשלים בשבילי כי מארח היעד שלי אינו תומך ברירת המחדל גירסה 1 סוג המפתח. מוסיף -t rsa,dsa לפקודה קבוע זה. - phasetwenty
זה כנראה רעיון רע. אתה פותח את עצמך למתקפה של גבר באמצע על ידי עדכון מפתחות אלה. כדי למנוע ערכים כפולים, בדוק את מצב ההחזרה של ssh-keygen -F [address] במקום זאת. medium.com/@wblankenship/... - retrohacker


עבור אלה עצלן:

ssh-keyscan <host> >> ~/.ssh/known_hosts

80
2017-09-25 10:03



1+ באשמת היותך אשם. תודה. - SaxDaddy
פגיע להתקפות MITM. אתה לא בודק את טביעת האצבע. - Mnebuerquo
@Mnebuerquo אתה אומר מה לעשות אבל לא איך, מה יהיה מועיל. - Jim
@jameshfisher כן הפגיעות שלה להתקפות MITM, אבל האם אי פעם השגת את טביעת האצבע RSA, אשר הוצגה לך עם השרת בפועל, כאשר אתה עושה את זה באופן ידני? לא? אז התשובה הזאת היא הדרך לעשות את זה בשבילך. אם כן, אתה לא צריך להשתמש בתשובה זו ולעשות את זה באופן ידני או ליישם אמצעי אבטחה אחרים ... - fivef
@Mnebuerquo אני אשמח מאוד אם אתה גם תודיע לנו דרך טובה יותר להתמודד עם זה, כאשר אנחנו צריכים לשכפל ריפו באמצעות סקריפטים אצווה un-attend ואנחנו רוצים לעבור על ידי הנחיה זו. בבקשה לשפוך קצת אור על פתרון אמיתי אם אתה חושב שזה לא הנכון! - Waqas Shah


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

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

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


38
2018-03-06 09:00



האם יש דרך לבדוק אם המפתח נמצא ב- known_hosts לפני  ssh-keyscan? הסיבה היא שזה דורש קצת זמן חיבור רשת נוסף. - utapyngo
גרסת הפוסטר המקורי של הקובץ הזה היתה cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, אך עריכה לאחר מכן שינתה את זה >>. שימוש >> היא שגיאה. זה מביס את המטרה של הייחודיות בשורה הראשונה, וגורמת לו לזרוק ערכים חדשים לתוך known_hostsבכל פעם שהוא פועל. (פורסם רק עריכה כדי לשנות אותו בחזרה). - paulmelnikow
זה כפוף לאותם התקפות MITM כמו אחרים. - Mnebuerquo
@utapyngo ssh-keygen -F ייתן לך את טביעת האצבע הנוכחית. אם זה חוזר ריק עם קוד החזרה של 1, אז אין לך את זה. אם זה מדפיס משהו וקוד החזרה הוא 0, אז זה כבר קיים. - Rich L
אם זה אכפת לך הרבה על MITM, לפרוס רשומות DNSSEC ו SSHFP או להשתמש באמצעים אחרים מאובטח של הפצת המפתחות פתרון זה kludge יהיה רלוונטי. - Zart


אתה יכול להשתמש ssh-keyscan הפקודה לתפוס את המפתח הציבורי ולצרף את זה known_hosts קובץ.


18
2018-04-16 05:09



הקפד לבדוק את טביעת האצבע כדי לוודא שזה המפתח הנכון. אחרת אתה פותח את עצמך עד התקפות MITM. - Mnebuerquo
@Mnebuerquo נקודה הוגנת בהקשר הכללי, אבל למה מישהו היה מנסה באופן תכנותי לאסוף מפתחות אם הם כבר יודעים מה המפתח הנכון היה? - Brian Cline
זו לא הדרך לעשות את זה. MITM. - jameshfisher


זה איך אתה יכול לשלב ssh-keyscan לתוך המשחק שלך:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

6
2018-02-03 03:12



האם אתה מעלה קובץ ידוע ידוע known_hosts, או שאתה עושה ssh-keyscan ואת ההטלה את הפלט לתוך known_hosts ללא אימות טביעות אצבע? - Mnebuerquo
זה פשוט dumps הפלט של keyscan, כן. אז למעשה זה זהה StrictHostKeyChecking = לא, רק עם unknown_hosts שקט מעדכן בלי להתעסק עם אפשרויות ssh. פתרון זה גם לא עובד היטב בשל ssh-keyscan חוזרים מספר שורות אשר גורם משימה זו תמיד מסומן כמו " - Zart
זו לא הדרך לעשות את זה. MITM. - jameshfisher
@ jameshfisher אני אשמח מאוד אם אתה גם תודיע לנו דרך טובה יותר להתמודד עם זה, כאשר אנחנו צריכים לשכפל ריפו באמצעות סקריפטים אצווה un-attend ואנחנו רוצים לעבור על ידי הנחיה זו. בבקשה לשפוך קצת אור על פתרון אמיתי אם אתה חושב שזה לא הנכון! אנא יידע אותנו "איך" לעשות את זה, אם אתה חושב שזה לא הדרך הנכונה לעשות את זה! - Waqas Shah


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

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

זה מוסיף את המפתח known_hosts ואינה מנחה את הסיסמה.


5
2017-10-21 17:27



פגיע להתקפות MITM. אתה לא בודק את טביעת האצבע. - Mnebuerquo
אף אחד לא בודק את טביעת האצבע. - Brendan Byrd
זו לא הדרך לעשות את זה. MITM. - jameshfisher


זה יהיה פתרון מלא, קבלת המפתח המארח בפעם הראשונה בלבד

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

5
2017-11-23 13:51



זו לא הדרך לעשות את זה. MITM. - jameshfisher


לכן, חיפשתי דרך ארצית לעקוף את האינטראקציה הידנית המארחת של שיבוט git repo כפי שמוצג להלן:

brad@computer:~$ git clone git@bitbucket.org:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' 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)?

שים לב לטביעת האצבע של מפתח RSA ...

אז, זה דבר SSH, זה יעבוד עבור git על SSH ורק דברים הקשורים SSH בכלל ...

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

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

טוב. אני גם בסכנה במקומות מרובים ומכונות בדקתי את זה - או את ההסבר מתקבל על הדעת יותר של כל דבר להיות dory hunky הוא מה שקורה.

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

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

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

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

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

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

הקובץ known_hosts במקרה זה אינו משתמש ברשומות טקסט. אתה יודע ערכים hashed כאשר אתה רואה אותם, הם נראים כמו hashes עם תווים אקראיים במקום xyz.com או 123.45.67.89.

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

שורת ההערה הראשונה מזעזעת מופיעה - אבל אתה יכול להיפטר ממנה עם הפנייה פשוטה דרך ">" או ">>" האמנה.

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

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

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

אז ככה אתה נשאר בתולה להיום. אתה יכול לעשות את אותו הדבר עם github על ידי ביצוע כיוונים דומים על הזמן שלך.

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

שגוי ssh -oStrictHostKeyChecking = no hostname [הפקודה]

שגוי ssh-keyscan -t rsa -H hostname >> ~ / .shsh / known_hosts

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


4
2017-10-05 21:18



אני חושב שזה הפתרון הטוב ביותר לבעיה זו. עם זאת, להיות זהיר מאוד בעת שימוש Nmap על משהו כמו אמזון EC2, קיבלתי אזהרה על סריקה הנמל כי Nmap עושה! מלאו את הטופס לפני ביצוע portscanning! - Waqas Shah
...ובכן כן. אני לא יודע למה היית עושה את הנמל סריקה מ EC2. אם אתה מחובר לחשבון שלך, אתה יכול פשוט לקבל את המפתחות מן המכונות בפועל. זה יותר עבור מכונות אין לך שליטה. הייתי מניח שתהיה לך מכונה מקומית לא כפופה להגבלות הסריקה של יציאת AWS לשימוש. אבל, אם אתה במצב זה קצה קצה שבו אתה חייב לרוץ nmap עם AWS, אני מניח אזהרה זו תהיה מועילה. - BradChesney79
באמצעות nmap לקרוא את המפתח המארח SSH מתחנת העבודה שלך ולאחר מכן אמון כי הערך אינו שונה מאשר התחברות באמצעות SSH עם StructHostKeyChecking כבוי. זה פשוט פגיע להתקפה של אדם באמצע. - Micah R Ledbetter
... @ MicahRLedbetter ולכן הציע כי "השוואות יותר ממחשבים ורשתות שונות בדרך כלל להגדיל את היכולת שלך לסמוך על הקשר". אבל זאת הנקודה שלי. אם אתה רק לבדוק את היעד שלך מארח מתוך קבוצה אחת של תנאי הסביבה אז איך אתה אי פעם לדעת על כל סתירות? היו לך הצעות טובות יותר? - BradChesney79
זה תיאטרון הביטחון. לעשות משהו מסובך כדי ליצור את המראה של אבטחה רבה יותר. זה לא משנה כמה שיטות שונות אתה משתמש לשאול את המארח עבור המפתח שלה. כמו לשאול את אותו אדם מספר פעמים אם אתה יכול לסמוך עליהם (אולי אתה קורא, דוא"ל, טקסט, דואר חלזונות). הם תמיד יאמרו כן, אבל אם אתה שואל את האדם הלא נכון, זה לא משנה. - vastlysuperiorman


אני עושה תסריט אחד אניה, קצת ארוך אבל שימושי כדי להפוך את המשימה הזו עבור המארחים עם כפולות IPs, באמצעות dig ו bash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

3
2018-04-18 21:01





המנע מהרשומות הכפילויות ב- ~ / .shsh / known_hosts:

if ! grep "$(ssh-keyscan github.com 2>/dev/null)" ~/.ssh/known_hosts > /dev/null; then
    ssh-keyscan github.com >> ~/.ssh/known_hosts
fi

3
2017-07-02 11:41



זו לא הדרך לעשות את זה. MITM. - jameshfisher