如何通过Clammit使Nginx变身扫毒反向代理?

Nginx

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 安装杀毒软件

如果你当前系统尚未安装,可参阅以下教程安装,

如何编译安装clamav?

2.1.4 安装GO语言

如果你当前系统尚未安装,可参阅以下教程安装,

如何安装部署二进制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,请参阅以下章节部署,

如何安装配置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 测试反向代理的病毒检测能力

请从以下权威机构页面下载标准病毒码并上传到测试(请看清楚官方的说明再下载),

Download Anti Malware Testfile


注:建议使用一台无杀毒软件的客户下载病毒病上传测试,测试完成可以销毁此机器

参阅文档
====================

官方gitHub
————–
https://github.com/ifad/clammit

没有评论

发表回复

Nginx
如何解决https请求不安全http页被阻止问题?

1 前言 一个问题,一篇文章,一出故事。 笔者最近代理公司应用,发现https的页面有请求不安全的h …

Reverse Proxy
如何解决Nginx代理丢失Cookies问题?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …

Nginx
如何Nginx代理上游的子项目或文件夹?

1 前言 一个问题,一篇文章,一出故事。 笔者接到任务需要把Tomcat的其中一个应用号使用Ngin …