Bruteforce SSH 공격으로부터 우분투 서버를 보호하는 방법은 무엇입니까?


21

암호는 안전하지만 무차별 대입 공격이 발생했을 때 서버 성능 저하에 대해 사람들이 불평하는 것을 들었습니다. 이러한 공격으로부터 우분투 10.10 서버를 어떻게 보호 할 수 있습니까? 이것에 대한 의류 프로필이 있습니까? 아니면 다른 방법으로 해결할 수 있습니까?

답변:


19

다른 솔루션이 있습니다. 가장 좋은 방법은 공개 / 개인 키를 사용하여 사용자를 인증하는 RSA 인증을 사용하는 것입니다.

다양한 접근 방식 (RSA 인증 포함)에 대해서는이 훌륭한 매뉴얼을 확인하십시오. http://www.la-samhna.de/library/brutessh.html

기술적이지 않은 사용자에게는 복잡하게 만들고 싶지 않기 때문에 서버 에서 세 번째 솔루션 을 사용 iptables하고 있습니다.

사용중인 솔루션은 다음과 같습니다.

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j LOG --log-prefix "SSH_brute_force "
iptables -A INPUT -p tcp --dport 22 -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

여기에 언급 된 바와 같이 : 60 초 내에 지정된 IP 주소에서 3 개의 포트 22 연결을 허용하며 연결을 다시 허용하기 전에 후속 연결 시도없이 60 초가 소요됩니다. --rttl 옵션은 또한 패킷 일치시 데이터 그램의 TTL을 고려하여 스푸핑 된 소스 주소를 완화하기 위해 노력합니다.

언급 된 가이드에 명시된대로 화이트리스트를 사용하여 신뢰할 수있는 사용자를 다음 규칙과 분리하는 것이 좋습니다.

iptables -N SSH_WHITELIST

그런 다음 신뢰할 수있는 호스트를 추가하십시오.

iptables -A SSH_WHITELIST -s $TRUSTED_HOST -m recent --remove --name SSH -j ACCEPT

그리고 나서 규칙을 만드십시오.

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j SSH_WHITELIST
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j ULOG --ulog-prefix SSH_brute_force
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 --rttl --name SSH -j DROP

비밀번호 인증 해제와 관련하여 공개 키를 잃어버린 경우 어떻게 서버에 로그인합니까? (서버에 물리적으로 액세스 할 수 없으며 VPS입니다)
Dziamid

공개 키는 원하는 곳 어디에서나 게시 할 수 있으므로 걱정하지 마십시오. 공개 장소에서도 잊을 수없는 확실한 위치에 배치 할 수 있습니다.
Pedram

여기에서 더 읽으십시오 : en.wikipedia.org/wiki/Public-key_cryptography
Pedram

요청시 공개 키를 공개하도록 서버를 설정하는 방법이 있습니까?
Dziamid

1
ssh를 사용하면 그렇게 생각하지 않습니다. 아파치와 같은 웹 서버가 설치되어 있으면 웹을 사용하여 키를 공유 할 수 있습니다.
Pedram

8

서버에 매일 1 ~ 2의 비율로 무차별 공격을받습니다. 내가 설치 한 denyhosts (: denyhosts 우분투 패키지). 매우 간단하지만 효과적인 도구입니다. 기본적으로 정기적으로 로그를 검사하여 무차별 대입 공격을 탐지하고 이러한 공격이 발생한 위치에서 IP를 /etc/hosts.deny 파일로 보냅니다. 다시는 소식을 듣지 못하므로 부하를 상당히 줄여야합니다. 구성 파일 /etc/denyhosts.conf를 통해 구성 할 수있어 공격을 구성하는 잘못된 시도 횟수 등의 문제를 조정할 수 있습니다.

투명하게 작동하기 때문에 진행중인 상황 (이메일 알림 : '아하, 별다른 공격이 막혔습니다!')을 쉽게 확인할 수 있으며 사용자가 암호를 반복적으로 잘못 입력하여 실수를 취소 할 수 있습니다.

물론 이전에 다른 인증 방법으로 전환하는 것에 대해 언급 한 모든 내용이 적용되지만 요구 사항이 사용자의 요구 사항과 일치하지 않는 경우가 있습니다.

또한 iptables의 새로운 연결 속도 제한이 hosts.deny를 통한 액세스를 거부하는 것이 더 좋습니다. 따라서 fail2ban도 살펴보십시오. 그러나 ssh brute-force가 주요 관심사라는 것을 알고 있다면 (수동으로 /var/log/auth.log를 통해 확인)이 매우 쉽고 영향이 적은 도구를 사용하십시오.


1
내 /var/log/auth.log가 최근에 상당히 증가했습니다. 이와 같은 항목이 Mar 27 10:28:43 smartfood sshd[17017]: Failed password for root from 218.15.136.38 port 33119 ssh2 Mar 27 10:28:47 smartfood sshd[17019]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.15.136.38 user=root공격을 나타 냅니까?
Dziamid

1
IP 218.15.136.38의 누군가가 루트로 로그인을 시도했음을 의미합니다. 당신이 될 수는 있지만 tools.whois.net/whoisbyip 사용했기 때문에이 IP가 중국에 등록되어 있음을 알 수 있습니다 .Minsk와는 꽤 다른 방식입니다. . 도덕적 : ssh를 통한 루트 로그인을 비활성화하십시오 (/ etc / ssh / sshd_config의 PermitRootLogin no). 그런 다음 거부 호스트 또는 fail2ban을 고려하십시오. 또한 포트 22와 기타 필요한 것만으로는 액세스 할 수있는 방화벽이 있어야합니다.
DrSAR

6
  1. sshd 포트를 비표준으로 변경하십시오.
  2. 포트 노킹 시스템 knockd을 구현하는 데 사용
  3. iptables recenthashlimitmatch를 사용 하여 연속적인 SSH 시도를 제한하십시오
  4. 비밀번호를 사용하지 말고 대신 SSH 키를 사용하십시오.

3
첫 번째 조언으로 -1은 실제로 실질적인 보안 향상이없는 상황을 복잡하게 만듭니다.
steabert

ssh 키를 사용하고 ssh를 통해 비밀번호 인증을 끄는 경우 실제로 1,2,3이 필요합니까?
Dziamid 2016 년

4
@steabert 그것은 포트 22를 통해 자신의 길을 무차별 공격하는 스크립트 키드에 대해 도움이됩니다. 그것은 내 경험입니다 : 누군가가 인터넷 연결 서버를 설정할 때 무차별 적으로 유지하여 경고 후 시스템이 경고를 보내도록합니다. 나는 항구를 움직 였고 경고는 가라 앉았다.
pepoluan

@Dziamid ssh 키는 누군가 시스템에 침입하는 것을 방지합니다. 그러나 포트 22에 연결하려고 시도하는 것을 막지는 않습니다.
pepoluan

3
@Dziamid 아니오, 정확하지 않습니다. 다른 인증 방법 (RSAAuthentication, PubkeyAuthentication, #KerberosAuthentication 등)은 모두 여전히 포트 22를 통해 연결됩니다.
DrSAR

3

우선 암호를 사용하지 말고 키를 대신 사용하십시오. 비밀번호를 사용할 필요가 없습니다. 이것이 효과가있는 경우 OpenSSH 서버가 비밀번호 로그인에 반응하지 않도록 구성 할 수 있습니다.

https://help.ubuntu.com/10.04/serverguide/C/openssh-server.html

fail2ban을 사용하면 옵션이 될 수 있습니다.

https://help.ubuntu.com/community/Fail2ban


공개 키를 풀면 서버에 어떻게 연결합니까?
Dziamid

1
콘솔 또는 직접 액세스를 통해서만 가능합니다. 서버를 관리 할 수 ​​있으면 키를 잃어 버리지 않을 것이라고 확신합니다.
ddeimeke

0

서버가 네트워크에서 얼마나 광범위하게 노출됩니까? 네트워크 관리자와 대화하고 서버에 대한 네트워크 액세스를 모니터링하고 제한 할 수 있는지 확인할 수 있습니다. 계정 로그인이 안전하더라도 서버가 단순한 DoS / DDoS 공격으로 고통받을 수 있습니다.


0

fail2ban의 대안은 CSF : ConfigServer Security & Firewall 입니다.

LFD : 로그인 실패 데몬 (Login Failure Daemon)은 다양한 서비스에서 여러 번의 로그인 시도 실패를 감지 할 수 있으며 문제의 IP 주소를 일시적 또는 영구적으로 차단합니다.

또한 홍수 공격에 대비하고 침입을 탐지 할 수있는 다른 옵션이 있습니다.

단점 :

  • LFD가 작업을 수행하려면 CSF를 방화벽으로 사용해야합니다. 따라서 기존 방화벽이있는 경우 방화벽을 CSF로 교체하고 구성을 포트해야합니다.
  • 우분투 용으로 패키지되어 있지 않습니다. configserver.com의 자동 업데이트를 신뢰하거나 자동 업데이트를 비활성화해야합니다.
  • 나는 그것이 매우 인기가 있다고 들었습니다. 따라서 똑똑한 침입자는 침입 탐지가 탐지되기 전에 어떻게 비활성화하는지 알 것입니다!

0

전세계에 SSH 서비스를 허용 하시겠습니까? 아니면 특정 장소의 팀원에게만? 나의 대답은 당신의 도전의 심각성에 따라 조금씩 다릅니다.

두 경우 모두 SSH 서버가 루트 사용자의 비밀번호 로그인을 허용하지 않도록해야합니다.

  1. / etc / ssh / sshd_config에서 SSH 키를 제외하고는 루트 로그인을 허용하지 않아야합니다.

내 시스템에는이 설정이 있습니다

PermitRootLogin without-password

그러나 나는 새로운 우분투에서 그들이 가지고있는 것을 알았습니다.

PermitRootLogin prohibit-password

"man sshd_config"를 읽으면이 최신 "비밀번호"가 동일한 의미를 가지며 의미가 더 분명하다는 것을 의미합니다. 일부 Linux 시스템에서는 기본값이 아니지만 아마도 있어야합니다.

자, 문제에 대해 시스템 서버는 특정 장소의 일부 사용자 만 있습니까? 이 작업을 수행!

  1. /etc/hosts.deny를 편집하고 삽입하십시오

    모두 : 모두

그런 다음 /etc/hosts.allow를 편집하고 SSH 사용을 허용하려는 IP 번호 또는 범위를 나열하십시오. 111.222.65.101에서 111.222.65.255와 같은 IP 번호를 가진 모든 시스템을 허용하려면 hosts.allow에 이와 같은 항목을 입력하기 때문에 약간 혼란스러운 표기법이 있습니다.

ALL: 127.0.0.1
sshd: 111.222.65.
sshdfwd-X11: 111.222.65.

그것은 무차별적이고 강력한 솔루션입니다. IP 범위로 사용자를 열거 할 수 있다면 그렇게하십시오!

이 솔루션은 IP 테이블이 생성되기 전에 존재했지만 관리하기가 훨씬 쉽지만 IP 테이블 루틴은 hosts.allow 및 hosts로 구동되는 프로그램보다 빨리 적을 발견하기 때문에 IP 테이블 솔루션만큼 좋지 않습니다. . 거부 그러나 이것은 SSH뿐만 아니라 많은 문제를 해결하는 확실한 방법입니다.

자신이 만든 문제에 유의하십시오. FTP 서버, 웹 서버 등을 열려면 호스트에서 항목을 허용해야합니다.

iptables와 방화벽을 사용하여 동일한 기본 목적을 달성 할 수 있습니다. 어떤 의미에서 이것은 외부 경계에서 적을 차단하기 때문에 선호되는 솔루션입니다. 우분투에는 "ufw"(복잡한 방화벽)가 있고 "man ufw"에는 많은 예가 있습니다. 차라리 멋진 GUI가 필요합니다. 항상 이것을 할 필요는 없습니다. 어쩌면 다른 사람들이 지금 있다면 말해 줄 수 있습니다.

  1. 다른 게시물은 사용자에게만 SSH 공개 키를 사용하도록 제안했습니다. 그것은 사용자에게 복잡성과 좌절의 대가로 확실히 도움이 될 것입니다. 우리 실험실에는 15 대의 컴퓨터가 있습니다. 사용자는 컴퓨터를 사용합니다. 사람들이 한 컴퓨터에서 다른 컴퓨터로 이동하기 때문에 SSH 키 인증이 필요하면 큰 번거 로움이 생길 수 있습니다.

일부 사용자가 다양한 서버에 대해 다른 ssh 키를 누적하면 또 다른 좌절의 원인이 발생합니다. 약 12 개의 다른 프로젝트에 대한 SSH 키가 있으므로 공개 키가 너무 많아서 ssh가 실패합니다 ( "ssh -o PubkeyAuthentication = false"가 필요하거나 .ssh / config 파일에 항목을 작성해야합니다. PITA 임).

  1. 넓은 세상에서 서버를 SSH로 열어 두어야하는 경우 거부 로그인 루틴을 사용하여 자주 로그인을 시도하는 위치를 차단해야합니다.이 프로그램에는 2 개의 멋진 프로그램이 있습니다.이 프로그램에는 denyhosts와 fail2ban이 있습니다. . 이 프로그램에는 원하는 기간 동안 범죄자를 금지 할 수있는 설정이 있습니다.

Centos Linux 시스템에서 denyhosts 패키지를 삭제하고 fail2ban 만 제공한다는 것을 알았습니다. denyhosts는 귀찮은 사용자 / IP 범위 목록을 작성한 다음 hosts.deny에 있었기 때문에 좋아했습니다. 대신 fail2ban을 설치했는데 괜찮습니다. 내 이해는 서버의 외부 가장자리에서 이러한 나쁜 사용자를 차단하기 때문에 fail2ban과 같은 ip 테이블 기반 차단기가 실제로 더 낫다는 것입니다. Denyhosts는 2 차 레벨에서 작동합니다. 적들이 iptables를 지나면 sshd 데몬에 의해 거부됩니다.

두 프로그램 모두 암호를 잊어 버려 로그인을 몇 번 시도하면 사용자가 감옥에서 나오게하는 것이 약간 지루합니다. 로그인 실수를했을 때 다시 로그인하는 것은 약간 어렵습니다. 포인트 앤 클릭 GUI를 사용하여 사람들을 다시 지정하고 다시 방문 할 수 있다고 생각했을 것입니다. 나는 몇 달마다 이것을해야하고 시간 사이의 방법을 잊어 버려서 웹 페이지 http://pj.freefaculty.org/blog/?p=301 에 나 자신을위한 지침을 작성했습니다 .

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