
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 熟悉Clammit的安装部署
本章需要你熟悉Linux的Clammit部署,如果你尚未熟悉,可参阅如下如下章节
另外,本章也设计到Linux的go部署,如果你尚未熟悉,可参阅如下如下章节
2.1.2 部署Docker环境
本章使用如下Docker环境部署,参阅本章建议你先搭建以下Docker集群环境并熟悉,
2.1.3 准备系统镜像
In docker01
cd /data/docker/images/ docker load -i centos_centos7.3.1611.tar docker tag centos:centos7.3.1611 docker01.cmdschool.org:5000/centos:centos7.3.1611 docker push docker01.cmdschool.org:5000/centos:centos7.3.1611 docker image rm centos:centos7.3.1611
另外,安装包的离线下载请在能上网的docker环境的机器上使用如下命令,
docker pull centos:centos7.3.1611 docker save centos:centos7.3.1611 -o centos_centos7.3.1611.tar
另外,其他版本请从以下链接下载,
https://hub.docker.com/_/centos
2.1.4 下载Clammit源码包
cd ~ wget https://github.com/ifad/clammit/archive/v0.6.0.tar.gz -O clammit_v0.6.0.tar.gz
注,另外其他版本请从以下链接下载(含二进制安装包,如rpm包),
https://github.com/ifad/clammit
2.1.5 下载Go语言的二进制安装包
cd ~ wget https://dl.google.com/go/go1.14.4.linux-amd64.tar.gz
注,另外其他版本请从以下链接下载,
https://golang.org/dl/
2.2 创建Clammit镜像
2.2.1 创建镜像项目文件夹
cd ~ mkdir ~/imageProject-clammit-v0.6.0
2.2.2 创建Dockerfile
vim ~/imageProject-clammit-v0.6.0/Dockerfile
加入如下配置,
FROM docker01.cmdschool.org:5000/centos:centos7.3.1611 MAINTAINER will@cmdschool.org ################################# # Deploy Go Language ################################# COPY go1.14.4.linux-amd64.tar.gz /root WORKDIR /root RUN tar -C /usr/local/ -xf go1.14.4.linux-amd64.tar.gz ENV GOLAN_HOME=/usr/local/go ENV PATH=${GOLAN_HOME}/bin:$PATH RUN rm -r /root/go1.14.4.linux-amd64.tar.gz ################################# # Deploy Clammit ################################# # Install Tools RUN yum -y install net-tools RUN yum -y install make git # Make Before COPY clammit_v0.6.0.tar.gz /root WORKDIR /root RUN tar -xf clammit_v0.6.0.tar.gz # Make Install WORKDIR /root/clammit-0.6.0/ RUN make # Config Clammit RUN cp -a bin/clammit /bin/ RUN chmod +x /bin/clammit RUN mkdir -p /etc/clammit /var/run/clammit /var/log/clammit COPY clammit.cfg /etc/clammit/clammit.cfg # Clear Install Data WORKDIR /root RUN rm -f ./clammit_v0.6.0.tar.gz RUN rm -rf ./clammit-0.6.0/ # Config Start Scripts RUN echo '#!/bin/bash' > /root/start.sh RUN echo 'echo "Starting Clammit Server...";' >> /root/start.sh RUN echo '/bin/clammit -config /etc/clammit/clammit.cfg' >> /root/start.sh RUN chmod +x /root/start.sh EXPOSE 8438 WORKDIR /root CMD ["/bin/bash","./start.sh"]
“FROM”指令声明基于“centos7.3.1611”镜像打包
“COPY”指令声明复制当前目录的具体文件到打包的镜像
“ENV”指令声明JAVA JDK或Tigase所需的环境变量
“RUN”指令声明容器环境执行的命令
“EXPOSE ”指令声明容器使用的端口
“WORKDIR”指令声明切换容器内部的某个目录
“CMD”指令声明启动容器执行的启动服务命令
所以我们需要根据定义的文件准备需要复制的文件,
cd ~ cp clammit_v0.6.0.tar.gz ~/imageProject-clammit-v0.6.0 cp go1.14.4.linux-amd64.tar.gz ~/imageProject-clammit-v0.6.0
然后,我们需要预先准备clamav的数据库更新工具配置,
vim ~/imageProject-clammit-v0.6.0/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的响应(可选)
确认所需的文件存在,
ls ~/imageProject-clammit-v0.6.0
可见如下显示,
clammit.cfg clammit_v0.6.0.tar.gz Dockerfile go1.14.4.linux-amd64.tar.gz
2.2.3 执行打包操作
cd ~/imageProject-clammit-v0.6.0 docker build -t clammit:v0.6.0 .
以上“.”指当前目录为编译目录,编译程序会自动加载“Dockerfile”文件定义,可见如下显示,
Sending build context to Docker daemon 123.7MB Step 1/29 : FROM docker01.cmdschool.org:5000/centos:centos7.3.1611 ---> c5d48e81b986 [...] Successfully built 10ca0ce5634e Successfully tagged clammit:v0.6.0
如果镜像集群公用,还需要执行以下命令,
docker tag clammit:v0.6.0 docker01.cmdschool.org:5000/clammit:v0.6.0 docker push docker01.cmdschool.org:5000/clammit:v0.6.0 docker image rm clammit:v0.6.0
完成后,可使用如下命令查看镜像,
docker images
可见如下显示,
REPOSITORY TAG IMAGE ID CREATED SIZE docker01.cmdschool.org:5000/clammit v0.6.0 10ca0ce5634e 43 seconds ago 921MB [...]
2.2.4 测试软件运行
docker run -d --name clammit -p 8438:8438 docker01.cmdschool.org:5000/clammit:v0.6.0
以上运行容器环境后,我们使用以下命令登录容器虚拟机,
docker exec -it `docker container ls | grep 'clammit' | cut -d" " -f1 ` /bin/bash
可使用如下命令查看软件倾听的端口,
netstat -antp
可见如下显示,
Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp6 0 0 :::8438 :::* LISTEN 6/clammit
测试完成后可使用如下命令退出容器虚拟机,
exit
另外,你可以使用如下命令查询当前运行的container,
docker ps -a
可见如下显示,
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1322b1112a25 docker01.cmdschool.org:5000/clammit:v0.6.0 "/bin/bash ./start.sh" 37 seconds ago Up 36 seconds 0.0.0.0:8438->8438/tcp clammit [...]
然后可以使用如下命令停止并删除,
docker container stop 1322b1112a25 docker container rm 1322b1112a25
参阅文档
====================
没有评论