Tôi có thể tự động thêm một máy chủ mới vào know_hosts không?


249

Đây là tình huống của tôi: Tôi đang thiết lập một khai thác thử nghiệm, từ máy khách trung tâm, sẽ khởi chạy một số phiên bản máy ảo và sau đó thực hiện các lệnh trên chúng thông qua ssh. Các máy ảo sẽ có tên máy chủ và địa chỉ IP chưa được sử dụng trước đó, vì vậy chúng sẽ không có trong ~/.ssh/known_hoststệp trên máy khách trung tâm.

Vấn đề tôi gặp phải là sshlệnh đầu tiên chạy với một thể hiện ảo mới luôn xuất hiện một dấu nhắc tương tác:

The authenticity of host '[hostname] ([IP address])' can't be established.
RSA key fingerprint is [key fingerprint].
Are you sure you want to continue connecting (yes/no)?

Có cách nào để tôi có thể bỏ qua điều này và khiến máy chủ mới được biết đến với máy khách, có thể bằng cách sử dụng khóa chung đã được đưa vào hình ảnh máy ảo không? Tôi thực sự muốn tránh phải sử dụng Expect hoặc bất cứ điều gì để trả lời lời nhắc tương tác nếu tôi có thể.


5
Đối với một môi trường thử nghiệm khép kín và an toàn về mặt vật lý, việc chấp nhận khóa tự động có thể hoạt động tốt. Nhưng tự động chấp nhận các khóa công khai trong môi trường sản xuất hoặc trên một mạng không tin cậy (như Internet) hoàn toàn bỏ qua mọi biện pháp bảo vệ chống lại các cuộc tấn công trung gian mà SSH có thể chi trả. Cách hợp lệ duy nhất để đảm bảo bạn an toàn trước các cuộc tấn công của MITM là xác minh khóa chung của máy chủ thông qua một số kênh đáng tin cậy ngoài băng tần. Không có cách nào an toàn để tự động hóa nó mà không cần thiết lập cơ sở hạ tầng ký khóa phức tạp vừa phải.
Eil

Câu trả lời:


142

Đặt StrictHostKeyCheckingtùy chọn thành no, trong tệp cấu hình hoặc thông qua -o:

ssh -o StrictHostKeyChecking=no username@hostname.com


62
Điều này để bạn mở cho con người trong các cuộc tấn công giữa, có lẽ không phải là một ý tưởng tốt.
JasperWallace

9
@JasperWallace, trong khi đây thường là lời khuyên tốt, trường hợp sử dụng cụ thể (triển khai VM kiểm tra và gửi lệnh cho chúng) phải đủ an toàn.
Massimo

8
Điều này đưa ra một Warning: Permanently added 'hostname,1.2.3.4' (RSA) to the list of known hosts.Để tránh cảnh báo và để tránh mục nhập được thêm vào bất kỳ tệp nào được biết đến, tôi làm:ssh -o StrictHostKeyChecking=no -o LogLevel=ERROR -o UserKnownHostsFile=/dev/null username@hostname.com
Peter V. Mørch

11
Downvote vì điều này không trả lời câu hỏi và mở ra các lỗ hổng bảo mật nghiêm trọng.
marcv81

12
@Mnebuerquo: Nếu bạn lo lắng về bảo mật thì bạn sẽ không có gì để làm với câu hỏi này. Bạn sẽ có khóa máy chủ chính xác trước mặt, được tập hợp từ bảng điều khiển của hệ thống bạn muốn kết nối và bạn sẽ xác minh thủ công khi kết nối lần đầu tiên. Bạn chắc chắn sẽ không làm bất cứ điều gì "tự động".
Ignacio Vazquez-Abrams

230

IMO, cách tốt nhất để làm điều này là như sau:

ssh-keygen -R [hostname]
ssh-keygen -R [ip_address]
ssh-keygen -R [hostname],[ip_address]
ssh-keyscan -H [hostname],[ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [ip_address] >> ~/.ssh/known_hosts
ssh-keyscan -H [hostname] >> ~/.ssh/known_hosts

Điều đó sẽ đảm bảo không có mục trùng lặp, rằng bạn được bảo vệ cho cả tên máy chủ và địa chỉ IP, đồng thời sẽ băm kết quả đầu ra, một biện pháp bảo mật bổ sung.


4
Tại sao bạn cần cả 3 ssh-keyscan? Bạn không thể có được chỉ với cái đầu tiên vì nó hoạt động cho cả tên máy chủ và ip?
Robert

6
Bạn có thể chắc chắn rằng máy trả lời yêu cầu ssh-keyscan thực sự là máy bạn muốn nói chuyện không? Nếu không bạn đã mở cho mình một người đàn ông trong cuộc tấn công giữa.
JasperWallace

2
@JasperWallace Có, vì bạn cần ít nhất là dấu vân tay hoặc thậm chí tốt hơn khóa công khai, trong trường hợp đó bạn có thể thêm nó trực tiếp vào know_hosts, chuyển câu hỏi này. Nếu bạn chỉ có dấu vân tay, bạn sẽ phải viết thêm một bước xác minh khóa công khai đã tải xuống bằng dấu vân tay của bạn ...

1
Các cuộc gọi đến ssh-keyscanđều thất bại đối với tôi vì máy chủ mục tiêu của tôi không hỗ trợ loại khóa phiên bản 1 mặc định. Thêm -t rsa,dsavào lệnh đã sửa lỗi này.
phasetwenty

5
Đây có lẽ là một ý tưởng tồi. Bạn đang mở cho mình một cuộc tấn công trung gian bằng cách cập nhật các phím này. Để tránh các mục trùng lặp, kiểm tra trạng thái trả lại ssh-keygen -F [address]thay thế. Medium.com/@wblankenship/ từ
retrohacker

93

Dành cho những người lười biếng:

ssh-keyscan -H <host> >> ~/.ssh/known_hosts

-H băm tên máy chủ / địa chỉ IP


2
"Ssh-keyscan -H <host> >> ~ / .ssh / unknown_hosts" tạo ra một mục giống như những gì ssh làm với sự tương tác của người dùng. (-H băm tên của máy chủ từ xa.)
Sarah Messer

3
Dễ bị tấn công MITM. Bạn không kiểm tra dấu vân tay.
Mnebuerquo

8
@Mnebuerquo Bạn nói phải làm gì nhưng không làm thế nào, điều này sẽ hữu ích.
Ray

4
@jameshfisher Có dễ bị tấn công MITM, nhưng bạn đã bao giờ so sánh dấu vân tay RSA, được hiển thị cho bạn với máy chủ thực tế, khi bạn đang thực hiện thủ công chưa? Không? Vì vậy, câu trả lời này là cách để làm điều đó cho bạn. Nếu có, bạn không nên sử dụng câu trả lời này và thực hiện thủ công hoặc thực hiện các biện pháp bảo mật khác ...
nămf

2
@Mnebuerquo Tôi sẽ rất vui nếu bạn cũng cho chúng tôi biết cách tốt hơn để xử lý việc này, khi chúng tôi cần sao chép một repo bằng cách sử dụng các tập lệnh bó không tham dự và chúng tôi muốn bỏ qua lời nhắc này. Xin hãy làm sáng tỏ một giải pháp thực sự nếu bạn nghĩ rằng đây không phải là một giải pháp đúng đắn!
Waqas Shah

42

Như đã đề cập, sử dụng quét phím sẽ là cách đúng đắn và không phô trương để thực hiện.

ssh-keyscan -t rsa,dsa HOST 2>&1 | sort -u - ~/.ssh/known_hosts > ~/.ssh/tmp_hosts
mv ~/.ssh/tmp_hosts ~/.ssh/known_hosts

Ở trên sẽ thực hiện thủ thuật để thêm máy chủ, CHỈ nếu nó chưa được thêm. Nó cũng không đồng thời an toàn; bạn không được thực thi đoạn mã trên cùng một máy gốc nhiều lần cùng một lúc, vì tệp tmp_hosts có thể bị ghi đè, cuối cùng dẫn đến tệp được biết_hosts trở nên cồng kềnh ...


Có cách nào để kiểm tra xem phím là trong known_hosts trước ssh-keyscan ? Lý do là nó đòi hỏi một chút thời gian và kết nối mạng bổ sung.
utaccngo

1
Phiên bản gốc của tập tin này đã có cat ~/.ssh/tmp_hosts > ~/.ssh/known_hosts, nhưng lần chỉnh sửa tiếp theo đã thay đổi nó thành >>. Sử dụng >>là một lỗi. Nó đánh bại mục đích của tính duy nhất trong dòng đầu tiên và khiến nó bỏ các mục mới vào known_hostsmỗi lần nó chạy. (Chỉ cần đăng một chỉnh sửa để thay đổi lại.)
paulmelnikow

1
Điều này chịu các cuộc tấn công MITM tương tự như các cuộc tấn công khác.
Mnebuerquo

@utaccngo ssh-keygen -F sẽ cung cấp cho bạn dấu vân tay hiện tại. Nếu nó trở lại trống với mã trả về là 1, thì bạn không có nó. Nếu nó in một cái gì đó và trả về mã là 0, thì nó đã có mặt.
Giàu L

1
Nếu bạn quan tâm nhiều đến MITM, hãy triển khai các bản ghi DNSSEC và SSHFP hoặc sử dụng một số phương tiện phân phối khóa an toàn khác và giải pháp loại bỏ bùn này sẽ không liên quan.
Zart

19

Bạn có thể sử dụng ssh-keyscanlệnh để lấy khóa công khai và nối nó vào known_hoststệp của bạn .


3
Hãy chắc chắn rằng bạn kiểm tra dấu vân tay để đảm bảo đó là chìa khóa chính xác. Nếu không, bạn tự mở các cuộc tấn công MITM.
Mnebuerquo

3
@Mnebuerquo Điểm công bằng trong bối cảnh chung, nhưng tại sao ai đó sẽ cố gắng thu thập các khóa theo chương trình nếu họ đã biết khóa chính xác là gì?
Brian Cline

Đây không phải là cách để làm điều đó. MITM.
jameshfisher

8

Đây là cách bạn có thể kết hợp ssh-keyscan vào trò chơi của mình:

---
# ansible playbook that adds ssh fingerprints to known_hosts
- hosts: all
  connection: local
  gather_facts: no
  tasks:
  - command: /usr/bin/ssh-keyscan -T 10 {{ ansible_host }}
    register: keyscan
  - lineinfile: name=~/.ssh/known_hosts create=yes line={{ item }}
    with_items: '{{ keyscan.stdout_lines }}'

1
Bạn đang tải lên một tập tin know_hosts hợp lệ đã biết, hoặc bạn đang thực hiện ssh-keyscan và kết xuất đầu ra vào know_host mà không cần xác minh dấu vân tay?
Mnebuerquo

1
Đây chỉ đơn giản là kết xuất đầu ra của một keyscan, vâng. Vì vậy, về mặt hiệu quả, nó giống như StricthostKeyChecking = không, chỉ với việc biết_hosts im lặng cập nhật mà không thay đổi với các tùy chọn ssh. Giải pháp này cũng không hoạt động tốt do ssh-keyscan trả lại nhiều dòng khiến cho tác vụ này luôn được gắn cờ là 'đã thay đổi'
Zart

Đây không phải là cách để làm điều đó. MITM.
jameshfisher

3
@jameshfisher Tôi sẽ rất vui nếu bạn cũng cho chúng tôi biết cách tốt hơn để xử lý việc này, khi chúng tôi cần sao chép một repo bằng cách sử dụng các tập lệnh bó không tham dự và chúng tôi muốn bỏ qua lời nhắc này. Xin hãy làm sáng tỏ một giải pháp thực sự nếu bạn nghĩ rằng đây không phải là một giải pháp đúng đắn! Xin vui lòng cho chúng tôi biết "cách" để làm điều đó, nếu bạn nghĩ rằng đây không phải là cách đúng đắn để làm điều đó!
Waqas Shah

Đây là một phương pháp hoàn toàn hợp lệ để thêm các giá trị vào know_host, nhưng vâng, nó dễ bị MITM. Tuy nhiên, để sử dụng nội bộ thì tốt.
Cameron Lowell Palmer

7

đây sẽ là một giải pháp hoàn chỉnh, chỉ chấp nhận khóa máy chủ

#!/usr/bin/env ansible-playbook
---
- name: accept ssh fingerprint automatically for the first time
  hosts: all
  connection: local
  gather_facts: False

  tasks:
    - name: "check if known_hosts contains server's fingerprint"
      command: ssh-keygen -F {{ inventory_hostname }}
      register: keygen
      failed_when: keygen.stderr != ''
      changed_when: False

    - name: fetch remote ssh key
      command: ssh-keyscan -T5 {{ inventory_hostname }}
      register: keyscan
      failed_when: keyscan.rc != 0 or keyscan.stdout == ''
      changed_when: False
      when: keygen.rc == 1

    - name: add ssh-key to local known_hosts
      lineinfile:
        name: ~/.ssh/known_hosts
        create: yes
        line: "{{ item }}"
      when: keygen.rc == 1
      with_items: '{{ keyscan.stdout_lines|default([]) }}'

1
Đây không phải là cách để làm điều đó. MITM.
jameshfisher

6

Tôi đã có một vấn đề tương tự và thấy rằng một số câu trả lời được cung cấp chỉ đưa tôi một phần đến một giải pháp tự động. Sau đây là những gì tôi đã sử dụng, hy vọng nó sẽ giúp:

ssh -o "StrictHostKeyChecking no" -o PasswordAuthentication=no 10.x.x.x

Nó thêm khóa vào known_hostsvà không nhắc mật khẩu.


2
Dễ bị tấn công MITM. Bạn không kiểm tra dấu vân tay.
Mnebuerquo

6
Không ai kiểm tra dấu vân tay.
Brendan Byrd

Đây không phải là cách để làm điều đó. MITM.
jameshfisher

5

Vì vậy, tôi đã tìm kiếm một cách trần tục để bỏ qua sự tương tác thủ công của máy chủ không rõ ràng trong việc nhân bản một repo git như dưới đây:

brad@computer:~$ git clone git@bitbucket.org:viperks/viperks-api.git
Cloning into 'viperks-api'...
The authenticity of host 'bitbucket.org (104.192.143.3)' can't be established.
RSA key fingerprint is 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40.
Are you sure you want to continue connecting (yes/no)?

Lưu ý dấu vân tay khóa RSA ...

Vì vậy, đây là một điều SSH, điều này sẽ hoạt động cho git trên SSH và chỉ những thứ liên quan đến SSH nói chung ...

brad@computer:~$ nmap bitbucket.org --script ssh-hostkey

Starting Nmap 7.01 ( https://nmap.org ) at 2016-10-05 10:21 EDT
Nmap scan report for bitbucket.org (104.192.143.3)
Host is up (0.032s latency).
Other addresses for bitbucket.org (not scanned): 104.192.143.2 104.192.143.1 2401:1d80:1010::150
Not shown: 997 filtered ports
PORT    STATE SERVICE
22/tcp  open  ssh
| ssh-hostkey:
|   1024 35:ee:d7:b8:ef:d7:79:e2:c6:43:9e:ab:40:6f:50:74 (DSA)
|_  2048 97:8c:1b:f2:6f:14:6b:5c:3b:ec:aa:46:46:74:7c:40 (RSA)
80/tcp  open  http
443/tcp open  https

Nmap done: 1 IP address (1 host up) scanned in 42.42 seconds

Đầu tiên, cài đặt nmap trên trình điều khiển hàng ngày của bạn. nmap rất hữu ích cho một số thứ nhất định, như phát hiện các cổng mở và điều này-- xác minh bằng tay dấu vân tay SSH. Nhưng, trở lại với những gì chúng ta đang làm.

Tốt Tôi đã bị xâm phạm ở nhiều nơi và máy móc mà tôi đã kiểm tra nó-- hoặc lời giải thích hợp lý hơn về mọi thứ đang trở nên tồi tệ là điều đang xảy ra.

Đó là "dấu vân tay" chỉ là một chuỗi được rút ngắn với thuật toán một chiều để thuận tiện cho con người chúng ta có nguy cơ có nhiều hơn một chuỗi phân giải thành cùng một dấu vân tay. Nó xảy ra, chúng được gọi là va chạm.

Bất kể, trở lại chuỗi ban đầu mà chúng ta có thể thấy trong ngữ cảnh bên dưới.

brad@computer:~$ ssh-keyscan bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
no hostkey alg
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-129
bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-123
no hostkey alg

Vì vậy, trước thời hạn, chúng tôi có cách yêu cầu một hình thức nhận dạng từ máy chủ ban đầu.

Tại thời điểm này, chúng tôi dễ bị tổn thương như tự động - các chuỗi khớp nhau, chúng tôi có dữ liệu cơ sở tạo dấu vân tay và chúng tôi có thể yêu cầu dữ liệu cơ sở đó (ngăn ngừa va chạm) trong tương lai.

Bây giờ để sử dụng chuỗi đó theo cách ngăn chặn việc hỏi về tính xác thực của máy chủ ...

Tệp know_hosts trong trường hợp này không sử dụng các mục nhập bản rõ. Bạn sẽ biết các mục được băm khi bạn nhìn thấy chúng, chúng trông giống như băm với các ký tự ngẫu nhiên thay vì xyz.com hoặc 123,45,67,89.

brad@computer:~$ ssh-keyscan -t rsa -H bitbucket.org
# bitbucket.org SSH-2.0-conker_1.0.257-ce87fba app-128
|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==

Dòng bình luận đầu tiên vô cùng xuất hiện-- nhưng bạn có thể thoát khỏi nó bằng một chuyển hướng đơn giản thông qua quy ước ">" hoặc ">>".

Vì tôi đã cố gắng hết sức để có được dữ liệu chưa được sử dụng để xác định "máy chủ" và tin cậy, tôi sẽ thêm nhận dạng này vào tệp know_hosts trong thư mục ~ / .ssh của tôi. Vì bây giờ nó sẽ được xác định là máy chủ lưu trữ đã biết, tôi sẽ không nhận được lời nhắc được đề cập ở trên khi bạn còn trẻ.

Cảm ơn đã gắn bó với tôi, bạn đi đây. Tôi đang thêm khóa RSA bitbucket để tôi có thể tương tác với kho git của mình ở đó theo cách không tương tác như một phần của quy trình làm việc CI, nhưng bất cứ điều gì bạn làm những gì bạn muốn.

#!/bin/bash
cp ~/.ssh/known_hosts ~/.ssh/known_hosts.old && echo "|1|yr6p7i8doyLhDtrrnWDk7m9QVXk=|LuKNg9gypeDhfRo/AvLTAlxnyQw= ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==" >> ~/.ssh/known_hosts

Vì vậy, đó là cách bạn giữ trinh tiết cho ngày hôm nay. Bạn có thể làm tương tự với github bằng cách làm theo các hướng tương tự vào thời gian của riêng bạn.

Tôi đã thấy rất nhiều bài viết tràn ngăn xếp bảo bạn lập trình thêm khóa một cách mù quáng mà không có bất kỳ loại kiểm tra nào. Bạn càng kiểm tra khóa từ các máy khác nhau trên các mạng khác nhau, bạn càng có thể tin tưởng rằng máy chủ chính là máy chủ mà nó nói - và đó là điều tốt nhất bạn có thể hy vọng từ lớp bảo mật này.

SAI LẦM ssh -oStricthostKeyChecking = không có tên máy chủ [lệnh]

SAI LẦM ssh-keyscan -t rsa -H tên máy chủ >> ~ / .ssh / know_hosts

Đừng làm một trong những điều trên, làm ơn. Bạn đã có cơ hội để tăng cơ hội tránh ai đó nghe lén việc chuyển dữ liệu của bạn thông qua một người đàn ông trong cuộc tấn công giữa - hãy nắm lấy cơ hội đó. Sự khác biệt theo nghĩa đen là xác minh rằng khóa RSA mà bạn có là một trong những máy chủ trung thực và bây giờ bạn biết cách lấy thông tin đó để so sánh chúng để bạn có thể tin tưởng vào kết nối. Chỉ cần nhớ nhiều so sánh từ các máy tính & mạng khác nhau thường sẽ tăng khả năng tin tưởng vào kết nối của bạn.


Tôi nghĩ rằng đây là giải pháp tốt nhất cho vấn đề này. Tuy nhiên, hãy cẩn thận khi sử dụng Nmap trên một cái gì đó như Amazon EC2, tôi đã nhận được một cảnh báo về việc quét cổng mà Nmap làm! Điền vào mẫu của họ trước khi làm portscanning!
Waqas Shah

...à vâng. Tôi không biết tại sao bạn lại thực hiện quét cổng từ EC2. Nếu bạn đã đăng nhập vào tài khoản của mình, bạn chỉ có thể lấy các khóa từ các máy thực tế. Đây là nhiều hơn cho các máy bạn không có quyền kiểm soát. Tôi cho rằng bạn sẽ có một máy cục bộ không bị hạn chế quét cổng AWS để sử dụng. Nhưng, nếu bạn ở trong trường hợp cạnh đó mà bạn phải chạy nmap với AWS, tôi cho rằng cảnh báo này sẽ hữu ích.
BradChesney79

Sử dụng nmap để đọc khóa máy chủ SSH từ máy trạm của bạn và sau đó tin tưởng giá trị đó không khác gì kết nối qua SSH với StructhostKeyChecking bị tắt. Nó cũng dễ bị tổn thương trước một cuộc tấn công giữa chừng.
Micah R Ledbetter

... @ MicahRLedbetter, đó là lý do tại sao tôi đề xuất rằng "nhiều so sánh từ các máy tính và mạng khác nhau thường sẽ tăng khả năng tin tưởng vào kết nối của bạn". Nhưng, đó là quan điểm của tôi. Nếu bạn chỉ kiểm tra máy chủ mục tiêu của mình từ một tập hợp các điều kiện môi trường thì làm sao bạn biết bất kỳ sự khác biệt nào? Bạn có gợi ý nào tốt hơn không?
BradChesney79

1
Đây là nhà hát an ninh. Làm một cái gì đó phức tạp để tạo ra sự xuất hiện của bảo mật lớn hơn. Không quan trọng bạn sử dụng bao nhiêu phương pháp khác nhau để hỏi chủ nhà về khóa của nó. Giống như hỏi cùng một người nhiều lần nếu bạn có thể tin tưởng họ (có thể bạn gọi điện, gửi email, nhắn tin và gửi thư). Họ sẽ luôn nói có, nhưng nếu bạn hỏi nhầm người, điều đó không thành vấn đề.
differlysuperiorman

5

Tôi thực hiện một tập lệnh một lớp, hơi dài nhưng hữu ích để thực hiện tác vụ này cho các máy chủ có nhiều IP, sử dụng digbash

(host=github.com; ssh-keyscan -H $host; for ip in $(dig @8.8.8.8 github.com +short); do ssh-keyscan -H $host,$ip; ssh-keyscan -H $ip; done) 2> /dev/null >> .ssh/known_hosts

5

Sau đây tránh các mục trùng lặp trong ~ / .ssh / know_hosts:

if ! grep "$(ssh-keyscan github.com 2>/dev/null)" ~/.ssh/known_hosts > /dev/null; then
    ssh-keyscan github.com >> ~/.ssh/known_hosts
fi

1
Đây không phải là cách để làm điều đó. MITM.
jameshfisher

Tôi thích câu trả lời này nhất. Đối với kịch bản thiết lập ban đầu của một VPS ngẫu nhiên không quan trọng đối với bất kỳ ai trừ tôi, rủi ro MITM rất nhỏ. Phân minh vô hạn ... dòng đầu tiên cần phải cómkdir -p ~/.ssh/known_hosts;
Martin Bramwell

5

Làm thế nào bạn xây dựng các máy này? bạn có thể chạy một kịch bản cập nhật dns? bạn có thể tham gia một tên miền IPA không?

FreeIPA thực hiện điều này một cách tự động, nhưng về cơ bản, tất cả những gì bạn cần là bản ghi dns SSHFPDNSSEC trên vùng của bạn (freeipa cung cấp dưới dạng tùy chọn có thể định cấu hình (dnssec bị tắt theo mặc định)).

Bạn có thể lấy các bản ghi SSHFP hiện có từ máy chủ của mình bằng cách chạy.

ssh-keygen -r jersey.jacobdevans.com

jersey.jacobdevans.com TRÊN SSHFP 1 1 4d8589de6b1a48e148d8fc9fbb967f1b29f53ebc jersey.jacobdevans.com TRÊN SSHFP 1 2 6503272a11ba6d7fec2518c02dfed88f3d455ac7786ee5dbd72df63307209d55 jersey.jacobdevans.com TRÊN SSHFP 3 1 5a7a1e8ab8f25b86b63c377b303659289b895736> jersey.jacobdevans.com TRÊN SSHFP 3 2 1f50f790117dfedd329dbcf622a7d47551e12ff5913902c66a7da28e47de4f4b

sau khi được xuất bản, bạn sẽ thêm VerifyHostKeyDNS yesvào ssh_config hoặc ~ / .ssh / config

Nếu / Khi google quyết định bật DNSSEC, bạn có thể ssh in mà không cần dấu nhắc lưu trữ.

ssh jersey.jacobdevans.com

NHƯNG tên miền của tôi chưa được ký, vì vậy bây giờ bạn sẽ thấy ....

debug1: Khóa máy chủ: ecdsa-sha2-nistp256 SHA256: H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s

debug1: tìm thấy 4 dấu vân tay không an toàn trong DNS

debug1: khớp dấu vân tay của máy chủ

tìm thấy trong DNS Tính xác thực của máy chủ 'jersey.jacobdevans.com (2605: 6400: 10: 434 :: 10)' không thể được thiết lập. Dấu vân tay của khóa ECDSA là SHA256: H1D3kBF9 / t0ynbz2IqfUdVHhL / WROQLGan2ijkfeT0s. Dấu vân tay khóa máy chủ được tìm thấy trong DNS. Bạn có chắc chắn muốn tiếp tục kết nối (có / không) không? Không


4

Để thực hiện điều này một cách chính xác, những gì bạn thực sự muốn làm là thu thập các khóa công khai của máy chủ khi bạn tạo chúng và thả chúng vào một tệp ở known_hostsđịnh dạng. Sau đó, bạn có thể sử dụng -o GlobalKnownHostsFile=..., trỏ đến tệp đó, để đảm bảo rằng bạn đang kết nối với máy chủ mà bạn tin rằng bạn nên kết nối. Tuy nhiên, cách bạn thực hiện việc này tùy thuộc vào cách bạn thiết lập máy ảo, tuy nhiên, việc đọc nó ra khỏi hệ thống tệp ảo, nếu có thể hoặc thậm chí để máy chủ in nội dung /etc/ssh/ssh_host_rsa_key.pubtrong khi định cấu hình có thể thực hiện thủ thuật.

Điều đó nói rằng, điều này có thể không đáng giá, tùy thuộc vào loại môi trường bạn đang làm việc và đối thủ dự đoán của bạn là ai. Thực hiện một "lưu trữ trên kết nối đầu tiên" đơn giản (thông qua quét hoặc đơn giản là trong kết nối "thực" đầu tiên) như được mô tả trong một số câu trả lời khác ở trên có thể dễ dàng hơn đáng kể và vẫn cung cấp một số mô-đun bảo mật. Tuy nhiên, nếu bạn làm điều này, tôi thực sự khuyên bạn nên thay đổi tệp máy chủ đã biết ( -o UserKnownHostsFile=...) thành tệp cụ thể cho cài đặt thử nghiệm cụ thể này; điều này sẽ tránh làm ô nhiễm tệp máy chủ cá nhân đã biết của bạn với thông tin kiểm tra và giúp dễ dàng dọn sạch các khóa công khai vô dụng khi bạn xóa VM.


4

Toàn bộ điều này

  • ssh-key-scan
  • ssh-copy-id
  • Cảnh báo khóa ECSDA

việc kinh doanh cứ làm tôi khó chịu nên tôi đã chọn

Một kịch bản để cai trị tất cả

Đây là một biến thể của tập lệnh tại https://askubfox.com/a/949731/129227 với câu trả lời của Amadu Bah https://serverfault.com/a/858957/162693 trong một vòng lặp.

ví dụ cuộc gọi

./sshcheck somedomain site1 site2 site3

Tập lệnh sẽ lặp qua các trang web tên và sửa đổi tệp .ssh / config và .ssh / unknown_hosts và thực hiện ssh-copy-id theo yêu cầu - đối với tính năng cuối cùng, hãy để các cuộc gọi kiểm tra ssh thất bại, ví dụ như nhấn enter 3 lần yêu cầu mật khẩu.

kịch bản sshcheck

#!/bin/bash
# WF 2017-08-25
# check ssh access to bitplan servers

#ansi colors
#http://www.csc.uvic.ca/~sae/seng265/fall04/tips/s265s047-tips/bash-using-colors.html
blue='\033[0;34m'  
red='\033[0;31m'  
green='\033[0;32m' # '\e[1;32m' is too bright for white bg.
endColor='\033[0m'

#
# a colored message 
#   params:
#     1: l_color - the color of the message
#     2: l_msg - the message to display
#
color_msg() {
  local l_color="$1"
  local l_msg="$2"
  echo -e "${l_color}$l_msg${endColor}"
}

#
# error
#
#   show an error message and exit
#
#   params:
#     1: l_msg - the message to display
error() {
  local l_msg="$1"
  # use ansi red for error
  color_msg $red "Error: $l_msg" 1>&2
  exit 1
}

#
# show the usage
#
usage() {
  echo "usage: $0 domain sites"
  exit 1 
}

#
# check known_hosts entry for server
#
checkknown() {
  local l_server="$1"
  #echo $l_server
  local l_sid="$(ssh-keyscan $l_server 2>/dev/null)" 
  #echo $l_sid
  if (! grep "$l_sid" $sknown) > /dev/null 
  then
    color_msg $blue "adding $l_server to $sknown"
    ssh-keyscan $l_server >> $sknown 2>&1
  fi
}

#
# check the given server
#
checkserver() {
  local l_server="$1"
  grep $l_server $sconfig > /dev/null
  if [ $? -eq 1 ]
  then
    color_msg $blue "adding $l_server to $sconfig"
    today=$(date "+%Y-%m-%d")
    echo "# added $today by $0"  >> $sconfig
    echo "Host $l_server" >> $sconfig
    echo "   StrictHostKeyChecking no" >> $sconfig
    echo "   userKnownHostsFile=/dev/null" >> $sconfig
    echo "" >> $sconfig
    checkknown $l_server
  else
    color_msg $green "$l_server found in $sconfig"
  fi
  ssh -q $l_server id > /dev/null
  if [ $? -eq 0 ]
  then
    color_msg $green "$l_server accessible via ssh"
  else
    color_msg $red "ssh to $l_server failed" 
    color_msg $blue "shall I ssh-copy-id credentials to $l_server?"
    read answer
    case $answer in
      y|yes) ssh-copy-id $l_server
    esac
  fi
}

#
# check all servers
#
checkservers() {
me=$(hostname -f)
for server in $(echo $* | sort)
do
  os=`uname`
  case $os in
   # Mac OS X
   Darwin*)
     pingoption=" -t1";;
    *) ;;
  esac

  pingresult=$(ping $pingoption -i0.2 -c1 $server)
  echo $pingresult | grep 100 > /dev/null
  if [ $? -eq 1 ]
  then 
    checkserver $server
    checkserver $server.$domain
  else
    color_msg $red "ping to $server failed"
  fi
done
}

#
# check configuration
#
checkconfig() {
#https://askubuntu.com/questions/87449/how-to-disable-strict-host-key-checking-in-ssh
  if [ -f $sconfig ]
  then
    color_msg $green "$sconfig exists"
    ls -l $sconfig
  fi
}

sconfig=~/.ssh/config
sknown=~/.ssh/known_hosts

case  $# in
  0) usage ;;
  1) usage ;;
  *) 
    domain=$1 
    shift 
    color_msg $blue "checking ssh configuration for domain $domain sites $*"
    checkconfig
    checkservers $* 
    #for server in $(echo $* | sort)
    ##do
    #  checkknown $server 
    #done
    ;;
esac

2

Dưới đây là cách thực hiện một bộ sưu tập máy chủ

xác định một bộ sưu tập các máy chủ

ssh_hosts:
  - server1.domain.com
  - server2.domain.com
  - server3.domain.com
  - server4.domain.com
  - server5.domain.com
  - server6.domain.com
  - server7.domain.com
  - server8.domain.com
  - server9.domain.com

Sau đó, xác định hai tác vụ để thêm các khóa vào máy chủ đã biết:

- command: "ssh-keyscan {{item}}"
   register: known_host_keys
   with_items: "{{ssh_hosts}}"
   tags:
     - "ssh"

 - name: Add ssh keys to know hosts
   known_hosts:
     name: "{{item.item}}"
     key: "{{item.stdout}}"
     path: ~/.ssh/known_hosts
   with_items: "{{known_host_keys.results}}"

0

Tốt nhất là bạn kiểm tra dấu vân tay của mỗi máy chủ / máy chủ mới. Đây là cách duy nhất để xác thực máy chủ. Nếu không có nó, kết nối SSH của bạn có thể bị tấn công trung gian .

Nếu bạn thực sự chắc chắn muốn bỏ qua việc kiểm tra dấu vân tay, thì tùy chọn tốt nhất, kém an toàn thứ hai là sử dụng StrictHostKeyChecking=accept-new, được giới thiệu trong phiên bản OpenSSH 7.6 (2017-10-03) :

"Chấp nhận mới" đầu tiên sẽ tự động chấp nhận các khóa chưa được biết đến nhưng sẽ từ chối các kết nối cho các máy chủ thay đổi hoặc không hợp lệ.

Đừng sử dụng giá trị cũ StrictHostKeyChecking=nokhông bao giờ kiểm tra tính xác thực của các máy chủ ở tất cả. (Mặc dù ý nghĩa của =nocài đặt này sẽ được lật một số bản phát hành sau .)

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.