Van-e mód arra, hogy programozottan megszerezzük az SSH szerver kulcs ujjlenyomatát hitelesítés nélkül hozzá?
Megpróbálom a ssh -v user@host false 2>&1 | grep "Server host key"
fájlt, de ez jelszóra vár, ha a kulcs alapú hitelesítés nincs beállítva.
Válasz
Ezt úgy teheti meg, hogy egyesíti a ssh-keyscan
és a ssh-keygen
:
$ file=$(mktemp) $ ssh-keyscan host > $file 2> /dev/null $ ssh-keygen -l -f $file 521 de:ad:be:ef:de:ad:be:ef:de:ad:be:ef:de:ad:be:ef host (ECDSA) 4096 8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d:8b:ad:f0:0d host (RSA) $ rm $file
(sajnos a sokkal egyszerűbb ssh-keyscan host | ssh-keygen -l -f /dev/stdin
nem működik)
Megjegyzések
Válasz
Nemrég magamnak kellett ezt megtenni, úgy gondoltam, hogy adj hozzá egy választ, amely megmutatja, hogyan lehet ezt megtenni (az OpenSSH 7.2 vagy újabb verzióival) egy sorban a folyamat helyettesítésével:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
A következő szöveg elmagyarázza ezeknek a parancsoknak a működését, és kiemeli az OpenSSH segédprogramok régebbi és újabb verziói közötti viselkedésbeli különbségeket.
Nyilvános gazdagépkulcsok lekérése
A ssh-keyscan
parancsot úgy fejlesztették ki, hogy a felhasználók nyilvános gazdagépkulcsokat szerezhessenek, anélkül, hogy hitelesíteni kellene őket az SSH szerveren. Man oldaláról:
ssh-keyscan
egy segédprogram számos nyilvános ssh gazdagépkulcs összegyűjtéséhez otthont ad. Úgy tervezték, hogy segítsen assh_known_hosts
fájlok összeállításában és ellenőrzésében.
Kulcs típusa
A beolvasandó kulcs típusát a -t
opcióval lehet megadni.
-
rsa1
(elavult SSH protokoll 1. verzió) -
rsa
-
dsa
-
ecdsa
(az OpenSSH legújabb verziói) -
ed25519
(az OpenSSH legújabb verziói)
A modern OpenSSH kiadásokban a beolvasandó alapértelmezett kulcs típusok rsa
(az 5.1-es verzió óta), ecdsa
(a 6.0 verzió óta) és ed25519
(a 6.7 verzió óta).
A iv id régebbi verzióival = “959be47752”>
(az OpenSSH 5.1-es verziója előtt) az alapértelmezett kulcstípus az elavultrsa1
volt (1. SSH protokoll), tehát a kulcstípusokat kifejezetten meg kell határozni:
ssh-keyscan -t rsa,dsa hostname
Base64 kulcsok ujjlenyomat-kivonatainak megszerzése
ssh-keyscan
kinyomtatja az SSH szerver gazdagépkulcsát a Base64-kódolású formátum. Ennek átalakításához ujjlenyomat-kivonatként a ssh-keygen
segédprogram használható a -l
opcióval a megadott nyilvános kulcs ujjlenyomatának kinyomtatásához.
A Bash, Zsh (vagy a Korn shell) használata esetén a folyamathelyettesítés használható egy praktikus egybetéteshez:
ssh-keygen -lf <(ssh-keyscan hostname 2>/dev/null)
Megjegyzés : Az OpenSSH 7.2 előtti verzióival a ssh-keygen
által használt funkciók fájlok, nem nagyon kezelték a megnevezett csöveket (FIFO), így ez a módszer nem fog működni, ezért ideiglenes fájlok használatát igényli.
Hasító algoritmusok
A (z) ssh-keygen
print SHA256 ujjlenyomat-kivonatok a billentyűkről. MD5 kivonatok megszerzéséhez a szerverkulcs ujjlenyomataiból (a régi viselkedés) a -E
opcióval megadható a kivonatoló algoritmus:
ssh-keygen -E md5 -lf <(ssh-keyscan hostname 2>/dev/null)
Egy csővezeték használata
POSIX héj (például dash
), amely nem tartalmazza a folyamatok helyettesítését, az ideiglenes fájlokat használó egyéb megoldások működni fognak. Az OpenSSH újabb verzióival (7.2-től kezdve) azonban egyszerű pipeline használható, mivel a ssh-keygen
elfogadja a -
fájlt a szabványos bemeneti adatfolyam, egyvonalas pipeline parancs használatával.
ssh-keyscan hostname 2>/dev/null | ssh-keygen -E md5 -lf -
Megjegyzések
- Szép és alapos válasz, ez minden bizonnyal jobb, mint egy ideiglenes fájl!Javasolhatom, hogy kezdetben adjon meg egy TL; DR-t a folyamathelyettesítő verzióval, hogy a türelmetlen emberek gyorsabban megtalálják? 🙂
- Úgy tűnik, hogy nem működik az Ubuntu 14.04 LTS-en; Hibaüzenetet kapok ” / dev / fd / 63 nem nyilvános kulcsfájl “. Az alfolyamat valóban működik.
- @melleb Ugyanezt találtam egy 12.04-es rendszeren, amelyhez hozzáférhetek. Gyanítom, hogy az OpenSSH régebbi verzióinak
ssh-keygen
problémája van a FIFO / named pipe-ból való olvasással. ‘ Megnézem ezt (és frissítem a válaszomat), amikor szabadidőm lesz. - @melleb Miután elköltöttem az olvasási időmet különféle forráskód-kiadások letöltésével és a
printf
hibakeresési utasításokat beszúrva azdo_fingerprint()
függvénybe, azt tapasztaltam, hogy az OpenSSH 7.2 előtti verzióival assh-keygen
fájlok olvasásához nem nagyon kezelte az elnevezett csöveket (FIFO), így a folyamat-helyettesítési módszer nem fog működni. - Ez működik, de ha az ujjlenyomat ellenőrzéséhez használja, a felhasználóknak tisztában kell lenniük azzal, hogy van ‘ sa versenyfeltétel: az ezzel a paranccsal ellenőrzött ujjlenyomat nem feltétlenül az Ön által használt kulcsé letöltés, hacsak nem dobja ki a kulcsot, mielőtt meghívná az ssh-keygen-t.
Válasz
nmap
biztosítja ezt a képességet a ssh-hostkey
szkript használatával.
A kulcs hexadecimális ujjlenyomatának visszaadásához:
$ nmap [SERVER] --script ssh-hostkey
A kulcs tartalmának visszaadásához:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=full
A kulcs vizuális buborékának visszaküldése
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey="visual bubble"
A fentiek visszaadásához:
$ nmap [SERVER] --script ssh-hostkey --script-args ssh_hostkey=all
Forrás: nmap dokumentumok
Megjegyzések
- Ezek a példák feltételezik, hogy az SSH mindig a 22-es porton fut? Mi van, ha az ssh nem szabványos porton hallgat?
- @MartinVegter (Guarin42 átfogalmazása, aki nem tudta ‘ t comment 🙂 Az nmap rendelkezik a
-p
opcióval, amely megadhat egy portot, pl.-p 22000
. ‘ a-vv
opciót is használhatja a bőbeszédűség (a megadott információk mennyisége) növelésére
Válasz
A filezilla megjeleníti a kulcsokat az md5-tel hashedálva hexadecimális formátum.
ennek megtalálásához a ubuntu linux gépen használja ezt a parancsot:
ssh-keygen -l -E md5 -f <(ssh-keyscan localhost 2>/dev/null)
megjegyzés: cserélje le a “localhost” szót az ellenőrizni kívánt gép ip-jére.
Megjegyzések
- Ez nekem bevált az Ubuntu 18-on, de vegye figyelembe, hogy a
localhost
127.0.0.1
különbségeket kapja vagydomain.tld
. Ellenőrizze az érintett URL URL-jének ujjlenyomatát!!
Válasz
Itt van egy shell szkript (főleg Bourne shell, de local
kulcsszót használ, amely a legmodernebb /bin/sh
) változatban érhető el. Erre már írtam. Használja, mint a ssh-hostkey hostname
. Mind az sha256, mind az md5 formátumú ujjlenyomatokat megjeleníti az összes hosztkulcshoz az adott hosztnévhez vagy IP-címhez. Azt is megadhatja manuálisan, hogy “md5
“vagy” sha256
“második argumentumként, amely csak az adott formátumot jeleníti meg.
A piping helyett ideiglenes fájlt használ, hogy kompatibilis legyen a régebbi OpenSSH csomagokkal (a többi válaszban leírtak szerint). Az ideiglenes fájl /dev/shm
(megosztott memória) funkciót használ, ha rendelkezésre áll.
#!/bin/sh usage () { printf "%s\n" "Usage: ssh-hostkey HOSTNAME [FPRINTHASH]" } ssh_hostkey () { local host="$1" local fprinthash="$2" local tmp= case "$host" in -h|--help|"") usage >&2 return 1 ;; esac case "$fprinthash" in md5|sha256|"") true;; *) usage >&2 printf "%s\n" "Fingerprint hash may be "md5" or "sha256"" >&2 return 2 ;; esac if test -d /dev/shm then tmp="$(mktemp -d -p /dev/shm)" else tmp="$(mktemp -d)" fi trap "trap - INT TERM EXIT; rm -rf "$tmp"" INT TERM EXIT ssh-keyscan "$host" > "$tmp/f" 2> /dev/null case "$fprinthash" in sha256|"") ssh-keygen -l -f "$tmp/f" 2> /dev/null;; esac case "$fprinthash" in md5|"") ssh-keygen -l -E md5 -f "$tmp/f" 2> /dev/null;; esac trap - INT TERM EXIT rm -rf "$tmp" > /dev/null 2>&1 } ssh_hostkey "$@"
Megjegyzések
- Ez egy jó bemutató az alacsonyabb szintű eszközök parancssori opciókkal történő csomagolásáról. Bónuszt tartalmaz a használat módjáról megosztott memória
/dev/shm
, amiről soha nem tudtam, hogy ilyen kényelmes lenne. Köszönjük a megosztást !
Válasz
Saját szerveremnél ezt használom:
ssh-keygen -l -E md5 -f <(cat /etc/ssh/ssh_host_*_key.pub) ssh-keygen -l -E sha256 -f <(cat /etc/ssh/ssh_host_*_key.pub)
Válasz
Az egyszerű válasz amikor már van hozzáférése a szerverre a következő:
ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Most lehet, hogy nem használja az RSA kulcsot: ha csatlakozáskor, akkor ssh
elmondja
ECDSA kulcs ujjlenyomata SHA256: XXXXX
Helyette a /etc/ssh/ssh_host_ecdsa_key.pub
parancsot kell használnia. (értesítés _ecdsa_ ). Így összeállítható egy univerzálisabb parancs, amely felsorolja az összes kulcsot ( forrás ):
for f in /etc/ssh/ssh_host_*_key.pub; do ssh-keygen -lf "$f"; done
A szerver felállításakor felírhatja a listát, későbbi felhasználásra.Egy másik lehetőség az, hogy tárolja őket a DNS-rekordokban
Az ssh-keygen (1) kezelőoldalról:
-l
A megadott nyilvános kulcs fájl ujjlenyomatának megjelenítése. Az RSA és a DSA kulcsoknál az ssh-keygen megpróbálja megtalálni a megfelelő nyilvános kulcsfájlt, és kinyomtatja az ujjlenyomatát. Ha -v-vel kombináljuk, akkor a kulcs vizuális ASCII ábrázolását az ujjlenyomat tartalmazza.
-f
filename
Megadja a kulcsfájl fájlnevét.
ssh-keygen -l -f - <(ssh-keyscan host)
mégis?ssh-keyscan host | ssh-keygen -lf -
ssh-keygen -l -f <(ssh-keyscan host)
ssh-keygen -l -f -
a várakozásoknak megfelelően működik az ssh-keygen 7.2 és újabb verziókban. Néhány STDERR-hez hozzárendelhet megjegyzést, amelyeket ki lehet szűrni, amint az a válaszban szerepel írta Anthony Geoghegan vagyssh-keyscan host 2>/dev/null | ssh-keygen -l -f -
2048 SHA256:gYz11pP/v/SMzUD58jrZ+m1EFC1pvyMxvIrg4PYlvDY
) Ha a régi formátumban szeretné megadni, akkor adja meg az-E md5
szolgáltatást, és ‘ olyasmit fog látni, hogy2048 MD5:0b:f5:49:d2:69:a5:49:2c:d9:45:75:87:4d:a0:7d:33
.