Thêm khóa máy chủ chính xác trong know_hosts Khóa / nhiều máy chủ ssh cho mỗi tên máy chủ?


147

Đang cố gắng ssh vào máy tính mà tôi điều khiển, tôi nhận được thông báo quen thuộc:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[...].
Please contact your system administrator.
Add correct host key in /home/sward/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/sward/.ssh/known_hosts:86
RSA host key for [...] has changed and you have requested strict checking.
Host key verification failed.

Tôi thực sự đã thay đổi chìa khóa. Và tôi đã đọc một vài chục bài đăng nói rằng cách để giải quyết vấn đề này là bằng cách xóa khóa cũ khỏi known_hoststệp.

Nhưng điều tôi muốn là ssh chấp nhận cả khóa cũ và khóa mới. Ngôn ngữ trong thông báo lỗi (" Add correct host key") gợi ý rằng cần có một số cách để thêm khóa máy chủ chính xác mà không xóa cái cũ.

Tôi chưa thể tìm ra cách thêm khóa máy chủ mới mà không xóa khóa cũ.

Điều này là có thể, hoặc là thông báo lỗi chỉ cực kỳ sai lệch?


9
Đây là khóa máy chủ đang tạo ra lỗi. Một máy chủ lưu trữ nên có một và chỉ một khóa. Điều này không có gì để làm với khóa khách hàng hoặc người dùng. Bạn có một địa chỉ IP nổi giữa các máy chủ riêng biệt hoặc một cái gì đó không?
David Schwartz

4
Trong trường hợp của tôi, tôi biết rằng tôi sẽ chuyển đổi giữa hai phím rất nhiều trong tương lai gần trong khi loay hoay với một số thứ. Có vẻ như điều này cũng sẽ hữu ích trong một IP với nhiều tình huống máy chủ mà bạn đề xuất. Chủ yếu tôi chỉ muốn biết nếu điều này là có thể cho giáo dục của riêng tôi ngoài bất kỳ ứng dụng thực tế cụ thể nào.
Phường Samuel Edwin

Câu trả lời:


148
  1. lấy khóa rsa của máy chủ server_ipcủa bạn, địa chỉ IP của máy chủ của bạn, chẳng hạn như 192.168.2.1:

    $ ssh-keyscan -t rsa server_ip
    

    Câu trả lời mẫu:

    # server_ip SSH-2.0-OpenSSH_4.3
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...
    
  2. và trên máy khách, sao chép toàn bộ dòng phản hồi server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG...và thêm khóa này vào cuối ~/.ssh/known_hoststệp của bạn :

    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAqx9m529...(the offending key, and/or the very bottom of the `known_hosts` file)
    server_ip ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAwH5EXZG... (line you're adding, copied and pasted from above)
    

12
Điều này đã làm việc! Tuy nhiên, tôi đang sử dụng "HashKnownhosts", vì vậy mục nhập có vẻ hơi lạc lõng. May mắn thay ssh_config (5) đã chỉ cho tôi ssh-keygen (1) giải thích rằng tôi có thể sử dụng "ssh-keygen -H" để băm các mục chưa được xóa. Cảm ơn bạn!
Phường Samuel Edwin

2
Điều này "hoạt động" nhưng bạn không xác minh được khóa, vì vậy bạn dễ bị tấn công bằng
găng tay

3
@JasperWallace, miễn là bước đầu tiên được thực hiện qua kết nối an toàn (ví dụ sử dụng localhost) nó nên được khá an toàn, tôi nghĩ
ony

3
Có cách nào để thu thập tất cả các loại khóa từ máy chủ không? Đôi khi bạn không biết liệu chúng có phải là RSA, DSA, ECDSA, RSA1 ... vv
Sopalajo de Arrierez

3
@SopalajodeArrierez manpage cùng cũng nói rằng bạn có thể phân biệt các loại bằng dấu phẩy, vì vậy làm ssh-keyscan -t rsa1,dsa,rsa,ecdsa,ed25519 server_ip- nhưng lý do duy nhất để tìm rsa1dsaphím là để xác định các máy chủ mà cần phải được nâng cấp / cấu hình lại
kbolino

94

Xóa mục nhập đó khỏi know_hosts bằng cách sử dụng:

ssh-keygen -R *ip_address_or_hostname*

Điều này sẽ xóa IP hoặc tên máy chủ có vấn đề khỏi tệp know_hosts và thử kết nối lại.

Từ trang người đàn ông:

-R hostname
Xóa tất cả các khóa thuộc về tên máy chủ khỏi tệp đã biết. Tùy chọn này hữu ích để xóa các máy chủ băm (xem tùy chọn -H ở trên).


11
"cách thêm khóa máy chủ mới mà không xóa khóa cũ."
Phường Samuel Edwin

4
Đây là giải pháp tốt nhất!
Thomas Decaux

8
Làm thế nào để có 19 phiếu? Nó không đến gần để trả lời câu hỏi được hỏi ..
Molomby

2
Câu hỏi của bạn xuất hiện thứ hai khi tôi google cho "git ssh cập nhật khóa máy chủ". Câu trả lời này là những gì tôi đang tìm kiếm. Mở một câu hỏi mới với chính xác những gì tôi muốn có thể khiến nó đóng lại như một bản sao.
Jason Goemaat

Tên máy chủ cũng hoạt động
damluar

18

Một cách rất đơn giản là:

cp ~/.ssh/known_hosts ~/.ssh/known_hosts.bak

Sau đó chỉnh sửa know_host để xóa khóa gốc, sau đó ssh đến máy chủ bằng cách sử dụng:

ssh name@computer

Nó sẽ tự động thêm khóa mới; sau đó so sánh hai tập tin. Một chương trình như meld là một cách hay để so sánh hai tệp. Sau đó, hợp nhất các tệp để làm cho know_host chứa cả hai khóa

'Lý do' của tôi để giữ hai khóa là hệ thống đích là multiboot, mặc dù tôi dám nói có cách đồng bộ hóa các khóa trong quá trình cài đặt, có vẻ đơn giản hơn khi cho phép nhiều khóa.

EDIT 2015/06

Tôi nên thêm, xem lại nó ngay bây giờ, rằng tôi nhận thấy một cách thậm chí còn đơn giản hơn [miễn là mục nhập có thể nhận dạng được, thông thường từ địa chỉ tên máy chủ / địa chỉ IP ngoài thông báo lỗi tham chiếu vị trí cụ thể của nó];

  1. Chỉnh sửa các tệp know_host để thêm # khi bắt đầu mục nhập 'cũ' trong tệp know_host tạm thời
  2. Kết nối [ssh với máy chủ], đồng ý với lời nhắc để thêm khóa mới 'tự động'
  3. Sau đó chỉnh sửa lại know_host để xóa #

Thậm chí còn có tùy chọn HostKeyAlias ​​như trong

ssh -o HostKeyAlias=mynewaliasforthemachine name@computer

sau đó, sau khi máy khách ssh thêm khóa mới vào bí danh, bạn có thể chỉnh sửa know_host để thay thế địa chỉ tên máy chủ / tên thực 'cho bí danh hoặc kết nối với hóa thân của máy chủ đó bằng tùy chọn bí danh



đó là meld :) tên cài đặt apt-get / yum chỉ đơn giản là meld
Đánh dấu

Tôi đã thực hiện một biến thể của đề xuất của bạn hoạt động tốt - thay vì cp, mv, sau đó là ssh, sau đó là mèo ~ / .ssh / know_hosts.bak ~ / .ssh / unknown_hosts> tmp; mv tmp ~ / .ssh / know_hosts
Peter N Lewis

6

Tôi có cùng một vấn đề với một raspberry pi mà tôi khởi động với một số hệ thống khác nhau (hệ thống dev để biên dịch nhị phân cánh tay, dự án, xbmc, v.v.) và đã gặp vấn đề tương tự. Họ sử dụng DHCP trên mạng cục bộ và bộ định tuyến của tôi luôn sử dụng lại cùng một IP vì địa chỉ MAC là như nhau. Tôi đã giải quyết nó bằng cách sử dụng các tên miền khác nhau trong tệp máy chủ của mình:

10.10.10.110 pi-dev
10.10.10.110 pi-xbmc
10.10.10.110 pi-etc

Tệp know_hosts lưu dấu vân tay theo tên máy chủ, mặc dù đó là cùng một địa chỉ IP, mỗi tên máy chủ duy nhất có một mục nhập khác nhau.

Tôi phát ốm khi thêm tên vào máy chủ lưu trữ mỗi khi tôi sử dụng một hệ thống mới vì vậy tôi đã nghĩ ra một cách thậm chí còn lười hơn bằng cách sử dụng các số 0 đứng đầu trên các địa chỉ IP như:

$ ssh pi@10.10.10.110
$ ssh pi@010.10.10.110
$ ssh pi@10.010.10.110

Mỗi biến thể của địa chỉ IP (không được chuẩn hóa) sẽ có mục nhập riêng trong các know_hosts.


1
Mọi người OpenSSH đã khôn ngoan với tôi, lỗ hổng này không còn hoạt động trong các phiên bản gần đây nữa.
Mike

Bạn có thể sử dụng CheckHostIP notrong ~/.ssh/configđể có thể vẫn sử dụng kẽ hở. Bạn thậm chí có thể xác định bí danh của mình ở đó để bạn không phải nghịch ngợm /etc/hostsCheckHostIP nochỉ xác định cho 3 tên máy chủ này.
GnP

3

Nếu cả máy khách và máy chủ của bạn có OpenSSH 6.8 hoặc mới hơn, bạn có thể sử dụng UpdateHostKeys yestùy chọn trong ssh_confighoặc ~/.ssh/config. Ví dụ:

Host *
    UpdateHostKeys yes

Điều này làm cho SSH lưu trữ tất cả các khóa máy chủ mà máy chủ phải thực hiện known_hostsvà khi máy chủ thay đổi hoặc xóa một khóa máy chủ, khóa cũng được thay đổi hoặc xóa trong bạn known_hosts.


Đây là câu trả lời hữu ích nhất! Mặc dù nó không cung cấp một cách rõ ràng để giải quyết câu hỏi ban đầu nếu khóa máy chủ đã bị thay đổi, nhưng tất cả các câu trả lời khác đều không an toàn vì chúng không xác minh khóa máy chủ mới. Tùy chọn này cho phép bạn thực hiện cuộn qua an toàn với các khóa máy chủ mới.
Jaap Eldering

1

Tôi không thấy lý do tại sao bạn muốn làm việc với hai khóa, nhưng bạn chắc chắn có thể thêm nhiều hơn một khóa hợp lệ vào ~/.ssh/known_hoststệp, nhưng bạn sẽ phải thực hiện thủ công.

Một giải pháp khác có thể là sử dụng StrictHostKeyChecking=notùy chọn cho máy chủ lưu trữ cụ thể này:

ssh -o StrictHostKeyChecking=no user@host

mà bạn có thể đặt vào một bí danh trong ~/.profilehoặc một cái gì đó tương tự.

alias hc=ssh -o StrictHostKeyChecking=no user@host

StricthostKeyChecking dường như không giúp ích gì trong trường hợp này; rõ ràng nó chỉ xác định hành vi khi máy chủ không có trong tệp know_hosts. Đề cập ở đây: gossamer-threads.com/lists/openssh/dev/45349#45349
Phường Samuel Edwin

Nó hoạt động ở đây. Bạn sẽ nhận được cảnh báo, nhưng đăng nhập vẫn tiếp tục.
Sven

Thật ki quặc. Bạn đang sử dụng xác thực mật khẩu? Bạn đang sử dụng OpenSSH?
Phường Samuel Edwin

1

Nếu bạn chỉ ssh vào một mạng cục bộ thì ...

Một giải pháp đơn giản là xóa tập tin khóa cũ và thay thế nó bằng một tập tin trống. Điều này sẽ cho phép bạn ủy quyền lại tất cả các kết nối của bạn với các khóa mới. Nếu bạn có các khóa ssh được lưu trữ cho các trang web bên ngoài mạng cục bộ của mình, thì bạn cần đảm bảo rằng kết nối ban đầu của bạn an toàn như lần đầu tiên bạn kết nối với máy chủ đó.

ví dụ

cp known_hosts known_hosts.old
rm known_hosts
nano known_hosts

Sau đó nhấn phím cách, backspace cntl + x và 'y' để lưu bộ đệm mới (tệp). Thực tiễn tồi nhưng không sao, cung cấp cho bạn không thường xuyên ở bên ngoài mạng cục bộ của bạn (ví dụ: máy chủ uni hoặc máy chủ làm việc)

Trên một mạng cục bộ an toàn, điều này là an toàn vì bạn không thể có được một người đàn ông trong cuộc tấn công giữa.

Nó luôn luôn tốt hơn để sử dụng mã bạn hiểu!


4
Xóa toàn bộ known_hoststệp mỗi lần sẽ phủ nhận phần lớn bảo mật được cung cấp bởi ssh.
kasperd

Thật vậy, tôi sẽ lập luận rằng trên một mạng nội bộ an toàn, việc hiểu mã của bạn và phá vỡ sự bảo mật sẽ an toàn hơn là sao chép mã một cách vô thức. Trên một mạng bên ngoài thì tình hình sẽ khác.
Aaron

-1

Rất nhiều câu trả lời, nhưng rất nhiều câu hỏi từ bỏ sự bảo vệ bằng cách tắt hoàn toàn việc kiểm tra máy chủ nghiêm ngặt hoặc hủy thông tin máy chủ không liên quan hoặc chỉ buộc người dùng phải chấp nhận khóa một cách tương tác, có thể vào thời điểm muộn hơn.

Đây là một kỹ thuật đơn giản để cho phép bạn kiểm tra máy chủ nghiêm ngặt, nhưng cập nhật khóa theo cách được kiểm soát, khi bạn muốn nó thay đổi:

  • Xóa khóa cũ và cập nhật trong một lệnh

    ssh-keygen -R server.example.com && \
        ssh -o StrictHostKeyChecking=no server.example.com echo SSH host key updated.
    
  • Lặp lại với (các) địa chỉ IP hoặc tên máy chủ khác nếu bạn sử dụng chúng.

Ưu điểm của phương pháp này là nó tái sử dụng máy chủ chính xác một lần. Hầu hết các phiên bản của ssh-keygen dường như không trả về lỗi nếu máy chủ bạn cố xóa không tồn tại trong tệp máy chủ đã biết, nếu đây là sự cố đối với bạn, hãy sử dụng hai lệnh theo thứ tự.

Cách tiếp cận này cũng xác minh kết nối và phát ra một thông báo hay cho các bản ghi trong lệnh ssh (đăng nhập, cập nhật khóa máy chủ và xuất ra khóa máy chủ SSH được cập nhật sau đó thoát ngay lập tức.

Nếu phiên bản ssh-keygen của bạn trả về mã thoát khác không và bạn muốn xử lý việc này mà không có lỗi, bất kể kết nối hay trước đó, chỉ cần sử dụng hai lệnh theo trình tự, bỏ qua mọi lỗi trên lệnh ssh-keygen.

Nếu bạn sử dụng kỹ thuật này, bạn không bao giờ cần thay đổi lệnh ssh của mình hoặc tắt kiểm tra máy chủ ngoại trừ trong một lệnh ssh đó. Bạn có thể chắc chắn rằng các phiên ssh trong tương lai sẽ hoạt động mà không có xung đột hoặc cần chấp nhận rõ ràng một khóa mới, miễn là lệnh ssh ở trên chạy mà không gặp lỗi.


-3

Tôi đã từng gặp vấn đề tương tự.

Tất cả tôi đã làm là sudo nano /home/user/.ssh/ host_allowvà xóa chìa khóa.

Khi tôi ssh trở lại máy chủ, nó đã thêm một khóa mới.


2
Một số thông tin xung quanh lý do tại sao điều này xảy ra sẽ hữu ích cho câu trả lời.
Drew Khoury

-4

Sử dụng lệnh sed để xóa dòng vi phạm

OUTPUT: as show in above example
Offending key in /home/user/.ssh/known_hosts:86

Xóa dòng 86 như đã đề cập trong các máy chủ đã biết.

CODE: 
sed -i '86d' /home/user/.ssh/known_hosts

Lần tới khi truy cập bằng ssh, hệ thống sẽ tự động thêm khóa mới.

phiên bản mới hơn của ssh

sử dụng:

ssh-keygen -R <hostname|ip address>

Nó sẽ loại bỏ các mục hostname và chịu sao lưu cũ .known_hostnhưknown_hosts.old


4
"Nhưng điều tôi muốn là ssh chấp nhận cả khóa cũ và khóa mới." Câu trả lời của bạn không làm điều này.
Phường Samuel Edwin
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.