Làm cách nào để chỉnh sửa know_host khi một số máy chủ chia sẻ cùng tên IP và DNS?


29

Tôi thường xuyên ssh vào một máy tính là máy tính OS X / Linux khởi động kép. Hai phiên bản HĐH không chia sẻ cùng một khóa máy chủ, vì vậy chúng có thể được xem là hai máy chủ chia sẻ cùng một IP và DNS. Giả sử IP là 192.168.0.9, và tên là hostnamehostname.domainname

Theo tôi hiểu, giải pháp để có thể kết nối với hai máy chủ là thêm cả hai vào ~/.ssh/know_hoststệp. Tuy nhiên, nó được nói dễ hơn làm, bởi vì các tập tin được băm, và có lẽ một số mục cho mỗi máy chủ ( 192.168.0.9, hostname, hostname.domainname). Kết quả là, tôi có cảnh báo sau

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

Có một cách dễ dàng để chỉnh sửa known_hoststập tin, trong khi vẫn giữ băm. Ví dụ: làm thế nào tôi có thể tìm thấy các dòng tương ứng với một tên máy chủ nhất định? Làm cách nào tôi có thể tạo băm cho một số máy chủ đã biết?

Các giải pháp lý tưởng sẽ cho phép tôi để kết nối với liên tục với máy tính này với ssh, dù tôi gọi nó 192.168.0.9, hostnamehoặc hostname.domainname, cũng không nếu nó sử dụng hostkey Linux hoặc hostkey OSX của nó. Tuy nhiên, tôi vẫn muốn nhận được một cảnh báo nếu có một cuộc tấn công trung thực thực sự, tức là nếu một khóa khác ngoài hai khóa này được sử dụng.


Bạn muốn làm gì Chỉnh sửa nó để làm gì?
Rhyuk

@Rhyuk: Chỉnh sửa nó để có thể nhận ra là hợp lệ cả khóa máy chủ OSX và linux cho địa chỉ IP, tên máy chủ và tên máy chủ.domainname.
Frédéric Grosshans

@Rhyuk: Tôi đã chỉnh sửa câu hỏi thứ. Bây giờ thì rõ hơn chưa?
Frédéric Grosshans

2
Bạn đã đơn giản xem xét làm cho cả hai cài đặt có cùng một khóa?
Zoredache

3
Có một vài trường hợp khi sử dụng một địa chỉ IP để truy cập nhiều thực thể (mỗi thực thể có các khóa máy chủ SSH riêng lẻ) và vẫn duy trì kiểm soát chặt chẽ rằng CHỈ các khóa máy chủ đó là các địa chỉ mà máy khách SSH nhìn thấy. Ví dụ: một số thiết lập có tính sẵn sàng cao trong đó một cụm đơn vị được truy cập bằng một địa chỉ IP được chia sẻ nhưng trong đó (vì một lý do nào đó) khóa máy chủ SSH được khách hàng nhìn thấy thay đổi tùy thuộc vào đơn vị cụm nào hiện đang hoạt động. Một trường hợp khác là khi nhiều máy chủ SSH nằm sau tường lửa NAT và được truy cập từ bên ngoài, tất cả chúng dường như sẽ có cùng một IP.
IllvilJa

Câu trả lời:


12

Giải pháp đơn giản nhất ở đây chỉ là sử dụng cùng một khóa máy chủ cho Linux và OS X. Nghĩa là chọn một bộ /etc/ssh/ssh_host_*_key*tệp và sao chép chúng sang HĐH khác. Sau đó, cùng một khóa máy chủ sẽ được trình bày cho máy khách SSH bất kể bạn đã khởi động hệ điều hành nào và máy khách SSH sẽ không phải là người khôn ngoan hơn.


Tôi thích phiên bản máy khách hơn, nhưng tôi sẽ thử phiên bản này nếu tôi không tìm thấy phiên bản nào. Bằng cách này, các OSX (không chuẩn) nội địa hóa các tập tin là /private/etc/ssh_host*, không phải /etc/ssh/ssh_host*.
Frédéric Grosshans

Sao chép các tập tin từ máy này sang máy khác (hai máy linux) không hoạt động với tôi. Mặc dù nội dung tệp giống hệt nhau, hàm băm không phải vậy nên tôi vẫn gặp sự cố (có thể là thời gian sửa đổi?). Giải pháp dưới đây tốt hơn nhiều.
Stav

sshdtải các khóa máy chủ một lần khi khởi động, do đó rất có thể bạn cần phải khởi động lại sshd. Tôi sẽ thêm nó vào câu trả lời. Đối với các giải pháp khác là tốt hơn, nó phụ thuộc vào tình huống của bạn. Tôi sẽ lập luận rằng ưu điểm chính của phương pháp này là nó chỉ yêu cầu thiết lập một lần và có nhiều khả năng hoạt động với nhiều triển khai máy khách SSH.
jjlin

Thật kỳ lạ, có vẻ như OpenSSH 7.4p1 tương đối gần đây của tôi sshdtải các khóa máy chủ trên mỗi kết nối mới. Có lẽ nó đã xảy ra theo cách này từ lâu và tôi chỉ cho rằng các khóa máy chủ được xử lý như sshdcấu hình khác . Vì vậy, dù sao, đó có thể hoặc không phải là vấn đề của bạn.
jjlin

Sẽ là một ý tưởng tồi khi làm điều này với hai máy chủ lưu trữ trong một cụm có chung địa chỉ VRRP? Khi chuyển đổi dự phòng, máy chủ phản hồi sẽ khác nhau. Tôi muốn không nhận được cảnh báo.
Colin 't Hart

26

Như @Izzy đã đề xuất trong một nhận xét ở trên, ssh cho bạn biết dòng vi phạm và bằng cách xóa dòng đó, (lưu nó ở nơi khác), chấp nhận khóa mới và sau đó sao chép lại dòng đã xóa, bạn kết thúc bằng hai phím cho cùng máy chủ, và ssh sẽ chấp nhận một trong hai.

(Bạn cũng có thể sử dụng ssh-keygen -H -F <hostname>để tìm các dòng trong tệp know_hosts khớp với tên máy chủ đó. Chạy nó sau khi sao chép dòng bị xóa trở lại sẽ liệt kê hai mục.)

Nếu bất cứ ai biết làm thế nào để PuTTY làm điều tương tự, tôi sẽ rất thích thú khi nghe về nó.


4
Trên thực tế, nếu bạn có một máy khách linux, bạn thậm chí không cần phải xóa dòng vi phạm, bạn chỉ phải nhận xét nó bằng ký tự băm ('#') ở phía trước. Sau đó, khi bạn đã chấp nhận khóa mới, bạn có thể chỉnh sửa tệp know_hosts và bỏ dòng với khóa cũ. Nhưng vâng, điều này cũng hữu ích trong Putty.
IllvilJa

1
Nếu có hai máy chủ có cùng tên, nhưng địa chỉ IP khác nhau và khóa máy chủ khác nhau, cách giải quyết này cũng hoạt động: Nhận xét (hoặc tạm thời xóa) sau đó cả hai dòng cho máy chủ đó (một dựa trên địa chỉ IP và một dựa trên máy chủ lưu trữ tên), kết nối với máy chủ chưa được biết đến, sau đó thêm lại các dòng đã được nhận xét hoặc xóa.
Kai Petzke

13

Tôi thấy điều này có thể giúp bạn với những gì bạn muốn đạt được.

Nguồn: /programming/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

Tạo một tệp cấu hình trong thư mục .ssh của bạn như sau:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

Giải thích bên dưới (từ man ssh_config)

CheckhostIP

Nếu cờ này được đặt thành "có", ssh (1) sẽ kiểm tra thêm địa chỉ IP máy chủ trong tệp đã biết. Điều này cho phép ssh phát hiện nếu khóa máy chủ thay đổi do giả mạo DNS. Nếu tùy chọn được đặt thành "không", kiểm tra sẽ không được thực hiện. Mặc định là "có".

HostKeyAlias

Chỉ định một bí danh nên được sử dụng thay vì tên máy chủ thực khi tra cứu hoặc lưu khóa máy chủ trong các tệp cơ sở dữ liệu khóa máy chủ. Tùy chọn này hữu ích để tạo đường hầm kết nối SSH hoặc cho nhiều máy chủ đang chạy trên một máy chủ.

Dòng Tên người dùng và Cổng cũng tránh bạn phải cung cấp các tùy chọn đó trên dòng lệnh, vì vậy bạn chỉ có thể sử dụng:

% ssh server1
% ssh server2

Tôi đã xem bài viết này, nhưng nó không tương ứng với trường hợp của tôi: hai máy chủ được phân biệt bởi số cổng trong bài viết, không phải trong trường hợp của tôi. Hơn nữa, tôi muốn giữ các lớp bảo mật bổ sung do băm muối mang vào known_hostsCheckHostIP.
Frédéric Grosshans

1
@ FrédéricGrosshans, tôi đã kiểm tra. Bạn không cần phải có các cổng riêng biệt và tùy chọn HashKnownhosts hoạt động tốt với HostKeyAlias.
Zoredache

Mặt trái của vấn đề này, trừ khi tôi sai là, cái này được cấu hình trên cơ sở mỗi máy khách so với câu trả lời được chấp nhận chỉ được định cấu hình trên các máy chủ ssh chấp nhận.
FreeSoftwareServers

2

Cách dễ nhất để giải quyết vấn đề của bạn là cung cấp cho mỗi máy chủ một địa chỉ IP riêng / riêng. Với 253 địa chỉ có sẵn trong mạng (riêng tư) và IPv4 của bạn, điều đó sẽ không có vấn đề gì lớn. Cung cấp cho họ IP cố định (vì máy chủ DHCP sẽ xác định máy dựa trên địa chỉ MAC của thẻ mạng và cả hai sẽ có cùng một địa chỉ). Tôi không thấy bất kỳ giải pháp nào khác nếu bạn muốn giữ các biện pháp bảo mật (mà tôi sẽ không bỏ qua cho "sự thoải mái" nhỏ đó).


Trên thực tế, địa chỉ IP không phải 192.168.0.xxvà không riêng tư. Đó là một địa chỉ IPv4 'thực', được cung cấp bởi trường đại học của tôi mà tôi không được tự do thay đổi.
Frédéric Grosshans

Nếu bạn kiểm tra với Wikipedia , bạn sẽ thấy 192.168.0.0 - 192.168.255.255 (câu hỏi của bạn được chỉ định 192.168.0.9, thuộc phạm vi này) thuộc về "Không gian địa chỉ IPv4 riêng tư". Vì vậy, bằng cách "riêng tư" tôi đã không đề cập đến bạn "sở hữu" nó, nhưng với thông số kỹ thuật của IETF . Trong câu hỏi của bạn, bạn không cho biết bạn không thể thay đổi IP, xin lỗi - nhưng với đầu vào được đưa ra, câu trả lời của tôi là phù hợp.
Izzy

Xin lỗi cho câu hỏi phrased xấu. Tôi đã không downvote.
Frédéric Grosshans

Không có thăm dò, và tnx đã cho tôi biết - làm cho downvote bớt nản lòng. Nhưng một ý tưởng khác: Tôi không chắc chắn nơi tệp tin_hosts lấy tên máy chủ từ đâu, đảo ngược DNS hoặc được cung cấp bởi khách hàng. Bạn có thể thử đổi tên một trong những "máy chủ" của mình để nó thể hiện một tên máy chủ khác. Hoặc để thêm cả hai khóa máy chủ: ssh cho bạn biết "dòng vi phạm" trong tệp know_hosts của bạn (khi số 1 được chứa trong khi bạn kết nối với số 2). Vì vậy, sau đó bạn có thể sao chép dòng đó sang một tệp khác, xóa nó khỏi know_hosts, để số 2 kết nối và thêm dòng của nó và thêm dòng bị xóa trở lại. Không chắc chắn nếu nó hoạt động, nhưng bạn có thể thử.
Izzy

2

Tôi không gặp phải vấn đề đó khi kết nối với nhiều hộp VPS khác nhau chia sẻ cùng một IP vì mỗi hộp có một cổng SSH khác nhau (20022.30022, v.v.) để chúng được đăng ký là máy chủ đã biết với các khóa khác nhau.

Đó có thể là một cách giải quyết cho bạn?


Xin chào @Pyheme, chào mừng bạn đến với Siêu người dùng! Lưu ý rằng câu hỏi này đã gần 4 tuổi. Không có gì sai khi trả lời nó, nhưng hãy nhớ rằng có thể bạn không nhận được phản hồi.
Hewbot

Tôi không có máy OS X nữa, nhưng câu trả lời của bạn có thể hữu ích cho người khác. Đó là toàn bộ quan điểm trao đổi ngăn xếp
Frédéric Grosshans

@Hewbot ... thực sự, tôi thấy nó bây giờ. Không biết tại sao, nó lại xuất hiện trong danh sách các câu hỏi gần đây ...
Pyheme

1

Một bài viết khác , mô tả một số cách để xử lý vấn đề của bạn:

Phương thức thứ hai sử dụng hai tham số openSSH: StrictHostKeyCheckinUserKnownHostsFile. Phương pháp này đánh lừa SSH bằng cách định cấu hình nó để sử dụng tệp know_hosts trống và KHÔNG yêu cầu bạn xác nhận khóa nhận dạng máy chủ từ xa.


Bài viết này là về việc không cho phép kiểm tra chìa khóa. Tôi muốn tiếp tục kiểm tra khóa và tôi không muốn không cho phép mỗi lần hostnameđược khởi động lại vào Linut hoặc OSX
Frédéric Grosshans

1
Chào mừng bạn đến với Siêu người dùng! Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Tôi đã bao gồm một phần ngắn, nhưng nó có thể không phải là những gì bạn dự định ...
Tamara Wijsman

1

Vì bạn muốn kiểm tra khóa máy chủ nghiêm ngặt, tôi sẽ cho họ sử dụng các known_hoststệp khác nhau . Để thực hiện việc này, hãy thiết lập ~/.ssh/configtệp của bạn (hoặc /etc/ssh/ssh_configtệp nếu bạn cần điều này để hoạt động trên nhiều tài khoản người dùng cục bộ) như thế này:

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

, thay thế $REALHOSTNAMEbằng tên máy chủ hoặc địa chỉ IP thực tế, tất nhiên. (Không quan trọng bạn chọn gì, chỉ cần bạn chọn thứ gì đó sau "Tên máy chủ" sẽ phân giải thành địa chỉ IP, nhưng tôi sẽ sử dụng tên máy chủ theo sở thích cho địa chỉ IP, theo nguyên tắc chung.)

Sau đó ssh myserver.linuxssh myserver.osxdo đó có thể có các khóa máy chủ khác nhau, nhưng bạn vẫn kiểm tra được. Nếu đó là Linux và bạn gõ OS X (hoặc ngược lại), bạn sẽ nhận được cảnh báo (mà tôi tin là ảnh hưởng mong muốn).

Nếu tôi gặp vấn đề này, tôi chắc chắn rằng có một cái gì đó hoàn toàn sai trong known_hoststệp chính không khớp với một trong hai, do đó nếu bạn nhập $REALHOSTNAMEthay vì myserver.osxbạn nhận được cảnh báo. :-) Tôi sẽ làm điều đó bằng cách đặt một cái gì đó như

<ip-address-of-github.com> $REALHOSTNAME

trong tôi /etc/hosts, sau đó thực hiện ssh $REALHOSTNAMEvà chấp nhận khóa mới, sau đó lấy mục đó ra.

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.