Soru Known_hosts'a otomatik olarak yeni bir ana bilgisayar ekleyebilir miyim?


İşte durumum: Merkezi bir istemciden bir dizi sanal makine örneği başlatacak ve daha sonra üzerlerinde komutlar çalıştıracak bir test takımı kuruyorum. ssh. Sanal makineler daha önce kullanılmayan ana makine isimleri ve IP adreslerine sahip olacaklar; ~/.ssh/known_hosts merkezi istemcide dosya.

Sorun şu ki, ilk ssh Yeni bir sanal örneğe karşı çalıştır komutu her zaman etkileşimli bir istemle gelir:

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)?

Bunu atlatmanın ve yeni ana makinenin istemci makineye zaten tanınması için bir yol var mı, belki de sanal makine görüntüsünde pişirilmiş bir ortak anahtar kullanıyor olabilir mi? İsterseniz Expect'i veya etkileşimli soruyu cevaplamak için ne gerekiyorsa kullanmaktan kaçınmak isterim.


217
2018-04-16 04:15


Menşei


Kendi kendine yeten ve fiziksel olarak güvenli olan bir test ortamı için, otomatik anahtar kabulü gayet iyi çalışır. Ancak, üretim ortamındaki veya güvenilmeyen bir ağdaki (Internet gibi) genel anahtarların otomatik olarak kabul edilmesi, SSH'nin aksi takdirde karşılayacağı ortadaki adam saldırılarına karşı herhangi bir korumayı tamamen atlatır. sadece MITM saldırılarına karşı güvendiğinizden emin olmanın geçerli bir yolu, grubun genel anahtarını bant dışı güvenilir bir kanal aracılığıyla doğrulamaktır. Orta derecede karmaşık bir anahtar imzalama altyapısı kurmadan otomatikleştirmek için güvenli bir yol yoktur. - Eil


Cevaplar:


Yı kur StrictHostKeyChecking seçeneği noya yapılandırma dosyasında veya üzerinden -o :

ssh -o StrictHostKeyChecking=no username@hostname.com


126
2018-04-16 04:34



Bu sizi orta saldırılarda açık bırakıyor, muhtemelen iyi bir fikir değil. - JasperWallace
@JasperWallace, bu genellikle iyi bir öneri olsa da, özel kullanım durumu (test VM'lerinin dağıtılması ve komutların gönderilmesi) yeterince güvenli olmalıdır. - Massimo
Bu bir verir Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts. Uyarıdan kaçınmak ve herhangi bir bilinen_hosts dosyasına eklenmesini önlemek için şunu yaparım: ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com - Peter V. Mørch
Düşündükçe bu soruya cevap vermiyor ve ciddi güvenlik açıklarına açılıyor. - marcv81
@Mnebuerquo: Eğer güvenlik konusunda endişelendiysen, o zaman bu soruyla hiçbir ilgisi olmazdı. Bağlanmak istediğiniz sistem konsolundan topladığınız doğru host anahtara sahip olacaksınız ve ilk bağlandığınızda bunu manuel olarak doğrulayacaksınız. Kesinlikle "otomatik" bir şey yapmazdın. - Ignacio Vazquez-Abrams


IMO, bunu yapmanın en iyi yolu şudur:

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

Bu, iki girişin bulunmadığından, hem ana makine adı hem de IP adresi için kapsandığınızdan emin olacak ve aynı zamanda ekstra bir güvenlik önlemi olacak.


210
2017-09-27 20:51



Neden 3 ssh anahtarlık ihtiyacınız var? Hem ana makine adı hem de ip için çalıştığından beri ilk olanla başlayamaz mısın? - Robert
Ssh-keyscan isteğine yanıt veren makinenin gerçekten konuşmak istediğin şey olduğundan emin olabilir misin? Eğer olmasaydın, orta saldırıdaki bir adama kendini açtın. - JasperWallace
@JasperWallace Evet, bunun için en azından parmak izine veya daha iyi olan genel anahtara ihtiyacın var demektir, bu durumda, bu soru mesajını döndürerek doğrudan bilinen_host'lara ekleyebilirsiniz. Sadece parmak iziniz varsa, indirilen genel anahtarı parmak izinizle doğrulayan ekstra bir adım yazmanız gerekir ...
Çağrıları ssh-keyscan Hedefim ana bilgisayar varsayılan sürüm 1 anahtar türünü desteklemediğinden benim için başarısız oldu. Ekleme -t rsa,dsa komuta bu düzeltildi. - phasetwenty
Bu muhtemelen kötü bir fikir. Bu anahtarları güncelleyerek ortadaki adam saldırısına kendinizi açıyorsunuz. Yinelenen girişleri önlemek için, dönüş durumunu kontrol edin. ssh-keygen -F [address] yerine. medium.com/@wblankenship/... - retrohacker


Tembel olanlar için:

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

80
2017-09-25 10:03



Ücretli olarak suçlu olduğu için +1. Teşekkürler. - SaxDaddy
MITM saldırılarına karşı savunmasız. Anahtar parmak izini kontrol etmiyorsun. - Mnebuerquo
@Mnebuerquo Ne yapacağınızı ama nasıl yapacağınızı söylerseniz, hangisi yardımcı olur. - Jim
@jameshfisher Evet, MITM saldırılarına karşı savunmasızdır, ancak bunu el ile yaptığınız zaman sunucunun gerçek olanıyla gösterilen RSA parmak izini hiç karşılaştırdınız mı? Yok hayır? Yani bu cevap sizin için bunu yapmanın bir yoludur. Eğer evet ise, bu cevabı kullanmamalı ve el ile yapmamalı ya da diğer güvenlik önlemlerini almamalısınız. - fivef
@Mnebuerquo Eğer biz bu işlemek için daha iyi bir yol bilmemize izin verirseniz çok sevinirim, ne zaman hazırlanmamış bir betik klonunu kopyalamamız gerektiğinde ve bu komut istemini by-pass etmek istiyoruz. Bunun doğru olmadığını düşünüyorsanız lütfen gerçek bir çözüme ışık tutunuz! - Waqas Shah


Bahsedildiği gibi, anahtar taramanın kullanılması, bunu yapmak için doğru ve göze batmayan bir yol olacaktır.

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

Yukarıdakiler, henüz eklenmemişse, SADECE bir sunucu eklemeyi gerçekleştirecektir. Aynı zamanda eşzamanlılık güvenli değildir; sen Yapmamalısın Tmp_hosts dosyası clobbered alabildikçe, aynı kaynak makinesinde aynı kaynaktan birden fazla parçayı aynı anda çalıştırırsanız, sonuçta bilinen_hosts dosyasına ...


38
2018-03-06 09:00



Anahtarın unknown_hosts içinde olup olmadığını kontrol etmenin bir yolu var mı? önce  ssh-keyscan? Bunun nedeni, biraz zaman ve ek ağ bağlantısı gerektirmesidir. - utapyngo
Bu dosyanın orijinal posteri sürümü vardı cat ~/.ssh/tmp_hosts > ~/.ssh/known_hostsancak sonraki düzenleme bunu değiştirdi >>. kullanma >> bir hatadır. İlk satırdaki benzersizliğin amacını yener ve yeni girişlere dökülmesine neden olur. known_hostsher çalıştığında. (Sadece bunu değiştirmek için bir düzenleme yayınladı.) - paulmelnikow
Bu diğerleri gibi aynı MITM saldırılarına tabidir. - Mnebuerquo
@utapyngo ssh-keygen -F size mevcut parmak izini verecektir. Geri dönüş kodu 1 ile boş gelirse, o zaman buna sahip değilsiniz. Bir şey yazdırır ve kod 0 ise, o zaman zaten mevcut. - Rich L
MITM hakkında çok fazla dikkat ederseniz, DNSSEC ve SSHFP kayıtlarını dağıtın ya da anahtarları dağıtmanın başka güvenli yollarını kullanın ve bu kludge çözümü alakasız olacaktır. - Zart


Kullanabilirsin ssh-keyscan Genel anahtarı kapmak ve buna eklemek için known_hosts dosya.


18
2018-04-16 05:09



Doğru tuş olduğundan emin olmak için parmak izini kontrol ettiğinizden emin olun. Aksi halde kendinizi MITM saldırılarına açıyorsunuz. - Mnebuerquo
Genel bağlamda @Mnebuerquo Fuar noktası, ama neden doğru anahtarın ne olduğunu bilseler, neden birisi anahtarları programlı olarak toplamaya çalışıyor? - Brian Cline
Bunu yapmanın yolu bu değil. MITM. - jameshfisher


Bu nasıl dahil edebilirsiniz ssh-KeyScan senin oyununa

---
# 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



Bilinen bir valid_hosts dosyası yüklüyor mu, yoksa parmak izlerini doğrulamadan ssh-keyscan yapıyor ve çıkışı bilinen_host'lara döküyor musunuz? - Mnebuerquo
Bu sadece bir keyscan'ın çıkışını döker, evet. Sonuç olarak, StrictHostKeyChecking = no ile aynıdır, sadece ssh seçenekleriyle uğraşmadan sessiz bilinen_hosts güncellemesiyle. Bu çözüm, aynı zamanda her zaman 'değiştirildi' olarak işaretlenmesini sağlayan ssh-keyscan'ın birden çok satıra dönüş yapması nedeniyle iyi çalışmaz - Zart
Bunu yapmanın yolu bu değil. MITM. - jameshfisher
@jameshfisher Eğer bu programla başa çıkmak için daha iyi bir yol bilmemize izin verirseniz çok sevinirim, ne zaman katılmamalıyız? Bunun doğru olmadığını düşünüyorsanız lütfen gerçek bir çözüme ışık tutunuz! Bunu yapmanın doğru yolu olmadığını düşünüyorsanız, lütfen bunu "nasıl" yapacağınızı bize bildirin! - Waqas Shah


Benzer bir sorunla karşılaştım ve sağlanan cevapların bir kısmının bana otomatik bir çözüm bulmamı sağladığını öğrendim. Kullandığım şudur, umarım yardımcı olur:

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

Anahtarı ekler known_hosts ve şifreyi sormaz.


5
2017-10-21 17:27



MITM saldırılarına karşı savunmasız. Parmak izini kontrol etmiyorsun. - Mnebuerquo
Kimse parmak izini kontrol etmiyor. - Brendan Byrd
Bunu yapmanın yolu bu değil. MITM. - jameshfisher


Bu, yalnızca ilk kez ana bilgisayar anahtarını kabul eden eksiksiz bir çözüm olurdu

#!/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



Bunu yapmanın yolu bu değil. MITM. - jameshfisher


Yani, aşağıda gösterildiği gibi bir git repo klonlama bilinmeyen ana bilgisayar manuel etkileşimi atlamak için sıradan bir yol arıyordum:

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 anahtar parmak izini not edin ...

Yani, bu bir SSH şey, bu SSH ve genel olarak SSH ile ilgili şeyler git git için çalışacak ...

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

Öncelikle, günlük sürücünüze nmap yükleyin. nmap, açık bağlantı noktalarını tespit etmek gibi belirli şeyler için son derece yararlıdır. Bu, SSH parmak izlerini manuel olarak doğrular. Ama, yaptığımız şeye geri.

İyi. Birden fazla yerde ya da kontrol ettiğim makinelerde uzlaştım ya da hunky dory olmanın her şeyin daha makul bir açıklaması oluyor.

Bu 'parmak izi', aynı parmak izine dönüşen birden fazla dizgenin riskiyle insan rahatlığımız için tek yönlü bir algoritma ile kısaltılmış bir dizedir. Bu olur, onlar çarpışmalar denir.

Yine de, aşağıdaki bağlamda görebileceğimiz orijinal dizgeye geri dönelim.

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

Öyleyse, zamanın önünde, orijinal ana bilgisayardan bir kimlik tanımlaması için bir yolumuz var.

Bu noktada elle otomatik olarak savunmasız kalırız - dizeler eşleşir, parmak izini oluşturan temel verilere sahibiz ve gelecekte bu temel verileri (çarpışmaların önlenmesi) isteyebiliriz.

Artık bu dizeyi bir ana bilgisayar gerçekliğini sormayı engelleyecek şekilde kullanmak ...

Bu durumda, bilinen_hosts dosyası düz metin girişlerini kullanmaz. Onları gördüğünüzde karma girişleri bileceksiniz, xyz.com veya 123.45.67.89 yerine rastgele karakterler içeren karma şekillere benziyorlar.

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==

İlk yorum satırı küskün bir şekilde ortaya çıkıyor - ancak ">" veya ">>" sözleşmesi ile basit bir yönlendirme ile kurtulabilirsiniz.

Bir "ana bilgisayar" ve "güven" i tanımlamak için kullanılmayan lekelenmemiş veri elde etmek için elimden gelenin en iyisini yaptığım gibi, ~ / .ssh dizinindeki bu kimliği benim bilinen_hosts dosyasına ekleyeceğim. Artık bilinen bir ana bilgisayar olarak tanımlanacağından, bir gençken yukarıda bahsedilen uyarıyı almayacağım.

Benimle kaldığın için teşekkürler, işte gidiyorsun. Bitbucket RSA anahtarını ekliyorum, böylece Git depolarımla CI iş akışının bir parçası olarak etkileşimli olmayan bir şekilde etkileşim kurabilirim, ama ne istersen onu yap.

#!/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

Demek bugün için bakire kalıyorsun. Github ile kendi zamanınızda benzer talimatları izleyerek de aynısını yapabilirsiniz.

Herhangi bir kontrolsüz olarak körü körüne programsal olarak eklemenizi söyleyen çok fazla yığın taşma mesajı gördüm. Farklı ağlardaki farklı makinelerin anahtarını ne kadar çok kontrol ederseniz, ana bilgisayarın söylediğine göre o kadar güvendesiniz ki - ve bu güvenlik katmanından umut edebileceğiniz en iyisi budur.

YANLIŞ ssh -oStrictHostKeyChecking = ana makine adı yok [komut]

YANLIŞ ssh-keyscan -t rsa -H ana bilgisayar adı >> ~ / .ssh / known_hosts

Yukarıdaki şeylerden hiçbirini yapma, lütfen. Veri transferinizden birisinin orta saldırıdaki bir adamla kaçmasını engelleme fırsatını yakaladın - bu fırsatı kaçırmayın. Fark, sahip olduğunuz RSA anahtarının iyi niyetli bir sunucu olduğunu doğrulamaktır ve şimdi bu bilgiyi nasıl karşılaştırılacağını biliyorsunuz, böylece bağlantıya güvenebilirsiniz. Sadece farklı bilgisayarlardan daha fazla karşılaştırmanın ve ağların bağlantıya güvenme yeteneğinizi artıracağını unutmayın.


4
2017-10-05 21:18



Bu sorunun en iyi çözüm olduğunu düşünüyorum. Ancak, Amazon EC2 gibi bir şey üzerinde Nmap kullanırken çok dikkatli olun, Nmap'in yaptığı port taraması hakkında bir uyarı aldım! Portscanning yapmadan önce formunu doldurun! - Waqas Shah
...iyi evet. EC2'den port taramasını neden yaptığınızı bilmiyorum. Hesabınıza giriş yaptıysanız, sadece gerçek makinelerin anahtarlarını alabilirsiniz. Kontrolünüz olmayan makineler için bu daha fazla. Kullanmak için AWS port tarama kısıtlamalarına tabi olmayan bir yerel makineye sahip olacağınızı varsayardım. Ancak, nmap'i AWS ile çalıştırmanız gereken bu uç durumdaysanız, bu uyarının yardımcı olacağını düşünüyorum. - BradChesney79
SSH ana bilgisayar anahtarını iş istasyonunuzdan okumak için nmap kullanma ve bu değere güvenme, SSH üzerinden StructHostKeyChecking kapalıyken bağlanmaktan farklı değildir. Bu adam ortadaki bir saldırıya karşı savunmasız. - Micah R Ledbetter
... @ MicahRLedbetter bu yüzden "farklı bilgisayarlardan ve ağlardan daha fazla karşılaştırmanın genellikle bağlantıya güvenme yeteneğinizi artıracağını" önerdim. Ama bu benim amacım. Eğer hedef host'unuzu sadece bir dizi ortam koşulundan kontrol ederseniz, herhangi bir tutarsızlıktan nasıl haberdar olursunuz? Daha iyi bir önerin var mıydı? - BradChesney79
Bu güvenlik tiyatrosu. Daha güvenli bir görünüm yaratmak için karmaşık bir şey yapmak. Ana bilgisayardan anahtarını sormak için kaç farklı yöntem kullandığınız önemli değil. Onlara güvenebiliyorsanız aynı kişiye birden çok kez sormak gibi (belki de ara, e-posta, metin ve salyangoz postası). Her zaman evet diyecekler, ama yanlış kişiyi soruyorsan, önemli değil. - vastlysuperiorman


Tek liner bir betik yapıyorum, uzun ama kullanışlı IP'leri olan ana bilgisayarlar için bu görevi yapmak için dig ve 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





Aşağıdaki ~ / .ssh / known_hosts içinde yinelenen girişleri önlemek:

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



Bunu yapmanın yolu bu değil. MITM. - jameshfisher