콘텐츠로 이동






Rocklinux9에서 clamav 연동하기

Rocky Linux 9 메일 보안 구성

기존의 Sendmail + clamav-milter 직접 연동 대신
Postfix + Dovecot + Rspamd + ClamAV + Redis 조합을 권장한다.

  • Postfix: SMTP 수신·발송 및 릴레이 제어
  • Dovecot: IMAP/POP3 및 SMTP AUTH
  • Rspamd: 스팸·피싱·SPF·DKIM·DMARC 검사
  • ClamAV: 악성코드 검사
  • Redis: Rspamd 캐시·학습·통계 데이터 저장

구성도

Internet
   │
   ▼
Postfix (SMTP 25 / Submission 587)
   │
   ├── Rspamd milter (127.0.0.1:11332)
   │      ├── SPF / DKIM / DMARC 검사
   │      ├── 스팸·피싱·URL 검사
   │      └── ClamAV clamd 연동
   │              └── FreshClam 바이러스 정의 업데이트
   │
   ▼
Dovecot (IMAPS 993 / POP3S 995)
   │
   └── 사용자 Maildir

1. 패키지 설치

1.1 시스템 업데이트 및 저장소 활성화

# dnf update -y

# dnf install -y dnf-plugins-core epel-release
# dnf config-manager --set-enabled crb

1.2 Postfix, Dovecot, ClamAV, Redis 설치

# dnf install -y postfix dovecot \
    clamav clamd clamav-update \
    redis policycoreutils-python-utils

1.3 Rspamd 저장소 등록 및 설치

# EL_VERSION=$(rpm -E %{rhel})

# curl -o /etc/yum.repos.d/rspamd.repo \
    https://rspamd.com/rpm-stable/centos-${EL_VERSION}/rspamd.repo

# dnf install -y rspamd

설치된 버전을 확인한다.

# postconf mail_version
# dovecot --version
# clamd --version
# rspamd --version
# redis-server --version

2. ClamAV 설정

2.1 FreshClam 설정

바이러스 정의 데이터베이스 업데이트 설정 파일을 수정한다.

# vi /etc/freshclam.conf

기본 예시 설정이 활성화되어 있다면 주석 처리하거나 삭제한다.

# Example

주요 설정은 다음과 같다.

DatabaseDirectory /var/lib/clamav
UpdateLogFile /var/log/clamav/freshclam.log
LogTime yes
DatabaseMirror database.clamav.net

초기 바이러스 정의 DB를 내려받는다.

# freshclam

FreshClam 자동 업데이트 서비스를 활성화한다.

# systemctl enable --now clamav-freshclam
# systemctl status clamav-freshclam

2.2 clamd 설정

Rspamd가 ClamAV에 연결할 수 있도록 clamd를 loopback TCP 3310 포트에 리슨시킨다.

# vi /etc/clamd.d/scan.conf
LogFile /var/log/clamav/clamd.scan.log
LogTime yes
PidFile /run/clamd.scan/clamd.pid

DatabaseDirectory /var/lib/clamav

TCPSocket 3310
TCPAddr 127.0.0.1

MaxThreads 4
MaxQueue 100

StreamMaxLength 25M
MaxFileSize 25M
MaxScanSize 25M

TCPAddr 127.0.0.1을 설정하여 ClamAV TCP 포트를 외부에 노출하지 않는다.

ClamAV 데몬을 활성화한다.

# systemctl enable --now clamd@scan
# systemctl status clamd@scan

TCP 3310 포트 리슨 상태를 확인한다.

# ss -lntp | grep 3310

예상 출력:

LISTEN 0 15 127.0.0.1:3310 0.0.0.0:* users:(("clamd",pid=1234,fd=7))

3. Rspamd와 ClamAV 연동

Rspamd의 ClamAV antivirus 모듈 설정 파일을 생성한다.

# vi /etc/rspamd/local.d/antivirus.conf
clamav {
    type = "clamav";
    servers = "127.0.0.1:3310";

    scan_mime_parts = true;
    scan_text_mime = false;
    scan_image_mime = false;

    max_size = 25000000;
    timeout = 15.0;

    symbol = "CLAM_VIRUS";
    action = "reject";
    message = "Message rejected: malware detected by ${SCANNER}";
}
  • servers: ClamAV clamd 서버 주소
  • scan_mime_parts: 첨부 파일별 악성코드 검사
  • max_size: 검사할 최대 메일 크기
  • action = "reject": 악성코드 탐지 시 SMTP 단계에서 메일 거부

Rspamd 설정 문법을 확인한다.

# rspamadm configtest

Redis와 Rspamd 서비스를 활성화한다.

# systemctl enable --now redis rspamd
# systemctl status redis rspamd

Rspamd milter 포트를 확인한다.

# ss -lntp | grep 11332

4. Postfix 설정

4.1 main.cf 설정

Postfix 메인 설정 파일을 수정한다.

# vi /etc/postfix/main.cf

아래는 example.com 도메인을 사용하는 예시다.

# 서버 식별 정보
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain

# 이 서버가 최종 수신할 도메인
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

# SMTP 수신 인터페이스
inet_interfaces = all
inet_protocols = ipv4

# 릴레이를 허용할 내부 네트워크
mynetworks = 127.0.0.0/8, 192.168.0.0/24

# Open relay 방지
smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    defer_unauth_destination

# Rspamd milter 연동
smtpd_milters = inet:127.0.0.1:11332
non_smtpd_milters = $smtpd_milters
milter_protocol = 6

# Rspamd 장애 시 처리 정책
milter_default_action = tempfail

# SMTP TLS
smtpd_tls_security_level = may
smtp_tls_security_level = may

smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem

smtpd_tls_loglevel = 1

# 최대 메일 크기: 25MB
message_size_limit = 26214400

milter_default_action = tempfail은 Rspamd 장애 시 메일을 일시 거부하는 Fail Closed 정책이다.
메일 가용성을 우선하고 검사 장애 시 메일을 허용하려면 accept로 변경할 수 있다.

milter_default_action = accept

4.2 Submission 포트 활성화

외부 메일 클라이언트는 SMTP 25 대신 Submission 587 포트를 사용하도록 구성한다.

# vi /etc/postfix/master.cf

아래 Submission 블록의 주석을 해제하거나 추가한다.

submission inet n       -       n       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

5. Dovecot SMTP AUTH 설정

5.1 인증 socket 설정

Dovecot이 Postfix에 SMTP AUTH socket을 제공하도록 설정한다.

# vi /etc/dovecot/conf.d/10-master.conf

service auth 블록에 아래 설정을 추가한다.

service auth {
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

5.2 Dovecot TLS 설정

Dovecot TLS 설정 파일을 수정한다.

# vi /etc/dovecot/conf.d/10-ssl.conf
ssl = required

ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem

운영 환경에서는 평문 IMAP(143), POP3(110)보다 IMAPS(993), POP3S(995)를 사용한다.

6. 서비스 기동

Postfix 설정 문법을 검사한다.

# postfix check
# postconf -n

Dovecot 설정을 확인한다.

# doveconf -n

관련 서비스를 활성화하고 시작한다.

# systemctl enable --now postfix dovecot
# systemctl restart rspamd postfix dovecot

전체 서비스 상태를 확인한다.

# systemctl status postfix
# systemctl status dovecot
# systemctl status rspamd
# systemctl status redis
# systemctl status clamd@scan
# systemctl status clamav-freshclam

7. 방화벽 설정

외부에 제공할 서비스 포트만 허용한다.

# firewall-cmd --permanent --add-service=smtp
# firewall-cmd --permanent --add-service=imap
# firewall-cmd --permanent --add-service=imaps

# firewall-cmd --permanent --add-port=587/tcp

# firewall-cmd --reload

필요한 경우에만 POP3S 포트를 허용한다.

# firewall-cmd --permanent --add-service=pop3s
# firewall-cmd --reload

평문 POP3(110)는 운영 환경에서 사용하지 않는 것을 권장한다.

8. 동작 검증

8.1 ClamAV 단독 탐지 테스트

EICAR 테스트 문자열을 ClamAV에 전달한다.

# printf '%s\n' \
'X5O!P%%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*' \
| clamdscan -

정상적인 탐지 예시는 다음과 같다.

stream: Win.Test.EICAR_HDB-1 FOUND

8.2 로그 확인

Rspamd, ClamAV, Postfix 로그를 확인한다.

# journalctl -u rspamd -f
# journalctl -u clamd@scan -f
# journalctl -u postfix -f

RHEL/Rocky Linux 계열에서 rsyslog를 사용하는 경우 Postfix 로그는 다음 파일에서도 확인할 수 있다.

# tail -f /var/log/maillog

8.3 메일 검사 흐름 확인

테스트 메일을 발송한 뒤 다음 항목을 확인한다.

  • Postfix가 SMTP 메일을 수신하는지 확인
  • Postfix가 Rspamd milter에 메일을 전달하는지 확인
  • Rspamd가 ClamAV clamd에 악성코드 검사를 요청하는지 확인
  • EICAR 탐지 시 CLAM_VIRUS 심볼이 기록되는지 확인
  • action = "reject" 설정 시 메일이 SMTP 단계에서 거부되는지 확인

9. 운영 권장 사항

DNS 및 발신 신뢰도

인터넷에 공개하는 메일 서버라면 다음 항목을 필수로 구성한다.

  • 메일 서버 FQDN의 정방향 A/AAAA 레코드
  • 공인 IP의 PTR(Reverse DNS) 레코드
  • SPF 레코드
  • DKIM 서명
  • DMARC 레코드
  • 신뢰할 수 있는 CA의 TLS 인증서

크기 제한 일관성

아래 값은 서로 일관되게 유지한다.

Postfix message_size_limit
Rspamd antivirus max_size
ClamAV StreamMaxLength
ClamAV MaxFileSize
ClamAV MaxScanSize

예를 들어 메일 최대 크기를 25MB로 운영한다면 모든 관련 설정을 25MB 이상으로 맞춘다.

SELinux

SELinux는 비활성화하지 않는다.

Rspamd·Postfix·ClamAV 연동 중 접근 거부가 발생하면 AVC 로그를 확인한다.

# ausearch -m AVC,USER_AVC -ts recent

임의로 setenforce 0을 적용하는 대신, 실제 차단 원인을 확인하고 최소 권한 정책으로 조정한다.

모니터링

다음 항목을 모니터링한다.

  • clamav-freshclam 업데이트 성공 및 실패 여부
  • clamd@scan, rspamd, postfix, dovecot 서비스 상태
  • Postfix 메일 큐 증가 여부
  • SMTP 반송률 및 인증 실패 횟수
  • Rspamd 스팸 점수와 악성코드 탐지 건수
  • 디스크 사용량: /var/spool/postfix, 메일 저장소, /var/lib/clamav



작성일: 2026년 8월 13일 ,  마지막 업데이트: 2026년 8월 13일