수백 개의 실패한 ssh 로그인


81

매일 밤 RedHat 4 서버에서 수백, 때로는 수천 개의 ssh 로그인에 실패했습니다. 원격 사이트의 방화벽 문제로 인해 표준 포트에서 실행해야합니다. 이것을 막기 위해해야 ​​할 일이 있습니까? 많은 사람들이 동일한 IP 주소에서 온 것으로 나타났습니다. 잠시 후에 사람들을 멈추지 않아야합니까?

답변:


67

iptables를 사용하여 SSH 포트에 대한 새 수신 연결의 속도를 제한 할 수 있습니다. 턴키 솔루션을 제공하기 위해 전체 iptables 구성을 봐야하지만 기본적으로 다음과 같은 규칙을 추가하는 것에 대해 이야기하고 있습니다.

iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 5 --name SSH --rsource -j DROP 
iptables -A INPUT -p tcp --dport 22 -m recent --set --name SSH --rsource -j ACCEPT 

이 규칙은 표 앞부분에서 ESTABLISHED 연결을 수락한다고 가정합니다 (따라서 새로운 연결 만이 규칙에 적용됨). 새로운 SSH 연결이이 규칙에 맞고 표시됩니다. 60 초 안에 단일 IP 주소에서 5 번 시도하면 해당 IP에서 들어오는 새로운 연결이 끊어집니다.

이것은 나를 위해 잘 작동했습니다.

편집 : 추가 소프트웨어를 설치할 필요가 없으며 커널 모드에서 완전히 발생하기 때문에이 방법을 "fail2ban"보다 선호합니다. "fail2ban"과 같은 구문 분석 로그 파일을 처리하지 않지만 문제가 SSH에만 해당되는 경우 소프트웨어 설치가 필요하고 더 복잡한 사용자 모드를 사용하지 않습니다.


1
나는이 솔루션을 좋아하고 오늘 밤에 화재가 발생하면 오늘 밤에 그 자리에 배치 할 계획이다.
MattMcKnight 2016 년

2
공격 속도를 늦추고 추천합니다. 그러나 분산 스캐닝 봇넷이 있기 때문에 만병 통치약이 아닙니다. 분산 스캔을 실행하는 봇넷의 잘못된 로그온은 여전히 ​​유효합니다. 그것에 대해 할 수있는 일이 그리 많지 않습니다. "포트 노킹"방식을 사용하면 SSH 포트를 원격으로 가져올 수 있습니다.
Evan Anderson

1
@Evan의 "포트 노킹"제안에 +1. 일부 정보는 linux.die.net/man/1/knockd 입니다. 그러나 맨 페이지 방식으로 (즉, iptables 규칙 추가 / 삭제)하지 말고 대신 -m conditioniptables match를 사용하십시오.
pepoluan

2
ssh 트래픽에만 적용되도록 이러한 규칙에 --dport 22가 필요하지 않습니까?
clime

2
@clime-p. 믿기 ​​어려우며 여기에 2 년 반이 걸렸으며 아무도 눈치 채지 못했습니다! 잘 잡았습니다.
Evan Anderson


25

가능하면 SSH에 비표준 포트를 사용하는 것이 좋습니다 (예 : 포트 10222).하지만 언급 할 수 없으므로 DenyHosts와 같은 것을 사용하는 것이 좋습니다.

http://denyhosts.sourceforge.net/

설치 및 구성이 쉬운 훌륭한 패키지.


6
사람들이 왜 이것을지지하는지 모르겠습니다. SSH는 표준 포트 22에 있습니다. 즉, 외부 네트워크를 사용하는 경우 아웃 바운드 방화벽을 통해 비표준 포트를 여는 것에 의존하지 않습니다. 인바운드 방화벽을 통한 반복 연결 수를 제한하거나 비밀번호 로그인을 해제하여이 문제에 대한 실제 솔루션을 위에 설명했습니다.
Andrew Taylor

1
OpenSSH 6.7은 tcpwrappers support를 드롭하여 거부 호스트가 사용합니다.
Zoredache

15

인터넷의 임의의 위치에서 시스템으로 ssh를 수행하는 것이 좋을 수도 있지만, 열린 ssh 포트에 잠그고 시스템에 대한 다양한 joe 계정 및 사전 공격을 적용하는 자동 비밀번호 공격 시스템이 있습니다. 이것은 야간 로그 요약을 읽기 위해 번거로울 수 있으며 대역폭을 낭비합니다.

동일한 시스템에 웹 서버가있는 경우 php 및 tcp 래퍼를 사용하여 ssh 인바운드 트래픽을 알려진 시스템으로 제한하고 인터넷의 임의 시스템에서 액세스 할 수 있도록 백도어 키를 제공 할 수 있습니다.

방법은 다음과 같습니다.

/etc/hosts.deny에서 모든 ssh 연결을 거부하십시오.

# /etc/hosts.deny fragment
sshd:  all

/etc/hosts.allow에서 IP로 알려진 시스템을 허용하고 임시 액세스를위한 파일을 추가하십시오.

# /etc/hosts.allow fragment
sshd:  10.0.10.2     # some system
sshd:  172.99.99.99  # some other system
sshd:  /etc/hosts.allow.temporary-sshd-access

웹 서버에서 PHP 파일을 생성하고 my-sshd-access.php와 같이 명백하지 않은 이름을 지정하십시오.

<?php
function get_ip()
{
    return getenv("REMOTE_ADDR"); 
}

?>

<?php
$out='/etc/hosts.allow.temporary-sshd-access';
$log='/var/log/sshd-access-addition-log';

print "Was:";
readfile($out);
print "<br>";
$ip=get_ip();
$fp=fopen($out,"w");
fputs($fp,$ip);
fclose($fp);

$lfp=fopen($log,"a");
fputs($lfp,$ip);
fputs($lfp,"n");
fclose($lfp);

print "Wrote: ";
readfile($out);
?>

PHP 코드를 용서하십시오-다른 곳에서 스 와이프 했으므로 아마 전체를 정리할 수있었습니다. 시스템에 액세스하는 시스템의 IP 주소를 /etc/hosts.allow.temporary-sshd-access 파일에 추가하면됩니다.이 파일은 연결시 sshd (/etc/hosts.allow에 포함되어 있기 때문에)에 의해 읽 힙니다. .

이제 웹에서 임의의 시스템에 있고이 시스템으로 ssh하려는 경우 먼저 웹 브라우저를 사용하여이 파일을 누르십시오 (또는 wget 또는 equivilent 사용).

$ wget http://your.system.name/my-sshd-access.php

이제 시스템에 ssh 할 수 있어야합니다. 이 위치가 자주 오지 않는 경우, /etc/hosts.allow.temporary-sshd-access 파일의 내용을 읽고 IP 주소를 / etc / hosts에 영구적으로 추가하는 것은 쉽지 않습니다. 허용하다.


보다 안전하게하려면 https에서이 페이지를 실행하십시오.
Robert Munteanu

"허용 된 임시 IP 주소"파일의 내용을 출력하지 않도록 스크립트를 변경하면 스니퍼가 스니핑 할 내용이 없습니다. 그런 다음 https 대신 http에서 실행할 수 있습니다.
Barry Brown

"허용 된 임시 IP 주소"는 항상 요청자의 주소입니다 (예 : 귀하의 것). 나는 그것이 어떤 식 으로든 중요하다고 생각하지 않습니다. Https는 요청 된 URL이 암호화되어 있다는 것을 의미합니다.
David Mackintosh

HTTP 연결을 프록시하는 네트워크에 있지만 인터넷으로 직접 연결되는 경로가 다른 송신을 통해 작동하는 경우에는 작동하지 않습니다.
Andrew Taylor

OpenSSH 6.7은 tcpwrappers support를 드롭 하여 응답에 사용됩니다.
Zoredache



2

다른 해결책은 ssh를 다른 포트로 옮기는 것입니다. 이 벌레는 꽤 바보입니다.


3
원래 포스터는 표준 포트에서 실행해야한다고 말했습니다.
kbyrd

1
죄송합니다. 질문을 더 신중하게 읽어야합니다. :
disserman

1
동의해야합니다 ... SSH가 "대체"포트에서 실행되고 있으며 로그의 차이가 세계에 있습니다. 웜은 벽돌만큼이나 똑똑하기 때문에 멍청한 자동화 스크립트와 잘 어울립니다. 인간 공격자에게는 그렇게 좋지 않습니다. 아직도, 통나무는 그들에게 축복의 침묵의 소리를 가지고 있습니다 ...
Avery Payne

봇이 "멍청한"것이 아니라 낮은 매달린 과일을 찾도록 설계되었습니다. 따라서 SSH 포트를 옮기는 것은 과일을 땅에 떨어 뜨리지 않는 스타일입니다.
elrobis

2

다른 옵션은 모든 ssh 연결을 인증서로 확인하고 비밀번호를 완전히 없애도록하는 것입니다.

Denyhosts를 사용하지만 소수의 장소에서만 원격으로 정기적으로 연결하는 것을 발견했기 때문에 다른 곳을 제외한 모든 포트 22 연결을 차단하고 포트 노킹을 사용하여 랩톱으로 어디서나 연결할 수 있습니다. .


1

여러 번 실패한 후 IP를 자동으로 차단하는 솔루션은 서비스 거부 공격의 위험이 있습니다. 무차별 대입 공격 또는 사전 공격의 효과를 줄이기위한 올바른 비밀번호 정책이있는 한, 그에 대해 너무 걱정하지 않아도됩니다.

사용자 / 그룹을 처음에 ssh로 로그인 할 수있는 사용자로만 제한하고 루트로 로그인을 비활성화하는 경우 충분히 안전해야합니다. 충분하지 않으면 항상 키 기반 인증이 있습니다.


1

솔직히 SSH (및 포트 22)를 실행해야하는 경우이를 피할 수 없습니다. 암호를 수락해야하는 경우 모양이 훨씬 나빠집니다.

가장 좋은 방법은 SSH 로그를 제외하도록 로그 분석 소프트웨어를 구성하는 것입니다. 그런 다음 별도의 인스턴스를 실행하여 SSH 로그 만보고 procmail을 사용하여 실패한 시도를 필터링하십시오. 여러 번의 시도 실패로 IP 주소에서 성공적인 로그인을 감시하는 스크립트를 작성할 수도 있습니다.

사람들이 SSH 서버를 조사하지 못하게 할 방법이 없습니다. Denyhosts, fail2ban 및 iptables 예제는 어느 정도 작동하지만 합법적 인 사용자를 실수로 차단할 위험이 있습니다. 가장 좋은 방법은 그것을 분석하고 로그 분석 프로세스를 자동화하여 생각해야하는 시간을 줄이는 것입니다.


0

Red Hat 서버에서 로그인 시도에 실패했다면 방화벽 뒤에 어떤 방화벽이 있고 몇 명의 사람들이 서버에 로그인해야합니까? 방화벽이 실제 서버 근처에 도달하기 전에 방화벽에서의 시도를 제한하고 싶을 때 제안합니다.

합법적으로 액세스해야하는 IP 주소 범위를 제한 할 수 있으면 방화벽에 액세스 목록을 설정할 수 있어야합니다. 방화벽에서 트래픽을 제한 할 수 있다면 서버가 무언가를 목표로하는 것처럼 들리므로 네트워크 침입 시스템을 살펴 보는 것이 좋습니다.


0

대부분의 웹 호스트는 APF + BFD 를 사용 하여 실패한 SSH 로그인을 ip- 차단합니다. 요즘에는 서버에 액세스하지 않으려는 특정 국가 (예 : 한국, 중국 등)의 SSH IP의 99 %가 포함 된 LFD라는 도구가 포함 된 CSF (Configserver Firewall) 가 있습니다. 에서 유래 한 것 같습니다).



0

둘 이상의 호스트에서이 문제를 해결해야하는 경우 OSSEC을 확인하십시오. http://www.ossec.net/main/ossec-architecture

이렇게하면 중앙에서 여러 에이전트를 구성하여 로그에서 추출 할 수있는 다른 패턴과 함께 무차별 대입 공격에 자동으로 대응할 수 있습니다.

소프트웨어의 아주 좋은 조각 :)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.