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 \ && printf '%s\n' 'deb http://deb.debian.org/debian trixie-backports main' > /etc/apt/sources.list.d/trixie-backports.list \ && apt-get update \ && apt-get install -y --no-install-recommends \ ca-certificates \ iproute2 \ passwd \ python3 \ redis-server \ suricata-update \ tini \ && apt-get install -y --no-install-recommends -t trixie-backports suricata \ && 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 \ --include /opt/ids/suricata/ids-output.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]' \ --set 'app-layer.protocols.tls.ja3-fingerprints=yes' \ --set 'app-layer.protocols.tls.ja4-fingerprints=yes' \ --set 'app-layer.protocols.ssh.hassh=yes' \ && 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=/data/logs/suricata/eve.json \ SURICATA_LOG_MAX_MB=512 \ SURICATA_OUTPUT_CONFIG=/opt/ids/suricata/ids-output.yaml \ 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 \ SURICATA_PERSIST_LIB_DIR=/data/lib/suricata \ ALERT_MAX_SEVERITY=2 \ ALERT_DEDUP_WINDOW_SECONDS=300 \ ALERT_IGNORE_SIDS=1000001 \ ADMIN_USERNAME=admin \ ADMIN_PASSWORD= \ SESSION_HOURS=168 \ SESSION_COOKIE_SECURE=false \ ANALYTICS_SNAPSHOT_INTERVAL_SECONDS=60 \ AUTO_BLOCK=false \ UPDATE_RULES_ON_START=false \ RULE_UPDATE_INTERVAL_HOURS=24 \ REDIS_URL=redis://127.0.0.1:6379/0 \ REDIS_MANAGED=true \ REDIS_DATA_DIR=/data/redis \ REDIS_PORT=6379 \ REDIS_MAXMEMORY_MB=0 \ REDIS_SNAPSHOT_SECONDS=1800 \ REDIS_AOF=true \ TRAFFIC_RETENTION_HOURS=24 \ TRAFFIC_MAX_EVENTS=0 \ TRAFFIC_MEMORY_EVENTS=0 \ WEBSOCKET_QUEUE_SIZE=512 \ LIVE_FLOW_UPDATE_SECONDS=2.0 \ NDR_ENABLED=true \ NDR_CORRELATION_WINDOW_SECONDS=1800 \ BEHAVIOR_MIN_OBSERVATIONS=50 \ NDR_AUTO_BLOCK=false \ NDR_AUTO_BLOCK_RISK=92 \ ROUTEROS_INVENTORY_INTERVAL_SECONDS=300 \ NOTIFY_MIN_RISK=80 \ NOTIFY_TIMEOUT_SECONDS=5 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"]