GitHub와 같은 많은 서비스는 광범위한 IP를 사용하며 분명히 동일한 공개 키를 사용합니다.
known_hosts 파일에 IP 범위 (바람직하게는 단일)를 어떻게 추가 할 수 있습니까?
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 ==
답변
다른 답변에서 언급했듯이 known_hosts는 IP 주소 범위를 지원하지 않습니다. 그러나 와일드 카드는 지원합니다. 물론 와일드 카드는 똑같지 않으므로 IP 주소에서 사용하는 방법에 대해 신중해야하지만 Github의 경우에는 안전하게 수행 할 수 있습니다.
질문이 제기 된 이후 상황이 더 단순 해 보였습니다. Github의 공식 문서 에 따르면 사용중인 IP 주소 범위는 하나뿐입니다 (최소한 IPv4의 경우). 이것은 192.30.252.0/22 범위입니다. 이는 단지 4 개의 다른 C 블록에서 마지막 옥텟에 대한 전체 범위를 편리하게 확장 할 수있는 1020 개의 가능한 IP 주소를 만듭니다.
에서 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
:’및 비표준 포트 번호가 올 수도 있습니다.
이 정보를 사용하여 가능한 모든 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 블록을 채우지 않아 옥텟에 대한 모든 가능한 값을 채우지 않으면 정확한 일치를 위해 와일드 카드를 사용할 수 없습니다.
답변
나는 쉽게 범위를 추가 할 수는 없다고 생각하지만 .ssh / ssh_config에 다음을 추가하여 동일한 효과를 얻을 수 있다고 생각합니다 (지금 이것을 테스트 할 수는 없습니다).
Host *.github.com
HostKeyAlias github-server-pool.github.com
그런 다음 github-server-pool.github.com이라는 이름으로 known_hosts 파일에 키를 추가합니다.
가정 : 호스트 github-server-pool.github.com이 없거나 SSH를 통해 연결되지 않았습니다.
그 뒤에 아이디어는 ssh가 github.server-pool.github.com 키를 github.com 도메인의 모든 호스트에 대한 공개 호스트 키를 찾는 키로 사용한다는 것입니다.
답변
known_hosts
파일 에서 IP 주소 세트를 지원하지 않습니다 . 주소 당 한 줄이 있어야합니다.
항목의 호스트 이름 부분은 기본적으로 해시되어 있지만 개인 정보 보호를 위해서만 사용되므로 누군가가 귀하를 .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
중복이 추가 될 수 있습니다.
답변
SSH는 known_hosts에 대한 IP 범위 개념이없는 것 같습니다. 보안상의 이유로 각 호스트에는 고유 한 키가 있다고 가정합니다.
known_hosts를 미리 채우는 두 가지 방법 :
-
ssh-keyscan
-간단한 스크립트를 작성하여 모든 주소를 반복 하여 읽거나 읽을 수ssh-keyscan
있도록 파일ssh-keyscan
로 보냅니다.ssh-keyscan
한 줄에 지정하거나 호스트 목록을 지정하여 호출 당 여러 호스트를 스캔 할 수 있습니다. -
known_hosts
스크립트 나 편집기로 자신을 채우 십시오. 해시되지 않은 버전을 사용하면 형식이 매우 간단합니다. 그것은:호스트 이름, IP 주소 ssh-keytype 키
hostname
연락하는 호스트 이름이며 모든 GitHub 주소에서 동일합니다.
IP address
스크립트가 반복되는 것입니다.
key
위에 제공 한 키입니다.
우아하지는 않지만 SSH 사람들은 GitHub 이하는 일을 아무도하지 않을 것이라고 생각합니다.
답변
안녕하세요, 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