Apa yang tertulis dalam file .ssh / known_hosts


Setiap kali kita terhubung melalui protokol ssh ke server, klien ssh memeriksa untuk melihat apakah kunci publik untuk server ini cocok dengan yang terakhir kali (setidaknya itu merekomendasikan melakukan standar ssh). Di OpenSSH, daftar kunci server yang dikenal disimpan dalam file known_hosts. Di bawah katom sebentar tentang apa dan bagaimana tepatnya disimpan di sana.

Semua percobaan dilakukan di Linux (Debian / Mint / Ubuntu). Saya tidak bisa menjamin lokasi dan isi file di OS lain.

Saat menghubungkan ke server ssh untuk pertama kalinya, kami melihat sesuatu seperti ini:
Keaslian host '192.168.0.2 (192.168.0.2)' tidak dapat ditetapkan.
Sidik jari kunci RSA adalah SHA256: kd9mRkEGLo + RBBNpxKp7mInocF3 / Yl / 0fXRsGJ2JfYg.
Anda yakin ingin terus terhubung (ya / tidak)?
Jika Anda setuju, baris berikut akan ditambahkan ke file ~ / .ssh / known_hosts:
| 1 | CuXixZ + EWfgz40wpkMugPHPalyk = | KNoVhur7z5NAZmNndtwWq0kN1SQ = ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCeiF4OOOUhWvOYrh / e4q91 + iz + i9S0s3M2LPq + GAhRlhKt5vKyEVd6x6m26cc98Y + SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x + mPvO9FLSBk / Al2GbH5q6F + hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd + c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti + 7xGwT8DF + tIyLFcU + zxd0QnwJIbNvewkHs0LsMOWFVPz / Nd0XiVXimX + ugCDBZ / 4q8NUwH9SGzCMAvnnr + D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV
Di sini, tiga elemen ditulis dengan spasi: hash atas nama server, nama algoritma asimetris yang digunakan, dan kunci publik server. Mari kita pisahkan mereka.

Dan jika Anda membaca instruksinya
Bahkan, menurut manual untuk Ubunt, bisa ada 2 bidang lagi, juga dipisahkan oleh spasi:
  • di awal baris mungkin ada tanda "@ cert-authority" atau "@revoked", yang berarti, masing-masing, bahwa kunci publik CA ditulis di baris ini atau bahwa kunci ini dicabut dan tidak dapat digunakan.
  • mungkin ada komentar sewenang-wenang di akhir baris


Nama server


Dalam contoh, hash atas nama server (host) terlihat seperti ini:
| 1 | CuXixZ + EWfgz40wpkMugPHPalyk = | KNoVhur7z5NAZmNndtwWq0kN1SQ =
Bahkan, nama host dalam teks yang jelas atau topeng yang menentukan set nama yang valid dapat ditulis di sini. Tapi nama hash default saya disimpan. Catatan ini dibagi menjadi 3 bagian dengan simbol "|". Bagian pertama adalah algoritma hashing. "1" sesuai dengan HMAC-SHA1 (saya belum melihat yang lain). Bagian kedua adalah garam (kunci untuk HMAC). Bagian ketiga adalah hash itu sendiri (output HMAC).

Periksa
from base64 import b64decode import hmac salt = b64decode("CuXixZ+EWfgz40wpkMugPHPalyk=") host = b'192.168.0.2' hash = hmac.HMAC(salt, host, 'sha1').digest() print(b64encode(hash).decode()) 

> 'KNoVhur7z5NAZmNndtwWq0kN1SQ ='

Algoritma asimetris


RFC-4253 mencantumkan 4 algoritma asimetris: ssh-dss (wajib menurut standar, tetapi dianggap lemah dan dimatikan secara default sejak OpenSSH7.0), ssh-rsa (disarankan), pgp-sign-rsa (opsional), pgp- sign-dss (opsional). Secara default, kunci dari dua jenis pertama dihasilkan di Linux untuk algoritma kurva elips yang tidak disebutkan dalam RFC. Yang terakhir lebih disukai, tetapi klien dapat memilih algoritma dengan opsi HostKeyAlgorithms.

Cara memeriksa sidik jari kunci yang diinginkan (bukan yang standar)
Ini dapat berguna jika, misalnya, ketika Anda pertama kali memasuki server, Anda ingin memeriksa sidik jari kunci, dan Anda hanya tahu sidik jari kunci ssh-rsa. Kemudian Anda dapat terhubung dengan perintah ini:
ssh root@192.168.0.2 -o HostKeyAlgorithms = ssh-rsa

Jika Anda juga perlu menentukan algoritma hashing kunci, Anda dapat menggunakan opsi FingerprintHash. Misalnya, jika hanya md5 yang diketahui dari ssh-rsa, Anda dapat terhubung seperti ini:
ssh root@192.168.0.2 -o HostKeyAlgorithms = ssh-rsa -o FingerprintHash = md5


Kunci publik


Kunci publik di known_hosts sama dengan yang dicatat dalam file /etc/ssh/ssh_host_rsa_key.pub di server (ganti nama algoritma yang digunakan sebagai ganti rsa). Jika Anda menghapus pengkodean Base64, maka di dalamnya akan ada lagi nama algoritma dan komponen kunci yang sebenarnya.

Mengapa tidak menghapus Base64
 b'\x00\x00\x00\x07ssh-rsa\x00\x00\x00\x03\x01\x00\x01\x00\x00\x01\x01\x00\x9e\x88^\x0e8\xe5!Z\xf3\x98\xae\x1f\xde\xe2\xafu\xfa,\xfe\x8b\xd4\xb4\xb3s6,\xfa\xbe\x18\x08Q\x96\x12\xad\xe6\xf2\xb2\x11Wz\xc7\xa9\xb6\xe9\xc7=\xf1\x8f\x92Ay\xc2\x07\xd1\x96yV$\xf29E\x1cE\xe7c\x86\x16yb\xc3\xc1r!\x1c\x12X\xb7\x9c\xb3\xde>V\x92\x0fy\xc7\xe9\x8f\xbc\xefE- d\xfc\tv\x19\xb1\xf9\xab\xa1~\x85\x92%.c\xbar"\x12\x99~\x13\xb5\xc1\xb5\xb3\x0e\x12\xc2\x84\xc0\x0e\xba\xe1t\xcd\x0e%\xdf\x9c\xe4%<\x8a\xa0\x9bs\xa3\xf3\x9d\x86\xcbep\xaf\xa8\xf6SY\xe4\x9bL\xb5\x1cR\xedS\x8b\xee\xf1\x1b\x04\xfc\x0c_\xad#"\xc5qO\xb3\xc5\xdd\x10\x9f\x02Hl\xdb\xde\xc2A\xec\xd0\xbb\x0c9aU??\xcdwE\xe2Ux\xa6_\xeb\xa0\x080Y\xff\x8a\xbc5L\x07\xf5!\xb3\x08\xc0/\x9ez\xfe\x0fR<_k\xe1J\xe4lN\xc4\x17/\x93\xf7\xbd\xff\x1e\x94<Ot:\xcc\'3m\x94\x10\x9b-l\xd5' 
Dapat dilihat bahwa ada 4 byte di mana panjang bidang ditulis, kemudian bidang itu sendiri, dll. Bidang pertama adalah nama algoritma, sisanya tergantung pada algoritma tertentu. Di tombol di atas, 3 bidang:
 b'ssh-rsa' -  b'\x01\x00\x01' -   b'\x00\x9e\x88^\x0e8\xe5!Z\xf3\x98\xae\x1f\xde\xe2\xafu\xfa,\xfe\x8b\xd4\xb4\xb3s6,\xfa\xbe\x18\x08Q\x96\x12\xad\xe6\xf2\xb2\x11Wz\xc7\xa9\xb6\xe9\xc7=\xf1\x8f\x92Ay\xc2\x07\xd1\x96yV$\xf29E\x1cE\xe7c\x86\x16yb\xc3\xc1r!\x1c\x12X\xb7\x9c\xb3\xde>V\x92\x0fy\xc7\xe9\x8f\xbc\xefE- d\xfc\tv\x19\xb1\xf9\xab\xa1~\x85\x92%.c\xbar"\x12\x99~\x13\xb5\xc1\xb5\xb3\x0e\x12\xc2\x84\xc0\x0e\xba\xe1t\xcd\x0e%\xdf\x9c\xe4%<\x8a\xa0\x9bs\xa3\xf3\x9d\x86\xcbep\xaf\xa8\xf6SY\xe4\x9bL\xb5\x1cR\xedS\x8b\xee\xf1\x1b\x04\xfc\x0c_\xad#"\xc5qO\xb3\xc5\xdd\x10\x9f\x02Hl\xdb\xde\xc2A\xec\xd0\xbb\x0c9aU??\xcdwE\xe2Ux\xa6_\xeb\xa0\x080Y\xff\x8a\xbc5L\x07\xf5!\xb3\x08\xc0/\x9ez\xfe\x0fR<_k\xe1J\xe4lN\xc4\x17/\x93\xf7\xbd\xff\x1e\x94<Ot:\xcc\'3m\x94\x10\x9b-l\xd5' -  N (0x101 * 8 = 2048 ) 


Sidik jari


Sidik jari kunci yang diusulkan untuk diverifikasi pada koneksi pertama adalah hash yang sesuai (dalam contoh, SHA256) dari kunci publik dari paragraf terakhir dan dari /etc/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/ssh/host_rsa_key.pub yang disandikan di base64 untuk hash fungsi keluarga SHA atau dalam hex untuk MD5.

Kami pertimbangkan
 from hashlib import sha256 from base64 import b64decode, b64encode pub_key_bin = b64decode("AAAAB3NzaC1yc2EAAAADAQABAAABAQCeiF4OOOUhWvOYrh/e4q91+iz+i9S0s3M2LPq+GAhRlhKt5vKyEVd6x6m26cc98Y+SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x+mPvO9FLSBk/Al2GbH5q6F+hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd+c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti+7xGwT8DF+tIyLFcU+zxd0QnwJIbNvewkHs0LsMOWFVPz/Nd0XiVXimX+ugCDBZ/4q8NUwH9SGzCMAvnnr+D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV") hash = sha256(pub_key_bin).digest() fingerprint = b64encode(hash) print(fingerprint) > b'kd9mRkEGLo+RBBNpxKp7mInocF3/Yl/0fXRsGJ2JfYg=' + iz + i9S0s3M2LPq + GAhRlhKt5vKyEVd6x6m26cc98Y + SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x + mPvO9FLSBk / Al2GbH5q6F + hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd + c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti + 7xGwT8DF + tIyLFcU + zxd0QnwJIbNvewkHs0LsMOWFVPz / Nd0XiVXimX + ugCDBZ / 4q8NUwH9SGzCMAvnnr + D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV") from hashlib import sha256 from base64 import b64decode, b64encode pub_key_bin = b64decode("AAAAB3NzaC1yc2EAAAADAQABAAABAQCeiF4OOOUhWvOYrh/e4q91+iz+i9S0s3M2LPq+GAhRlhKt5vKyEVd6x6m26cc98Y+SQXnCB9GWeVYk8jlFHEXnY4YWeWLDwXIhHBJYt5yz3j5Wkg95x+mPvO9FLSBk/Al2GbH5q6F+hZIlLmO6ciISmX4TtcG1sw4SwoTADrrhdM0OJd+c5CU8iqCbc6PznYbLZXCvqPZTWeSbTLUcUu1Ti+7xGwT8DF+tIyLFcU+zxd0QnwJIbNvewkHs0LsMOWFVPz/Nd0XiVXimX+ugCDBZ/4q8NUwH9SGzCMAvnnr+D1I8X2vhSuRsTsQXL5P3vf8elDxPdDrMJzNtlBCbLWzV") hash = sha256(pub_key_bin).digest() fingerprint = b64encode(hash) print(fingerprint) > b'kd9mRkEGLo+RBBNpxKp7mInocF3/Yl/0fXRsGJ2JfYg=' 

Kita melihat bahwa hash benar-benar cocok dengan sidik jari yang ditunjukkan selama koneksi pertama (kutipan di awal artikel), akurat dengan simbol "=" di akhir.

Berikut adalah program kecil untuk menemukan host di file known_hosts, yang muncul selama percobaan.

Source: https://habr.com/ru/post/id421477/


All Articles