본문으로 건너뛰기

sshguard 설치 가이드

시스템에 SSHGuard 설정하기

  • 날짜: 2020년 8월 27일
  • 매뉴얼 그룹: SSHGuard Manual
  • 매뉴얼 섹션: 7
  • 버전: 2.4

설명

SSHGuard를 설정하려면 sshguard.conf 파일을 작성하고 필요한 경우 백엔드를 설정해야 합니다. 설정 옵션들은 샘플 설정 파일에 문서화되어 있습니다. 좋은 시작점은 샘플 파일을 복사하여 필요한 변경사항을 적용하는 것입니다:

기본 설정 단계

  1. BACKEND 설정하기 - 필요한 경우 SSHGuard와 함께 작동하도록 설정 (BACKENDS 참조)
  2. FILES, LOGREADER 또는 둘 다 설정하기 - 또는 명령줄에서 위치 인수로 모니터링할 파일 목록을 sshguard에 제공
    • FILES: 모니터링할 로그 파일들의 공백으로 구분된 목록을 지정
    • LOGREADER: 로그를 얻기 위해 실행할 셸 명령을 지정
    • 명령줄에서 파일이 제공되면 두 설정 모두 무시됩니다

샘플 설정에는 journalctl(1) 및 macOS 10.12+용 LOGREADER 명령 예시가 포함되어 있습니다.

다른 로그 시스템

syslog-ng

syslog-ng 2.x의 경우

syslog-ng.conf에 다음 라인들을 추가:

# sshguard가 아닌 프로그램에서 auth+authpriv 시설의 항목만 통과
filter sshlogs { facility(auth, authpriv) and not match("sshguard"); };

# 이 템플릿으로 프로세스에 전달 (<ID> 접두사 방지)
destination sshguardproc {
program("/usr/local/sbin/sshguard"
template("$DATE $FULLHOST $MESSAGE\n"));
};

log { source(src); filter(sshlogs); destination(sshguardproc); };

syslog-ng 3.x의 경우

syslog-ng.conf에 다음 라인들을 추가:

# 3.x 모드 활성화
@version:3.0

# sshguard가 아닌 프로그램에서 auth+authpriv 시설의 항목만 통과
filter f_sshguard { facility(auth, authpriv) and not program("sshguard"); };

# 이 형식으로 구성된 항목들 전달
destination sshguard {
program("/usr/sbin/sshguard"
template("$DATE $FULLHOST $MSGHDR$MESSAGE\n")
);
};

log { source(src); filter(f_sshguard); destination(sshguard); };

syslog-ng를 재시작한 후, auth 또는 authpriv 시설을 가진 로그 항목이 도착하는 즉시 SSHGuard가 시작됩니다. sshd 외의 서비스를 모니터링하는 경우 적절한 로그 시설을 syslog-ng.conf에 추가하세요.

metalog

metalog.conf에 다음 라인들을 추가:

# 무차별 대입 공격으로부터 보호할 것들:
# ssh용
facility = "*"
program = "sshd"
# 다른 서비스들...
# /var/log/sshguard 디렉토리에 로그
logdir = "/var/log/sshguard"

metalog를 재시작한 후, 로그 항목들이 /var/log/sshguard에 나타납니다. 현재 로그를 모니터링하려면 로그 폴링을 사용하세요.

백엔드

SSHGuard는 컴파일 시점에 선택되는 여러 방화벽 백엔드 중 하나를 사용하여 공격자를 차단할 수 있습니다.

⚠️ 경고

방화벽 문서를 읽어보세요. 사용하기 전에 아래 예시의 각 규칙이나 명령을 완전히 이해했는지 확인하세요. 특정 설정에 맞게 조정이 필요할 수 있습니다.

pf

SSHGuard는 공격자를 <sshguard> 테이블에 추가합니다. 테이블을 생성하고 공격자를 차단하려면 pf.conf 끝에 다음 라인들을 추가:

table <sshguard> persist
block in proto tcp from <sshguard>

pf 설정을 다시 로드한 후, 다음을 사용하여 테이블 내용을 검사할 수 있습니다:

# pfctl -t sshguard -T show

ipfw

SSHGuard는 테이블 22를 생성하고 공격자를 추가합니다. 이 테이블을 규칙셋에서 공격자를 차단하는 데 사용할 수 있습니다. 예시:

# ipfw add 5000 reset ip from table\(22\) to me

다음을 사용하여 테이블 내용을 검사할 수 있습니다:

# ipfw table 22 list

firewalld

차단된 공격자는 sshguard4sshguard6라는 두 ipset에 추가됩니다. ipset의 항목들은 기본 방화벽 구역에서 기본적으로 차단됩니다. 추가 방화벽 구역은 다음을 사용하여 설정할 수 있습니다:

# firewall-cmd --zone=zone-name --permanent \
--add-rich-rule="rule source ipset=sshguard4 drop"
# firewall-cmd --zone=zone-name --permanent \
--add-rich-rule="rule source ipset=sshguard6 drop"

다음을 사용하여 두 ipset의 항목들을 검사할 수 있습니다:

# firewall-cmd --permanent --info-ipset=sshguard4
# firewall-cmd --permanent --info-ipset=sshguard6

ipset

차단된 공격자는 sshguard4sshguard6라는 두 ipset에 추가됩니다. 기본적으로는 아무것도 차단되지 않지만, iptables 및 다른 도구의 소스로 사용할 수 있습니다. 예시:

# iptables  -I INPUT -m set --match-set sshguard4 src -j DROP
# ip6tables -I INPUT -m set --match-set sshguard6 src -j DROP

netfilter/iptables

SSHGuard용 체인을 생성:

# iptables -N sshguard      # IPv4용
# ip6tables -N sshguard # IPv6용

INPUT 체인이 처리 끝에서 트래픽을 sshguard 체인으로도 전달하도록 업데이트합니다. --dport에 sshguard가 보호하는 서비스의 모든 포트를 지정하세요. 공격자가 호스트에 대한 모든 트래픽을 차단하려면 이 옵션을 완전히 제거하세요:

# 공격자의 모든 트래픽 차단
iptables -A INPUT -j sshguard
ip6tables -A INPUT -j sshguard

또는:

# SSH, FTP, POP, IMAP 서비스에 대해서만 공격자 차단 ("multiport" 모듈 사용)
iptables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143 -j sshguard
ip6tables -A INPUT -m multiport -p tcp --destination-ports 21,22,110,143 -j sshguard

체인에서 더 높은 위치에 모든 ssh 트래픽을 허용하는 기본 허용 규칙이 없는지 확인하세요. 방화벽에서 모든 ssh 트래픽을 차단하는 기본 거부 규칙이 없는지 확인하세요. 어느 경우든, 방화벽 설정을 조정할 기술이 이미 있을 것입니다.

다음은 합리적인 샘플 규칙셋입니다:

iptables -N sshguard
# SSHGuard가 나쁘다고 하는 것들을 차단...
iptables -A INPUT -j sshguard
# ssh, dns, http, https 활성화
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 그리고 다른 모든 것을 차단 (기본 거부)
iptables -P INPUT DROP

재부팅할 때 대부분의 시스템은 기본적으로 방화벽 설정을 재설정합니다. 설정을 보존하려면 일반적으로 iptables-saveiptables-restore 유틸리티를 사용합니다. 하지만 각 Linux 변형마다 고유한 "올바른 방법"이 있습니다.

nftables

SSHGuard는 높은 우선순위를 가진 테이블을 생성하고 공격자를 세트에 자동으로 추가합니다.

다음을 사용하여 세트 내용을 검사할 수 있습니다:

# nft list set ip sshguard attackers
# nft list set ip6 sshguard attackers

또한, 다음을 사용하여 sshguard의 테이블을 표시할 수 있습니다:

# nft list table ip sshguard
# nft list table ip6 sshguard

문제 해결

SSHGuard가 올바르게 설정되었는가?

sshguard.conf에서 올바른 FILES (또는 LOGREADER)와 BACKEND가 설정되어 있는지 확인하세요.

SSHGuard가 실행 중인가?

SSHGuard는 협력하는 프로세스들의 파이프라인을 생성합니다. ps 또는 top을 사용하여 프로세스 목록을 보고 SSHGuard가 올바르게 시작되었는지 확인할 수 있습니다. 다음은 예시 설정과 관련된 프로세스들입니다:

/bin/sh /opt/sshguard/sbin/sshguard
tail -F -n 0 /tmp/log.txt
/opt/sshguard/libexec/sshg-parser
/opt/sshguard/libexec/sshg-blocker -a 30 -p 120 -s 1800 -N 128 -n 32
/bin/sh /usr/local/libexec/sshg-fw-null

순서대로:

  1. /opt/sshguard에 설치된 SSHGuard가 /bin/sh에 의해 해석되고 있습니다.
  2. SSHGuard가 /tmp/log.txt를 모니터링하는 tail -F -n 0을 시작했습니다.
  3. 기본 파서 sshg-parser가 실행 중입니다.
  4. 블로커가 -a 30 -p 120 -s 1800 -N 128 -n 32 옵션으로 실행 중입니다.
  5. 방화벽 sshg-fw-null이 실행 중입니다. null 백엔드는 실제로 공격을 차단하지 않습니다.

SSHGuard가 공격을 인식하고 있는가?

SSHGuard는 로그 메시지를 파싱하여 공격을 인식합니다. 로그 메시지의 형식은 때때로 변경될 수 있습니다. 기본 내장 공격 파서를 사용하고 있다면, 다음을 실행하여 SSHGuard가 공격을 인식하는지 확인할 수 있습니다:

$ cat /var/log/auth.log | %PREFIX%/libexec/sshg-parser -a

공격으로 인식되는 로그 메시지는 각 줄의 시작 부분에 '*' 접두사가 붙습니다. 공격으로 인식되어야 하는 로그 메시지가 인식되지 않는다면, 이를 신고하는 것을 고려해보세요.

예시

FILES 무시하고 대신 이 파일들 모니터링:

# sshguard /var/log/auth.log /var/log/maillog