ARG BASE_IMAGE=debian:trixie-slim FROM ${BASE_IMAGE} ARG DEBIAN_FRONTEND=noninteractive # Keep the runtime image small: no recommends, docs, man pages or apt cache. RUN printf '%s\n' \ 'path-exclude=/usr/share/doc/*' \ 'path-exclude=/usr/share/man/*' \ 'path-exclude=/usr/share/info/*' \ 'path-exclude=/usr/share/locale/*' \ > /etc/dpkg/dpkg.cfg.d/01_nodoc \ && apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ iproute2 \ passwd \ python3 \ suricata \ suricata-update \ tini \ && if ! getent group suricata >/dev/null 2>&1; then groupadd --system suricata; fi \ && if ! id -u suricata >/dev/null 2>&1; then useradd --system --gid suricata --home-dir /var/lib/suricata --no-create-home --shell /usr/sbin/nologin suricata; fi \ && getent passwd suricata >/dev/null \ && getent group suricata >/dev/null \ && suricata --build-info >/dev/null \ && suricata-update -V \ && suricata-update update-sources \ && suricata-update \ && mkdir -p /opt/ids/vendor-rules-seed \ && cp -a /var/lib/suricata/. /opt/ids/vendor-rules-seed/ \ && apt-get clean \ && rm -rf \ /var/lib/apt/lists/* \ /var/cache/apt/* \ /usr/share/doc/* \ /usr/share/man/* \ /usr/share/info/* \ /usr/share/locale/* WORKDIR /opt/ids COPY app /opt/ids/app COPY scripts /opt/ids/scripts COPY suricata /opt/ids/suricata RUN chmod +x /opt/ids/scripts/*.sh \ && mkdir -p /data /var/log/suricata /var/lib/suricata/rules /run/suricata /tmp/suricata-build-test \ && suricata -T \ -c /etc/suricata/suricata.yaml \ -l /tmp/suricata-build-test \ -s /opt/ids/suricata/local.rules \ --set 'vars.address-groups.HOME_NET=[192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]' \ && rm -rf /tmp/suricata-build-test \ && chown -R suricata:suricata /var/log/suricata /var/lib/suricata /run/suricata ENV PYTHONUNBUFFERED=1 \ TZSP_BIND=0.0.0.0 \ TZSP_PORT=37008 \ TAP_NAME=suritap0 \ TAP_MTU=9000 \ WEB_BIND=0.0.0.0 \ WEB_PORT=8080 \ DB_PATH=/data/ids.db \ EVE_PATH=/var/log/suricata/eve.json \ SURICATA_LOCAL_RULES=/data/suricata/local.rules \ SURICATA_EXTRA_RULES_GLOB=/data/suricata/*.rules \ SURICATA_CUSTOM_RULES=/data/suricata/custom.rules \ SURICATA_THRESHOLD_CONFIG=/data/suricata/threshold.config \ ALERT_MAX_SEVERITY=2 \ ALERT_DEDUP_WINDOW_SECONDS=300 \ ALERT_IGNORE_SIDS=1000001 \ AUTO_BLOCK=false \ UPDATE_RULES_ON_START=false \ RULE_UPDATE_INTERVAL_HOURS=24 EXPOSE 37008/udp 8080/tcp HEALTHCHECK --interval=30s --timeout=5s --start-period=20s --retries=3 CMD ["python3", "/opt/ids/scripts/healthcheck.py"] ENTRYPOINT ["/usr/bin/tini", "--", "/opt/ids/scripts/entrypoint.sh"]