ssh: tự động chấp nhận khóa


218

Tôi đã viết tập lệnh tiện ích nhỏ này:

for h in $SERVER_LIST; do ssh $h "uptime"; done

Khi một máy chủ mới được thêm vào $SERVER_LIST, tập lệnh sẽ bị dừng với:

The authenticity of host 'blah.blah.blah (10.10.10.10)' can't be established.
RSA key fingerprint is a4:d9:a4:d9:a4:d9a4:d9:a4:d9a4:d9a4:d9a4:d9a4:d9a4:d9.
Are you sure you want to continue connecting (yes/no)?

Tôi đã thử yes:

for h in $SERVER_LIST; do yes | ssh $h "uptime"; done

không có may mắn

Có cách nào để parametrize sshtự động chấp nhận bất kỳ khóa mới nào không?


6
Câu trả lời của Lekensteyn là tuyệt vời và chính xác, nhưng tôi chỉ muốn lưu ý rằng vì ssh đang mong đợi "có" và yesxuất ra "y", bạn có thể đã gặp may mắn hơn for h in $SERVER_LIST; do yes yes | ssh $h "uptime"; done(lưu ý thêm có, cho biết có gì để nói thay vì "y ").
chazomaticus

Câu trả lời:


240

Sử dụng tùy chọn StricthostKeyChecking, ví dụ:

ssh -oStrictHostKeyChecking=no $h uptime

Tùy chọn này cũng có thể được thêm vào ~ / .ssh / config, vd:

Host somehost
    Hostname 10.0.0.1
    StrictHostKeyChecking no

Lưu ý rằng khi các phím máy chủ đã thay đổi, bạn sẽ nhận được cảnh báo, ngay cả với tùy chọn này:

$ ssh -oStrictHostKeyChecking=no somehost uptime
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    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
31:6f:2a:d5:76:c3:1e:74:f7:73:2f:96:16:12:e0:d8.
Please contact your system administrator.
Add correct host key in /home/peter/.ssh/known_hosts to get rid of this message.
Offending RSA key in /home/peter/.ssh/known_hosts:24
  remove with: ssh-keygen -f "/home/peter/.ssh/known_hosts" -R 10.0.0.1
Password authentication is disabled to avoid man-in-the-middle attacks.
Keyboard-interactive authentication is disabled to avoid man-in-the-middle attacks.
ash: uptime: not found

Nếu máy chủ của bạn không thường xuyên được cài đặt lại, bạn có thể làm cho điều này kém an toàn hơn (nhưng thuận tiện hơn cho các khóa máy chủ thường xuyên thay đổi) với -oUserKnownHostsFile=/dev/nulltùy chọn. Điều này loại bỏ tất cả các khóa máy chủ nhận được để nó sẽ không bao giờ tạo cảnh báo.


Với 18.04, có một khả năng mới : StrictHostKeyChecking=accept-new. Từ man 5 ssh_config:

If this flag is set to accept-new then ssh will automatically
add new host keys to the user known hosts files, but will not
permit connections to hosts with changed host keys.  If this flag
is set to no or off”, ssh will automatically add new host keys
to the user known hosts files and allow connections to hosts with
changed hostkeys to proceed, subject to some restrictions.

10
Đây không phải là giải pháp tốt nhất vì nó bỏ qua các công cụ bảo mật tích hợp. ssh-keyscanlà tốt hơn, nếu nó có sẵn trên hệ thống của bạn.
Stefan Lasiewski

2
@StefanLasiewski Nó cho phép người đàn ông trong các cuộc tấn công ở giữa nếu bạn ở trên các mạng không tin cậy. Để chấp nhận khóa mới cho máy chủ cố định, ssh-keyscancách tiếp cận sẽ lành mạnh hơn. Đối với các máy ảo cục bộ và các máy chủ khác trong các mạng đáng tin cậy có địa chỉ IP động / được sử dụng lại, phương pháp được mô tả là đủ tốt.
Lekensteyn

8
Chỉ cần làm rõ sự khác biệt giữa hai giải pháp: ssh-keyscanGiải pháp chỉ thiên về một cuộc tấn công trung gian trong một lần ssh-keyscanđang được thực hiện. Các -oStrictHostKeyChecking=nogiải pháp là dễ bị một cuộc tấn công man-in-the-middle mỗi khi sshđang được chạy.
Erik Sjölund

121

Bạn có thể sử dụng lệnh sau để thêm dấu vân tay cho máy chủ vào know_hosts của mình

ssh-keyscan -H <ip-address> >> ~/.ssh/known_hosts
ssh-keyscan -H <hostname> >> ~/.ssh/known_hosts

LƯU Ý: Thay thế <địa chỉ ip> và <tên máy chủ> bằng tên IP và dns của máy chủ bạn muốn thêm.

Vấn đề duy nhất với điều này là bạn sẽ kết thúc với một số máy chủ trong know_hosts của mình hai lần. Nó không thực sự là một vấn đề lớn, chỉ cần đề cập đến. Để đảm bảo không có trùng lặp, trước tiên bạn có thể xóa tất cả các máy chủ bằng cách chạy sau:

ssh-keygen -R <ip-address>
ssh-keygen -R <hostname>

Vì vậy, bạn có thể chạy:

for h in $SERVER_LIST; do
    ip=$(dig +search +short $h)
    ssh-keygen -R $h
    ssh-keygen -R $ip
    ssh-keyscan -H $ip >> ~/.ssh/known_hosts
    ssh-keyscan -H $h >> ~/.ssh/known_hosts
done

Một lưu ý khi xóa chỉ để thêm lại, về cơ bản bạn đang xóa tính bảo mật của việc xác minh dấu vân tay. Vì vậy, bạn chắc chắn sẽ không muốn chạy tập lệnh này trước mỗi lần thực thi tập lệnh tiện ích của bạn.


1
chạy nó qua sort | uniq và sau đó tìm kiếm máy chủ trùng lặp bằng awk sau đó sẽ khiến tập lệnh có khả năng phát hiện các máy chủ đã thay đổi và chỉ cảnh báo người dùng về những máy chủ đó, vì cùng một máy chủ có các khóa khác nhau có thể gây rắc rối
Lennart Rolland

2
Bạn có thể muốn thêm một ghi chú -Hbăm tên máy chủ và địa chỉ.
David Cullen

25

Tôi hơi muộn với phản hồi này, nhưng cách hợp lý sẽ là thực hiện ssh-keyscan trên máy mới trước khi bạn chạy thu thập thời gian hoạt động.

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

Vô hiệu hóa kiểm tra vệ sinh vì lợi ích thuận tiện nghe có vẻ là một kế hoạch tồi, ngay cả khi bạn nghĩ rằng bạn hoàn toàn kiểm soát môi trường.


chạy lệnh trên và không thực sự kiểm tra các khóa máy chủ bằng dấu vân tay mà bạn đã lấy ra khỏi băng tần có thể bị tổn thương theo cách chính xác nhưStrictHostKeyChecking no
code_monk

3
@code_monk: không, không phải vậy. Tôi mở ra một một lần cơ hội cho sự thất bại (chấp nhận một phím từ một máy chủ sai để được thêm vào host biết). StricthostKeyChecking no sẽ cho phép chấp nhận lặp lại cho các máy khác.
tink

0

Để tự động thêm danh sách máy chủ, chúng tôi có thể thực hiện bên dưới:

Thêm IP máy chủ trong danh sách máy chủ tệp

Các IP nên được thêm vào trong định dạng dưới đây.

Đầu ra của cat servers-list

123.1.2.3
124.1.2.4
123.1.2.5

Thay đổi IP trên bằng cách thay thế của bạn.

Lệnh dưới đây sẽ thêm tất cả các máy chủ từ danh sách.

ssh-keyscan -p61 -H "`cat servers-list`" >> ~/.ssh/known_hosts
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.