วิธีเพิ่มช่วง IP ให้กับ known_hosts


15

บริการหลายอย่าง (เช่น GitHub) ใช้ IP ที่หลากหลายและเห็นได้ชัดว่าเป็นกุญแจสาธารณะเดียวกัน

ฉันจะเพิ่มช่วง IP (ควรเป็นไฟล์เดียว) ลงในไฟล์ known_hosts ได้อย่างไร

สำหรับตัวอย่าง GitHub จะใช้ช่วงต่อไปนี้:

  • 207.97.227.224/27
  • 173.203.140.192/27
  • 204.232.175.64/27
  • 72.4.117.96/27
  • 192.30.252.0/22

และที่สำคัญคือ:

AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa + PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31 / YMF + + Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB weqqUUmpaaasXVal72J + + UX2B 2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi / w4yCE6gbODqnTWlg7 + wC604ydGXA8VJiS5ap43JXiUFFAaQ ==


1
IP เหล่านั้นเป็นสาธารณะอย่างสมบูรณ์ที่นี่
RSFalcon7

คำตอบ:


11

ดังที่ระบุไว้ในคำตอบอื่น ๆ known_hosts ไม่รองรับช่วงที่อยู่ IP อย่างไรก็ตามสนับสนุนสัญลักษณ์แทน แน่นอนว่าไวด์การ์ดนั้นไม่เหมือนกันดังนั้นคุณต้องระมัดระวังอย่างมากเกี่ยวกับวิธีใช้ในที่อยู่ IP แต่ในกรณีเฉพาะของ Github สิ่งนี้สามารถทำได้อย่างปลอดภัย

สถานการณ์ดูเหมือนว่าจะง่ายขึ้นตั้งแต่คำถามถูกถาม ตามเอกสารอย่างเป็นทางการของ Githubมีช่วงที่อยู่ IP ที่ใช้งานอยู่เพียงช่วงเดียวเท่านั้น (อย่างน้อยเท่ากับ IPv4 ไป) นี่คือช่วง 192.30.252.0/22 ทำให้ที่อยู่ IP ที่เป็นไปได้ 1,020 รายการสามารถขยายช่วงที่เป็นไปได้ทั้งหมดสำหรับ octet ล่าสุดในบล็อก C ที่แตกต่างกันเพียงสี่บล็อก

จากman 8 sshdนี้เป็นสิ่งที่เราต้องทำงานด้วยใน known_hosts:

ชื่อโฮสต์เป็นรายการรูปแบบที่คั่นด้วยเครื่องหมายจุลภาค ( *' and? 'ทำหน้าที่เป็นสัญลักษณ์แทน); แต่ละรูปแบบจะถูกจับคู่กับชื่อโฮสต์ที่ยอมรับได้ (เมื่อตรวจสอบสิทธิ์ไคลเอ็นต์) หรือเปรียบเทียบกับชื่อที่ผู้ใช้ระบุ (เมื่อตรวจสอบสิทธิ์เซิร์ฟเวอร์) รูปแบบอาจนำหน้าด้วย!' to indicate negation: if the host name matches a negated pattern, it is not accepted (by that line) even if it matched another pattern on the line. A hostname or address may optionally be enclosed within['และ]' brackets then followed by:' และหมายเลขพอร์ตที่ไม่เป็นมาตรฐาน

การใช้ข้อมูลนี้เราสามารถสร้างรายการโดยใช้ * wildcard สำหรับ octet ล่าสุดที่ตรงกับจุดสิ้นสุด Github ที่เป็นไปได้ทั้งหมด (และเฉพาะจุดสิ้นสุดเหล่านั้น) ดังนี้:

github.com,192.30.252.*,192.30.253.*,192.30.254.*,192.30.255.* ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==

หากช่วง IP ที่คุณต้องการสร้างไม่ได้เติมเต็มบล็อก C เต็มดังนั้นค่าที่เป็นไปได้ทั้งหมดสำหรับ octet จะเป็นไปไม่ได้ที่จะใช้อักขระตัวแทนสำหรับการจับคู่ที่แม่นยำ


8

ฉันไม่คิดว่าคุณสามารถเพิ่มช่วงได้อย่างง่ายดาย แต่ฉันคิดว่า (ไม่สามารถทดสอบได้ในตอนนี้) ว่าเอฟเฟกต์เดียวกันนี้สามารถทำได้โดยการเพิ่มรายการต่อไปนี้ใน. ssh / ssh_config:

Host *.github.com
HostKeyAlias github-server-pool.github.com

ถัดไปคุณจะต้องเพิ่มกุญแจลงในไฟล์ known_hosts ภายใต้ชื่อ github-server-pool.github.com

ข้อสันนิษฐาน: โฮสต์ github-server-pool.github.com ไม่มีอยู่หรือไม่เคยเชื่อมต่อผ่าน SSH

แนวคิดเบื้องหลังคือ ssh นั้นจะใช้คีย์ github-server-pool.github.com เป็นกุญแจในการค้นหากุญแจสาธารณะสาธารณะสำหรับโฮสต์ทั้งหมดของโดเมน github.com


นี่เป็นคำตอบที่ดีและง่ายกว่าต้นฉบับ
kael

4

ไม่มีการรองรับชุดที่อยู่ IP ในknown_hostsไฟล์ คุณจะต้องมีหนึ่งบรรทัดต่อที่อยู่

แม้ว่าส่วนชื่อโฮสต์ของรายการจะถูกแฮชโดยค่าเริ่มต้นนี่เป็นเพียงเพื่อความเป็นส่วนตัวเพื่อให้บางคนที่ได้รับความไว้วางใจจากคุณ.known_hostsจะไม่สามารถค้นหาได้อย่างง่ายดายว่าโฮสต์ใดที่คุณเชื่อมต่ออยู่ (พวกเขายังสามารถตรวจสอบการเดาได้) คุณสามารถใช้ชื่อโฮสต์ธรรมดาหรือที่อยู่ IP

for net in 207.97.227.224/27 173.203.140.192/27 204.232.175.64/27 72.4.117.96/27 192.30.252.0/24 192.30.252.1/24 192.30.252.2/24 192.30.252.3/24; do
  base=${net%/*}; d=${base##*.}; abc=${base%.*}
  bits=$((32 - ${net#*/}))
  e=0
  while [ $e -lt $((2 ** bits) ]; do
    echo "$abc.$((d + e)) ssh-rsa AAAAB3NzaC1yc…" >>~/.ssh/known_hosts
    e=$((e + 1))
  done
done

โปรดทราบว่านี่อาจเพิ่มรายการที่ซ้ำกัน


แก้ไขแล้ว แต่ทำงานได้กับเครือข่ายมากถึง 0.0.0.0/24
RSFalcon7

@ RSFalcon7 แน่นอน เลขคณิตที่อยู่ IP นั้นน่ารำคาญ ฉันทำวิธีแก้ปัญหาที่รวดเร็วและสกปรก ... หากคุณต้องการการสนับสนุนเครือข่ายขนาดใหญ่ให้แปลงที่อยู่ IP เป็นตัวเลข 32 บิตก่อนทำการแจงนับ
Gilles 'หยุดความชั่วร้าย'

0

SSH ดูเหมือนจะไม่มีแนวคิดของช่วง IP สำหรับ known_hosts ฉันคิดว่าสมมติฐานคือแต่ละโฮสต์จะมีคีย์เฉพาะสำหรับเหตุผลด้านความปลอดภัย

สองวิธีที่ฉันสามารถดูเพื่อเติมข้อมูลของคุณ known_hosts ล่วงหน้า:

  1. ssh-keyscan- เขียนสคริปต์สั้น ๆ เพื่อวนซ้ำที่อยู่เหล่านั้นทั้งหมดและป้อนเข้าssh-keyscanหรือไฟล์ssh-keyscanเพื่ออ่าน ssh-keyscanสามารถสแกนหลาย ๆ โฮสต์ต่อการร้องขอไม่ว่าจะผ่านการระบุในหนึ่งบรรทัดหรือการระบุรายการโฮสต์

  2. เติมknown_hostsตัวเองด้วยสคริปต์หรือบรรณาธิการ รูปแบบค่อนข้างง่ายหากคุณใช้เวอร์ชันที่ไม่แฮช มันคือ:

    ชื่อโฮสต์, ที่อยู่ IP คีย์ ssh-keytype

hostnameเป็นชื่อโฮสต์ที่คุณติดต่อและจะเหมือนกันสำหรับที่อยู่ GitHub ทั้งหมด IP addressจะเป็นสิ่งที่สคริปต์จะย้ำผ่าน keyเป็นกุญแจสำคัญที่คุณให้ไว้ข้างต้น

ไม่สวย แต่ฉันคิดว่าคนใน SSH สันนิษฐานว่าไม่มีใครทำในสิ่งที่ GitHub กำลังทำอยู่


ไม่มีใครควรทำในสิ่งที่ GitHub กำลังทำอยู่ เป็นรหัสโฮสต์ไม่ใช่รหัส "กลุ่มของโฮสต์ที่คล้ายกัน"

@ WumpusQ.Wumbley ฉันเห็นด้วย แต่ฉันสงสัย GitHub จะเปลี่ยนคำพูดของฉัน
kurtm

0

สวัสดีฉันพบสคริปต์จาก Gilles ค่อนข้างมีประโยชน์ แต่ทำงานได้เฉพาะเครือข่ายที่มากถึง0.0.0.0/24ขีด จำกัด ฉันได้ขยายสคริปต์ให้ทำงานกับเครือข่ายขนาดใหญ่จนถึง0.0.0.0/16อาจเป็นประโยชน์สำหรับคนอื่น

#!/bin/sh
# http://unix.stackexchange.com/questions/94448/how-to-add-an-ip-range-to-known-hosts
# answered Oct 11 '13 at 0:21  Gilles
# only working for networks up to 0.0.0.0/24
# Declan Forde - Increased the range up to 0.0.0.0/16 networks


NETWORKS="127.0.0.0/30 127.0.0.0/29 127.0.0.0/28 127.0.0.0/27 127.0.0.0/26 127.0.0.0/25 127.0.0.0/24 127.0.0.0/23 127.0.0.0/22 127.0.0.0/21 127.0.0.0/16"

for net in ${NETWORKS}
do
  base=${net%/*}
  bits=$((32 - ${net#*/}))

  abc=${base%.*}
  ab=${abc%.*}
  c=${abc##*.}
  d=${base##*.}

  if [ $bits -gt 8 ] && [ $bits -le 16 ]
  then
    netbits=$((bits - 8))
    bits=8
  else
    netbits=0
  fi

  netcount=0
  while [ $netcount -lt $((2 ** netbits)) ]
  do
    count=0
    while [ $count -lt $((2 ** bits)) ]
    do
      echo "$ab.$c.$((d + count))"
      echo "$ab.$c.$((d + count)) ssh-rsa AAAAB3NzaC1yc." >>~/.ssh/known_hosts
    count=$((count + 1))
    done
    netcount=$((netcount + 1))
    c=$((c + 1))
  done
done
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.