it-swarm-vi.tech

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

Đâ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 thi 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 ở trong ~/.ssh/known_hosts tập tin trên máy khách trung tâm.

Vấn đề tôi gặp phải là lệnh ssh đầu tiên chạy với một thể hiện ảo mới luôn xuất hiện với 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à làm cho 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 Prompt tương tác nếu tôi có thể.

265
gareth_bowles

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

ssh -o StrictHostKeyChecking=no [email protected]

152

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, và cũng sẽ băm đầu ra, một biện pháp bảo mật bổ sung.

235
yardena

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

97
fivef

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 Origin 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 ...

44
ysawej

Bạn có thể sử dụng lệnh ssh-keyscan Để lấy khóa chung và nối nó vào tệp known_hosts.

19
Alex

Đây là cách bạn có thể kết hợp ssh-keyscan vào vở kịch của bạn:

---
# 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.results | map(attribute='stdout_lines') | list }}'
8
Zart

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
7
Felipe Alcacibar

đâ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([]) }}'
7
mazac

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_hosts và không nhắc nhở mật khẩu.

6
VenomFangs

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
5
Amadu Bah

Để thực hiện điều này một cách chính xác, điều 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 trong known_hosts định dạng. Sau đó, bạn có thể sử dụng -o GlobalKnownHostsFile=..., chỉ vào 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, nhưng đọ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 của /etc/ssh/ssh_Host_rsa_key.pub trong quá trì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ủ lưu trữ người dùng đã biết (-o UserKnownHostsFile=...) đến một 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 máy ảo.

5
cjs

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 việc 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à SSHFP dns records và DNSSEC 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 yes đến ssh_config hoặc ~/.ssh/config của bạn

Nếu/Khi google quyết định bật DNSSEC, bạn có thể ssh in mà không cần nhắc nhở máy chủ 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ủ

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

5
Jacob Evans

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

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

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

Một tập lệnh để thống 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/16269 trong một vòng lặp.

cuộc gọi ví dụ

./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 chỉ cho phép các cuộc gọi kiểm tra ssh thất bại, ví dụ: bằng cách nhấn enter 3 lần vào yêu cầu mật khẩu.

tập lệnh 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
4
Wolfgang Fahl

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ủ lưu trữ không rõ ràng trong việc nhân bản một repo git như dưới đây:

[email protected]:~$ git clone [email protected]: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 ...

[email protected]:~$ 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.

[email protected]:~$ 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 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.

[email protected]:~$ 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.

4
BradChesney79

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 .

Không sử dụng giá trị cũ StrictHostKeyChecking=no which never kiểm tra tính xác thực của máy chủ. Mặc dù ý nghĩa của StrictHostKeyChecking=no sẽ được lật sau.

Tùy chọn thứ hai, nhưng kém an toàn hơn, là sử dụng StrictHostKeyChecking=accept-new, đó là được giới thiệu trong phiên bản 7.6 (2017-10-03) của OpenSSH :

"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ệ.

2
Dominik

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}}"
2
Vackar Afzal

Nếu bạn muốn kiểm tra khóa trước khi thêm nó một cách mù quáng, bạn có thể sử dụng mã này:

# verify github and gitlab key
# GitHub
github=SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8
ssh-keyscan github.com >> githubKey
read bit githubkey Host <<< $(ssh-keygen -lf githubKey)
if [ "$githubkey" != "$github" ]
then
  echo "The GitHub fingerprint is incorrect"
  exit 1
fi
echo "github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==" | Sudo tee -a /etc/ssh/ssh_known_hosts

# GitLab
gitlab=SHA256:ROQFvPThGrW4RuWLoL9tq9I9zJ42fK4XywyRtbOz/EQ
ssh-keyscan gitlab.com >> gitlabKey
read bit gitlabkey Host <<< $(ssh-keygen -lf gitlabKey)
if [ "$githubkey" != "$github" ]
then
  echo "The GitLab fingerprint is incorrect"
  exit 1
fi
echo "gitlab.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCsj2bNKTBSpIYDEGk9KxsGh3mySTRgMtXL583qmBpzeQ+jqCMRgBqB98u3z++J1sKlXHWfM9dyhSevkMwSbhoR8XIq/U0tCNyokEi/ueaBMCvbcTHhO7FcwzY92WK4Yt0aGROY5qX2UKSeOvuP4D6TPqKF1onrSzH9bx9XUf2lEdWT/ia1NEKjunUqu1xOB/StKDHMoX4/OKyIzuS0q/T1zOATthvasJFoPrAjkohTyaDUz2LN5JoH839hViyEG82yB+MjcFV5MU3N1l1QL3cVUCh93xSaua1N85qivl+siMkPGbO5xR/En4iEY6K2XPASUEMaieWVNTRCtJ4S8H+9" | Sudo tee -a /etc/ssh/ssh_known_hosts

Các khóa GitHub và GitLab có thể thay đổi nếu chúng bị xâm phạm. Trong trường hợp này, hãy kiểm tra những cái gần đây nhất tại đây

Ghi chú : Bạn có thể cần đảm bảo rằng khóa không được thêm hai lần. Đối với điều này, tham khảo các câu trả lời khác.

1
Sharcoux

Tôi đã gặp phải một vấn đề tương tự khi sử dụng giải pháp đã được xác minh ở trên, ssh của tôi không hoạt động và đó là do tệp know_hosts bị thiếu trong thư mục ~/.ssh/và Hệ thống tệp chỉ được đọc. SO trong thời gian chạy tôi cũng không thể tạo tệp ~/.ssh/unknown_hosts.

Nếu bạn gặp phải vấn đề tương tự thì hãy xem liệu bạn có thể ghi tệp được biết_hosts vào vị trí/tmp không. Điều này chủ yếu là ghi được kích hoạt ngay cả trong một hệ thống tệp chỉ đọc.

Sau đó trong lệnh ssh, bạn có thể chỉ định ssh để đọc tệp know_hosts từ vị trí/tmp.

ssh -o UserKnownhostsFile =/tmp/know_hosts -o StricthostKeyChecking = no user_name @ Destination_server_ip

0
Rohit Agrawal