jasonish/docker-suricata
GitHub: jasonish/docker-suricata
将 Suricata 入侵检测/防御引擎容器化,提供多版本、多架构支持的生产级 Docker 镜像,简化网络流量监控部署。
Stars: 315 | Forks: 79
# Suricata Docker 镜像
## Docker 标签 (Suricata 版本)
- main:git master 分支的最新代码
- latest:最新发布版本 (目前为 8.0)
- 8.0:最新的 8.0 补丁发布版本
- 7.0:最新的 7.0 补丁发布版本
版本 4.1.5 及更新版本也存在特定的版本标签。
示例:
```
docker pull jasonish/suricata:latest
docker pull jasonish/suricata:7.0.11
```
不带架构(如 `amd64` 或 `arm64v8`)的标签是多架构
镜像 manifests。大多数情况下 Docker 会做正确的事,但如果
您需要拉取特定架构的镜像,可以通过
选择名称中带有架构的标签来实现,例如:
```
docker pull jasonish/suricata:latest-amd64
docker pull jasonish/suricata:6.0.4-arm64v8
```
## 备用镜像仓库
除了 Docker Hub,这些容器也被推送到 quay.io
和 ghcr.io,可以像这样拉取:
```
docker pull quay.io/jasonish/suricata:latest
```
```
docker pull ghcr.io/jasonish/suricata:latest
```
## 使用说明
您很可能希望 Suricata 运行在
您主机的一个网络接口上,而不是容器内部
通常提供的网络接口:
```
docker run --rm -it --net=host \
--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
jasonish/suricata:latest -i
```
但您可能想查看 Suricata 的日志,所以您可能想
这样启动它:
```
docker run --rm -it --net=host \
--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
-v $(pwd)/logs:/var/log/suricata \
jasonish/suricata:latest -i
```
这将把日志目录(在您当前目录中)映射到
容器中的 Suricata 日志目录,以便您可以从
容器外部查看 Suricata 日志。
## Capabilities (能力)
如果容器具备相应的权限,此容器将尝试以非 root 用户运行 Suricata。为了监控网络
接口并放弃 root 权限,容器必须具有 `sys_nice`、
`net_admin` 和 `net_raw` capabilities。如果容器检测到它
没有这些 capabilities,Suricata 将以 root 身份运行。
Docker 示例:
```
docker run --rm -it --net=host \
--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
jasonish/suricata:latest -i eth0
```
Podman 示例:
```
sudo podman run --rm -it --net=host \
--cap-add=net_admin,net_raw,sys_nice \
jasonish/suricata:latest -i eth0
```
请注意,使用 `podman` 时,添加 capabilities 是强制性的。
## 日志
目录 `/var/log/suricata` 作为卷 (volume) 暴露。另一个
容器可以使用 `--volumes-from` Docker 选项来挂载它。
例如:
- 启动 Suricata 容器并命名:
docker run -it --net=host --name=suricata jasonish/suricata -i enp3s0
- 启动第二个容器并使用 `--volumes-from`:
docker run -it --net=host --volumes-from=suricata logstash /bin/bash
这会将 Suricata 容器中的 `/var/log/suricata` 作为
Logstash 容器中的 `/var/log/suricata` 暴露出来。
## 日志轮转
在 Suricata 容器内运行 `logrotate` 会正确执行,例如:
```
docker exec CONTAINER_ID logrotate /etc/logrotate.d/suricata
```
要进行测试,logrotate 可以在强制和详细模式下运行:
```
docker exec CONTAINER_ID logrotate -vf /etc/logrotate.d/suricata
```
要自动运行 logrotate,请设置 `ENABLE_CRON=yes` 环境
变量,并在 `/etc/cron.*` 目录之一中创建具有可执行
权限的 `suricata` bash 脚本
(例如 `/etc/cron.hourly/suricata`):
```
#! /bin/bash
logrotate /etc/logrotate.d/suricata
```
此脚本可以在以此镜像为
基础的 `Dockerfile` 中创建,或者作为卷绑定挂载进去。
## 卷 (Volumes)
Suricata 容器暴露了以下卷:
- `/var/log/suricata` - Suricata 日志目录。
- `/var/lib/suricata` - 规则、Suricata-Update 缓存和其他在运行之间
可能需要保留的运行时数据。
- `/etc/suricata` - 配置目录。
如果进行绑定挂载,您可能希望容器内的 Suricata 用户
与主机系统上用户的 UID 和 GID 匹配。这可以
通过设置 PUID 和 PGID 环境变量来完成。例如:
```
docker run -e PUID=$(id -u) -e PGID=$(id -g)
```
这将导致绑定挂载的
所有者是启动 Docker 容器的用户。
## 配置
为 Suricata 提供自定义配置的最简单方法是
为配置目录 `/etc/suricata` 使用主机绑定挂载。在
容器的第一次运行时它会被填充。例如:
```
mkdir ./etc
docker run --rm -it -v $(pwd)/etc:/etc/suricata jasonish/suricata:latest -V
```
当容器退出时,`./etc` 将被填充通常在 `/etc/suricata` 中
找到的默认配置文件。
在这个目录中,可以修改 Suricata 配置,
并且可以放置 Suricata-Update 文件。只需在后续
运行 Suricata 时将其作为卷提供即可。例如:
```
docker run --rm -it --net=host \
-v $(pwd)/etc:/etc/suricata \
--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
jasonish/suricata:latest -i eth0
```
## 环境变量
### SURICATA_OPTIONS
`SURICATA_OPTIONS` 环境变量可用于将命令行
选项传递给 Suricata。例如:
```
docker run --net=host -e SURICATA_OPTIONS="-i eno1 -vvv" jasonish/suricata:latest
```
## Suricata-Update
运行 Suricata-Update 最简单的方法是在
容器运行时运行它。例如:
在一个终端中,启动 Suricata:
```
docker run --name=suricata --rm -it --net=host \
--cap-add=net_admin --cap-add=net_raw --cap-add=sys_nice \
jasonish/suricata:latest -i eth0
```
然后在另一个终端中:
```
docker exec -it --user suricata suricata suricata-update -f
```
这将执行 `suricata-update` 在同一个正在
运行 Suricata 的容器中(注意 `--name=suricata`),然后使用 `suricatasc -c reload-rules` 信号通知 Suricata
重新加载其规则。
## Raspberry Pi
此镜像可在 Raspberry Pi OS 上使用,但是由于
Raspberry Pi OS 和 Docker 之间的不兼容性,日志中的
时间戳将是错误的。针对此问题有 2 种可能的修复方法:
- 使用 Docker 的 `--privileged` 选项
- 将 Raspberry Pi OS 上的 libseccomp2 包升级到
backports 仓库中的较新版本。
## 操作指南 (HOWTOs)
### 初始化配置
在 `/etc/suricata/suricata.yaml` 处使用空卷运行将生成
默认配置文件。示例:
```
docker run --rm -it -v $(pwd)/etc:/etc/suricata jasonish/suricata:latest -V
```
这将为您留下一个包含来自容器的默认配置文件的目录。
## 构建
此仓库中的 Dockerfiles 和脚本设计为以某种自动化的
方式构建多架构容器 manifests。因此,
Dockerfiles 不能按原样使用。
如果您只想构建 x86_64 镜像,以下命令
应该有效:
```
cd 7.0
docker build --build-arg=$(cat VERSION) -f Dockerfile.amd64 .
```
对于 Arm64 镜像:
```
cd 7.0
docker build --build-arg=$(cat VERSION) -f Dockerfile.arm64 .
```
计划将 Dockerfiles 保持在无需任何包装脚本即可
直接使用的状态。
### 准备在 x86_64 上构建 ARM 镜像
```
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
```
#### 在 Arch 上
- 安装 extra/qemu-user-static-binfmt
## 许可证
此仓库中的构建脚本、Dockerfiles 和任何其他文件均采用 MIT 许可。
标签:AMSI绕过, AWS, DevSecOps, Docker, DPI, Hakrawler, IPS, JA3, Metaprompt, PB级数据处理, pcap, Suricata, 上游代理, 入侵检测系统, 入侵防御系统, 多架构支持, 威胁检测, 威胁检测与响应, 威胁猎捕, 安全数据湖, 安全运维, 安全防御评估, 容器化安全, 开源安全工具, 构建工具, 深度包检测, 现代安全运营, 网络安全, 网络安全分析, 请求拦截, 逆向工程平台, 防御绕过, 隐私保护