1 基础知识
1.1 Clammit的介绍
- Clammit具备整合(集成)nginx与clamav的能力,使Nginx变身为具有杀毒能力的反向代理
- Clammit是一个HTTP病毒扫描检测代理(可以理解为具有病毒检测能力的反向代理)
- Clammit工作于Web客户端与Web应用服务器之间(相当于反向代理)
- Clammit本身并没有病毒扫描能力,其依靠调用ClamAV(clamd)来完成扫描并返回HTTP响应码
1.2 Clammit的工作原理
- Clammit通过代理服务端的应用向Web客户端提供HTTP页面或接口
- Clammit接收到Web客户端提交的HTTP请求(包括上传的文件)
- Clammit则调用ClamAV对上传的HTTP请求进行病毒扫描
- Clammit如果发现病毒,则会立即拒绝上传的HTTP请求并返回异常响应码(418)
- Clammit如果没发现病毒,则将HTTP请求转发给上游Web应用服务器并返回正常的响应码
1.3 Clammit程序设计架构
- 转发器(forwarder/forwarder.go)接收来自Web客户的HTTP请求
- 转发器下载请求正文(至少使用两次)
- 转发器将请求传递给拦截器(clam_interceptor.go)
- 拦截器定位表单数据并自动发送(方法包括POST/PUT/PATCH)到clamd
- 如果clamd返回假则文件包含病毒,拦截器将编写异常HTTP响应码并返回给Web客户端同时停止调用转发器
- 如果clamd返回真则文件正常,则转发器构造一个新的HTTP请求发给Web服务端并向Web客户端返回正常响应
2 最佳实践
2.1 安装前的准备
2.1.1 系统环境
OS = CentOS 8.x x86_64
Host Name = any
IP Address = 10.168.0.80
2.1.2 部署编译环境
yum -y install make git
2.1.3 安装杀毒软件
如果你当前系统尚未安装,可参阅以下教程安装,
2.1.4 安装GO语言
如果你当前系统尚未安装,可参阅以下教程安装,
2.1.5 下载软件包
cd ~ wget https://github.com/ifad/clammit/archive/v0.6.0.tar.gz -O clammit_v0.6.0.tar.gz
2.1.6 解压软件包
cd ~ tar -xf clammit_v0.6.0.tar.gz
2.2 配置clammit代理
2.2.1 编译安装包
cd ~/clammit-0.6.0/ make
2.2.2 部署安装包
cd ~/clammit-0.6.0/ cp -a bin/clammit /bin/ chmod +x /bin/clammit
2.2.3 创建运行用户
groupadd -g 499 clammit useradd -u 499 -g 499 -d /var/lib/clammit -s /sbin/nologin -c "clammit Anti Virus proxy" clammit
2.2.4 部署配置文件
mkdir -p /etc/clammit cd ~/clammit-0.6.0 cp clammit.cfg.example /etc/clammit/clammit.cfg vim /etc/clammit/clammit.cfg
修配置如下,
[ application ] listen = :8438 application-url = https://wenku.baidu.com/ clamd-url = tcp://localhost:3310 log-file = /var/log/clammit/clammit.log debug = true test-pages = true
- 变量“listen”声明clammit服务倾听端口,例如“:8438”
- 变量“application-url”声明要代理的应用地址,如代理百度文库为例,则值设置为“https://wenku.baidu.com/”(可选)
- 变量“clamd-url”声明ClamdAV的服务倾听地址
- 变量“log-file”声明clammit日志文件的路径(可选)
- 变量“test-pages”为“true”则声明由clammit提供一个上传测试页面(可选)
- 变量“debug”为“true”则声明为开启调试模式(可选)
- 变量“debug-clam”为“true”则声明记录来自ClamAV的响应(可选)
我们需要根据配置文件的需求创建目录,
mkdir -p /var/run/clammit /var/log/clammit chown clammit:clammit /var/run/clammit /var/log/clammit
2.2.5 手动测试服务启动
sudo -u clammit clammit -config /etc/clammit/clammit.cfg
执行完毕后,建议你使用如下命令确认服务启动,
pgrep -u clammit clammit -a
可见如下显示,
20172 clammit -config /etc/clammit/clammit.cfg
服务启动后,基于调试的目的,你可以选择开放服务端口用于调试(外网不建议开放),
firewall-cmd --permanent --add-port 8438/tcp firewall-cmd --reload firewall-cmd --list-all
然后,可以使用浏览器测试代理是否正常,
http://10.168.0.80:8438
注:以上如果能正常显示百度文库的页面则正常
另外,如果测试如下接口,
http://10.168.0.80:8438/clammit
可见如下返回值,
{"clammit_version":"master","scan_server_url":"tcp://localhost:3310","ping_result":"Connected to server OK","scan_server_version":"ClamAV 0.102.3/25857/Sun Jun 28 09:28:36 2020","test_scan_virus":"Status: FOUND; Virus: true; Description: Win.Test.EICAR_HDB-1","test_scan_clean":"Status: CLEAN; Virus: false"}
另外开一个终端,并使用以下命令优雅退出进程,
kill `pgrep -u clammit clammit`
2.2.6 配置服务控制脚本
vim /lib/systemd/system/clammit.service
加入如下配置,
[Unit] Description=clammit manager After=clamd.service Documentation=https://github.com/ifad/clammit [Service] Type=forking ExecStartPre=/bin/bash -c "mkdir -p /var/run/clammit; chown clammit:clammit /var/run/clammit" ExecStart=/bin/sh -c '/usr/bin/sudo -u clammit clammit -config /etc/clammit/clammit.cfg &' ExecStop=/bin/sh -c 'kill `pgrep -u clammit clammit`' Restart=on-success [Install] WantedBy=multi-user.target
修改完成后,你需要使用如下命令重载脚本,
systemctl daemon-reload
尝试启动服务,
systemctl start clammit.service
另外,如果遇到启动报错,你需要按照提示使用如下命令查看错误提示,
journalctl -xe
如果提示SELinxu问题,建议你通过如下命令反复尝试添加所需的SELinux规则,
setsebool -P domain_can_mmap_files 1 ausearch -c '(sudo)' --raw | audit2allow -M my-sudo semodule -X 300 -i my-sudo.pp
或者你可以选择关闭SELinux,
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config setenforce 0
正常启动后,使用如下命令配置服务默认启动,
systemctl enable clammit.service
2.3 使用Nginx代理clammit
2.3.1 安装Nginx
如果你尚未安装Nginx,请参阅以下章节部署,
2.3.2 配置clammit
cp /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/clammit.conf vim /etc/nginx/conf.d/clammit.conf
配置修改如下,
server { listen 80; listen [::]:80; server_name clammit.cmdschool.org; location / { proxy_set_header Host $http_host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://localhost:8438/; } error_page 500 502 503 504 /500.html; client_max_body_size 4G; keepalive_timeout 10; }
2.3.3 重载或重启使服务生效
systemctl reload nginx.service
2.3.4 尝试访问反向代理服务
notepad \Windows\System32\drivers\etc\hosts
加入如下临时的名称解析配置,
10.168.0.80 clammit.cmdschool.org
配置完成后,可使用如下链接测试,
http://clammit.cmdschool.org
注:百度文库只是作为一个代理应用的范例说明(尽管你无法完成上传测试O(∩_∩)O哈哈~,你可以使用其他应用替换并测试杀毒功能)
2.3.5 测试反向代理的病毒检测能力
请从以下权威机构页面下载标准病毒码并上传到测试(请看清楚官方的说明再下载),
注:建议使用一台无杀毒软件的客户下载病毒病上传测试,测试完成可以销毁此机器
参阅文档
====================
官方gitHub
————–
https://github.com/ifad/clammit
没有评论