生产部署C/S模式,通过TCP使用Server端的clamd对Client进行扫描
存在的问题一:
可以从server的/var/log/clamav/clamd.log中截获对应client的主机IP信息
但是无法截获对应的文件名,%v即$CLAM_VIRUSEVENT_VIRUSNAME可以正确被解析
但是$CLAM_VIRUSEVENT_FILENAME被解析成了stream,也就是流
存在的问题二:
如果Client主机较多,且被扫描探测的目录文件较多容量较大
网络开销则会过大,同时Server本身的硬件资源也会成为瓶颈
DMZ区部署Freshclam,不起动clamd,配置病毒库文件的web共享
在该机器上配置邮件告警,收集各个主机的扫描日志进行告警
各个主机配置启动clamav和freshclam,并通过部署的DMZ区机器做病毒库升级,不再使用clamd模式
实现病毒库的公网同步到内网各个机器之间的分发
注意:经过实验,只能使用80端口进行共享
方案一不太满足生产应用,不再做实验论证,依据《CentOS6实验机模板搭建部署》克隆两台实验机进行方案二的实验
Server主机:192.168.77.10,主要做病毒库文件升级和向内共享
Client主机:192.168.77.11,可以理解为具体的各个需要被加固的业务主机
1° Server主机安装配置:
# 主机名和hosts文件配置
hostname server
sed -i "s/^HOSTNAME=.*$/HOSTNAME=$(hostname)/g" /etc/sysconfig/network
echo "$(grep -E '127|::1' /etc/hosts)">/etc/hosts
echo "$(ifconfig eth0|grep inet|awk -F'[ :]' '{print $13}') $(hostname)">>/etc/hosts
# clamav安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install clamav clamav-db
# 并不需要安装clamd
# 病毒库升级的配置文件修改配置
[email protected]
# 病毒库升级配置文件修改 /etc/freshclam.conf
sed -i 's|^#PidFile.*$|PidFile /var/run/clamav/freshclam.pid|g' /etc/freshclam.conf
sed -i 's/^#DatabaseMirror.*$/DatabaseMirror db.cn.clamav.net/g' /etc/freshclam.conf
sed -i 's/^#Checks 24$/Checks 24/g' /etc/freshclam.conf
sed -i "s|^#OnUpdateExecute.*$|\
# OnUpdateExecute /bin/echo \"升级成功\" \|/bin/mailx -s \"ClamAV升级告警\" $ALERT_EMAIL|g" \
/etc/freshclam.conf
# 可以根据需求打开病毒库升级告警
# 也可以依据《CentOS6 主机安全加固策略 Clamav 杀毒软件(二)YUM安装配置》打开升级失败告警
# 删除yum安装下载的病毒库,重新从官网同步病毒库
rm -rf /var/lib/clamav/*
freshclam
# 设置开机启动,启动守护进程模式
freshclam -d
echo '/usr/bin/freshclam -d'>>/etc/rc.local
# 扫描测试
clamscan -rzi --quiet -l /tmp/clamscan_$(date +%s).log /boot
# 使用单次扫描扫一下自己做测试
2° Server主机配置病毒库文件web共享:
# 因为是内网没有其他需求的web服务,因此直接使用yum安装nginx简单配置即可
yum -y install nginx
cat >/etc/nginx/conf.d/clamav.conf<80;
server_name $(hostname -i);
root /var/lib/clamav;
location / {
root /var/lib/clamav;
}
}
EOF
chkconfig nginx on
/etc/init.d/nginx start
# 注意,需要保证/var/lib/clamav目录下被共享的病毒库文件其他组可读,否则共享失败
# 或者修改nginx的运行系统用户为clam
# sed -i 's/user nginx;/user clam;/g' /etc/nginx/nginx.conf
# 测试
cd /tmp
wget http://192.168.77.10/bytecode.cvd
3° Client主机安装配置:
# 主机名和hosts文件配置
hostname client
sed -i "s/^HOSTNAME=.*$/HOSTNAME=$(hostname)/g" /etc/sysconfig/network
echo "$(grep -E '127|::1' /etc/hosts)">/etc/hosts
echo "$(ifconfig eth0|grep inet|awk -F'[ :]' '{print $13}') $(hostname)">>/etc/hosts
# clamav安装
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
yum -y install clamav clamav-db
# 依然并不需要安装clamd
# 病毒库升级的配置文件修改配置
# 病毒库升级配置文件修改 /etc/freshclam.conf
Server=192.168.77.10
sed -i 's|^#PidFile.*$|PidFile /var/run/clamav/freshclam.pid|g' /etc/freshclam.conf
sed -i 's/^#DatabaseMirror.*$/DatabaseMirror db.cn.clamav.net/g' /etc/freshclam.conf
sed -i 's/^#Checks 24$/Checks 24/g' /etc/freshclam.conf
sed -i "s/^#PrivateMirror.*$/PrivateMirror $Server/g" /etc/freshclam.conf
# 根据server的IP,修改对应的配置
# 测试从搭建的服务器同步病毒库文件
rm -rf /var/lib/clamav/*
freshclam
# 观察日志,查看下载机器是否为配置的Server端IP
# 设置开机启动,启动守护进程模式
freshclam -d
echo '/usr/bin/freshclam -d'>>/etc/rc.local
# 扫描测试
clamscan -rzi --quiet -l /tmp/clamscan_$(date +%s).log /boot
# 使用单次扫描扫一下自己做测试
在需要进行扫描加固的主机上部署自动扫描脚本和任务
事实上Server和Client均可部署,根据需求只部署在Client之上即可
# 自动扫描脚本
cat >/root/checkOS/clamscan.sh<-no-summary \
--cross-fs=yes \
--bytecode=yes \
--bytecode-unsigned=yes \
--detect-pua=yes \
--detect-structured=yes \
--scan-mail=yes \
--phishing-sigs=yes \
--phishing-scan-urls=yes \
--phishing-ssl=yes \
--phishing-cloak=yes \
--partition-intersection=yes \
--algorithmic-detection=yes \
--scan-pe=yes \
--scan-elf=yes \
--scan-ole2=yes \
--scan-pdf=yes \
--scan-swf=yes \
--scan-html=yes \
--scan-xmldocs=yes \
--scan-hwp3=yes \
--scan-archive=yes \
--detect-broken=yes \
--block-encrypted=yes \
--block-macros=yes \
--exclude-dir=^/proc/ \
--exclude-dir=^/sys/ \
--exclude-dir=^/dev/ \
-l /var/log/clamav/clamscan_\$(hostname -i)_\$(date +%F).log /
EOF
# 扫描的系统任务部署
chmod 700 /root/checkOS/clamscan.sh
crontab -l>/tmp/crontab.tmp
echo '# ClamAV Scan Job'>>/tmp/crontab.tmp
echo '0 0 * * * /bin/bash /root/checkOS/clamscan.sh >/dev/null 2>&1'>>/tmp/crontab.tmp
cat /tmp/crontab.tmp |crontab
rm -rf /tmp/crontab.tmp
当client无法上公网,又需要邮件告警时,此时就需要在Server端配置邮件告警和sftp专用文件传输帐户
然后client每次扫描后将扫描日志发送到Server端,由Server告警到相应邮箱
需要client能够访问server的sshd服务端口的权限
依据《CentOS6u9 简单邮件告警部署》在Server主机上部署命令邮件告警
依据《CentOS6u9 sftp专用帐户的部署加固》在Server主机上部署sftp专用帐户
1° 然后继续在Server端配置存放扫描日志的sftp目录:
# 将日志存放于/var/ftp/clamav之下:
mkdir /var/ftp/clamav
chown sftp: /var/ftp/clamav -R
chmod 755 /var/ftp/clamav -R
2° 在Client端部署脚本和自动任务,在每日扫描后将扫描日志同步到Server端的目录下:
# 安装lftp客户端
yum -y install lftp
# 传输扫描日志到server的脚本
cat >/root/checkOS/transfer.sh<#!/bin/sh
source ~/.bash_profile
HOST=192.168.77.10
USER=sftp
PASS=sftp
cd /var/log/clamav
Filename=\$(ls clamscan_\$(hostname -i)_\$(date +%F).log)
chmod 644 \${Filename}
lftp -u \${USER},\${PASS} sftp://\${HOST} <cd /clamav
put \${Filename}
bye
EOF
ALLEOF
# 扫描的日志传输系统任务部署
chmod 700 /root/checkOS/transfer.sh
crontab -l>/tmp/crontab.tmp
echo '# ClamAV Scan Log Trans Job'>>/tmp/crontab.tmp
echo '0 3 * * * /bin/bash /root/checkOS/transfer.sh >/dev/null 2>&1'>>/tmp/crontab.tmp
cat /tmp/crontab.tmp |crontab
rm -rf /tmp/crontab.tmp
3° Server端配置每日告警脚本和系统任务:
# 告警脚本如下:
cat >/root/checkOS/mailalert.sh<#!/bin/sh
source ~/.bash_profile
MailList="[email protected]"
cd /var/ftp/clamav
Filename=\$(ls clamscan_*_\$(date +%F).log)
for file in \${Filename}
do
HOST=\$(echo \$file|awk -F'_' '{print \$2}')
DATE=\$(echo \$file|awk -F'_' '{print \$3}')
cat \${file}|grep 'FOUND'>Alert_Info.txt
if [ \$(cat Alert_Info.txt|wc -l) -gt 0 ]
then
tar -czf Alert_Info.txt.tar.gz Alert_Info.txt --remove-files
for mail in \${MailList}
do
echo -e "Alert from \${HOST}\t at \${DATE}"|\
mailx -s "ClamavAlert_\$(date +%F_%T)" -a Alert_Info.txt.tar.gz \${mail}
done
fi
rm -rf Alert_Info.txt.tar.gz
done
EOF
# 邮件告警任务部署
chmod 700 /root/checkOS/mailalert.sh
crontab -l>/tmp/crontab.tmp
echo '# ClamAV Scan Mail Alert Job'>>/tmp/crontab.tmp
echo '0 4 * * * /bin/bash /root/checkOS/mailalert.sh >/dev/null 2>&1'>>/tmp/crontab.tmp
cat /tmp/crontab.tmp |crontab
rm -rf /tmp/crontab.tmp
生产部署时,Server和Client可能处于不同的网段,需要打通Client访问Server的80端口和22端口权限
要根据具体的生产需求修改自动扫描脚本的参数配置,比如擦掉对xml相关的扫描探测等
邮件告警的方案设计是基于Client无法连通功能网的情景,具体问题具体分析
如果client能够直接连通公网,直接在client上部署邮件告警即可
不必再将扫描日志经过sftp传输到Server端,由Server告警这么麻烦
如果能够配置Server端到Client端的免密码ssh登录,则病毒库同步和扫描日志同步直接走scp即可
不必再使用nginx做共享,也不必专门配置独立的sftp用户做日志传输
方案要根据生产实际情况和安全层面的考量设计
[TOC]