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: ClamAVclamd서버 주소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