diff --git a/.env b/.env index e028f206..2e783ae2 100755 --- a/.env +++ b/.env @@ -1,3 +1,4 @@ WAZUH_VERSION=5.0.0 WAZUH_IMAGE_VERSION=5.0.0 WAZUH_REGISTRY=docker.io +IMAGE_TAG=5.0.0 diff --git a/build-docker-images/build-images.sh b/build-docker-images/build-images.sh index ea4a6677..213cd068 100755 --- a/build-docker-images/build-images.sh +++ b/build-docker-images/build-images.sh @@ -166,52 +166,23 @@ build() { fi - # Function to get component-specific commit reference - get_component_commit() { - local component=$1 - case "${component}" in - wazuh-indexer) - echo "${INDEXER_COMMIT}" - ;; - wazuh-manager) - echo "${MANAGER_COMMIT}" - ;; - wazuh-dashboard) - echo "${DASHBOARD_COMMIT}" - ;; - wazuh-agent) - echo "${AGENT_COMMIT}" - ;; - *) - echo "" - ;; - esac - } - - # Global env file (without IMAGE_TAG - will be component-specific) + # Write the global .env file used by deployment compose files. + # IMAGE_TAG here reflects a non-dev, non-per-component tag for reference. + local base_tag="${WAZUH_IMAGE_VERSION}${WAZUH_DEV_STAGE:+-${WAZUH_DEV_STAGE,,}}" echo WAZUH_VERSION=$WAZUH_IMAGE_VERSION > ../.env echo WAZUH_IMAGE_VERSION=$WAZUH_IMAGE_VERSION >> ../.env echo WAZUH_REGISTRY=$WAZUH_REGISTRY >> ../.env + echo IMAGE_TAG=${base_tag} >> ../.env set -a source ../.env source ./artifacts_env.txt set +a - # Define all available components - local all_components=("wazuh-indexer" "wazuh-manager" "wazuh-dashboard" "wazuh-agent") - local components_to_build=() - - # Determine which components to build - if [ -z "${WAZUH_COMPONENT}" ]; then - echo "No component specified. Building all components..." - components_to_build=("${all_components[@]}") - else - # Validate component + # Validate component if a specific one was requested. + if [ -n "${WAZUH_COMPONENT}" ]; then case "${WAZUH_COMPONENT}" in - wazuh-indexer|wazuh-manager|wazuh-dashboard|wazuh-agent) - components_to_build=("${WAZUH_COMPONENT}") - ;; + wazuh-indexer|wazuh-manager|wazuh-dashboard|wazuh-agent) ;; *) echo "Error: Unknown component '${WAZUH_COMPONENT}'" >&2 clean 1 @@ -219,77 +190,50 @@ build() { esac fi - # Determine build command and base options + # Generate per-component image tags. + # The commit suffix is only appended when --dev is passed. This ensures: + # dev=false, tag=5.0.0 → 5.0.0 + # dev=false, tag=5.0.0-beta1 → 5.0.0-beta1 + # dev=true, tag=5.0.0 → 5.0.0-latest + # dev=true, tag=5.0.0-beta1 → 5.0.0-beta1-latest + make_tag() { + local commit=$1 + if [ -n "${IS_DEV_BUILD}" ]; then + echo "${WAZUH_IMAGE_VERSION}${WAZUH_DEV_STAGE:+-${WAZUH_DEV_STAGE,,}}-${commit}" + else + echo "${base_tag}" + fi + } + + export WAZUH_VERSION="$WAZUH_IMAGE_VERSION" + export INDEXER_TAG=$(make_tag "${INDEXER_COMMIT:-latest}") + export MANAGER_TAG=$(make_tag "${MANAGER_COMMIT:-latest}") + export DASHBOARD_TAG=$(make_tag "${DASHBOARD_COMMIT:-latest}") + export AGENT_TAG=$(make_tag "${AGENT_COMMIT:-latest}") + + echo "Image tags:" + echo " wazuh-indexer: ${WAZUH_REGISTRY}/wazuh/wazuh-indexer:${INDEXER_TAG}" + echo " wazuh-manager: ${WAZUH_REGISTRY}/wazuh/wazuh-manager:${MANAGER_TAG}" + echo " wazuh-dashboard: ${WAZUH_REGISTRY}/wazuh/wazuh-dashboard:${DASHBOARD_TAG}" + echo " wazuh-agent: ${WAZUH_REGISTRY}/wazuh/wazuh-agent:${AGENT_TAG}" + + # Bake options: --push for multi-arch (can't load multi-platform locally), + # --load for single-arch (stores image in local Docker daemon). + local bake_opts="--no-cache" if [ "${MULTIARCH}" ]; then - build_cmd="docker buildx build --platform linux/amd64,linux/arm64 --push --no-cache" + bake_opts="${bake_opts} --push" else - build_cmd="docker build --no-cache" + bake_opts="${bake_opts} --load" fi - # Build each component - for component in "${components_to_build[@]}"; do - echo "Building ${component} image..." - - # Get component-specific commit reference - COMPONENT_COMMIT=$(get_component_commit "${component}") - - # Generate component-specific IMAGE_TAG. - # The commit suffix is only appended when --dev was passed, which maps - # directly to inputs.dev=true in the workflow. This ensures: - # dev=false, tag=5.0.0 → 5.0.0 - # dev=false, tag=5.0.0-beta1 → 5.0.0-beta1 - # dev=true, tag=5.0.0 → 5.0.0-latest - # dev=true, tag=5.0.0-beta1 → 5.0.0-beta1-latest - if [ -n "${IS_DEV_BUILD}" ]; then - IMAGE_TAG="${WAZUH_IMAGE_VERSION}${WAZUH_DEV_STAGE:+-${WAZUH_DEV_STAGE,,}}-${COMPONENT_COMMIT}" - else - IMAGE_TAG="${WAZUH_IMAGE_VERSION}${WAZUH_DEV_STAGE:+-${WAZUH_DEV_STAGE,,}}" - fi - echo "Using IMAGE_TAG: ${IMAGE_TAG} for ${component}" - export IMAGE_TAG="$IMAGE_TAG" - - # Build common args (used by all components) - build_args=( - -t "${WAZUH_REGISTRY}/wazuh/${component}:${IMAGE_TAG}" - --build-arg WAZUH_VERSION="${WAZUH_IMAGE_VERSION}" - ) - - # Add component-specific args - case "${component}" in - wazuh-indexer) - build_args+=( - --build-arg wazuh_indexer_x86_64_rpm="${wazuh_indexer_x86_64_rpm}" - --build-arg wazuh_indexer_aarch64_rpm="${wazuh_indexer_aarch64_rpm}" - --build-arg wazuh_certs_tool="${wazuh_certs_tool}" - --build-arg wazuh_config_yml="${wazuh_config_yml}" - ) - ;; - wazuh-manager) - build_args+=( - --build-arg wazuh_manager_x86_64_rpm="${wazuh_manager_x86_64_rpm}" - --build-arg wazuh_manager_aarch64_rpm="${wazuh_manager_aarch64_rpm}" - ) - ;; - wazuh-dashboard) - build_args+=( - --build-arg wazuh_dashboard_x86_64_rpm="${wazuh_dashboard_x86_64_rpm}" - --build-arg wazuh_dashboard_aarch64_rpm="${wazuh_dashboard_aarch64_rpm}" - --build-arg wazuh_certs_tool="${wazuh_certs_tool}" - --build-arg wazuh_config_yml="${wazuh_config_yml}" - ) - ;; - wazuh-agent) - build_args+=( - --build-arg wazuh_agent_x86_64_rpm="${wazuh_agent_x86_64_rpm}" - --build-arg wazuh_agent_aarch64_rpm="${wazuh_agent_aarch64_rpm}" - ) - ;; - esac - - # Execute build - $build_cmd "${build_args[@]}" ${component}/ || clean 1 - echo "${component} image built successfully!" - done + # Build a specific component or the full default group (all 4 in parallel). + if [ -z "${WAZUH_COMPONENT}" ]; then + echo "Building all components in parallel..." + docker buildx bake ${bake_opts} -f docker-bake.hcl || clean 1 + else + echo "Building ${WAZUH_COMPONENT}..." + docker buildx bake ${bake_opts} -f docker-bake.hcl "${WAZUH_COMPONENT}" || clean 1 + fi echo "" echo "Image build process completed!" diff --git a/build-docker-images/build-images.yml b/build-docker-images/build-images.yml index 6e6aa357..fc96614f 100644 --- a/build-docker-images/build-images.yml +++ b/build-docker-images/build-images.yml @@ -1,4 +1,12 @@ # Wazuh App Copyright (C) 2017, Wazuh Inc. (License GPLv2) +# +# Build-only compose file for `docker compose build`. +# Only `build` and `image` keys are relevant here; all runtime configuration +# (ports, volumes, environment, depends_on, etc.) belongs in the deployment +# compose files under single-node/ or multi-node/. +# +# For parallel builds and full multi-arch support, prefer docker-bake.hcl: +# docker buildx bake -f docker-bake.hcl services: wazuh.manager: build: @@ -10,23 +18,6 @@ services: wazuh_certs_tool: ${wazuh_certs_tool} wazuh_config_yml: ${wazuh_config_yml} image: ${WAZUH_REGISTRY}/wazuh/wazuh-manager:${IMAGE_TAG} - hostname: wazuh.manager - restart: always - ports: - - "1514:1514" - - "1515:1515" - - "514:514/udp" - - "55000:55000" - environment: - - INDEXER_URL=https://wazuh.indexer:9200 - - INDEXER_USERNAME=admin - - INDEXER_PASSWORD=admin - volumes: - - wazuh_api_configuration:/var/wazuh-manager/api/configuration - - wazuh_etc:/var/wazuh-manager/etc - - wazuh_logs:/var/wazuh-manager/logs - - wazuh_queue:/var/wazuh-manager/queue - - wazuh_var_multigroups:/var/wazuh-manager/var/multigroups wazuh.agent: build: @@ -36,8 +27,6 @@ services: wazuh_agent_x86_64_rpm: ${wazuh_agent_x86_64_rpm} wazuh_agent_aarch64_rpm: ${wazuh_agent_aarch64_rpm} image: ${WAZUH_REGISTRY}/wazuh/wazuh-agent:${IMAGE_TAG} - hostname: wazuh.agent - restart: always wazuh.indexer: build: @@ -49,19 +38,6 @@ services: wazuh_certs_tool: ${wazuh_certs_tool} wazuh_config_yml: ${wazuh_config_yml} image: ${WAZUH_REGISTRY}/wazuh/wazuh-indexer:${IMAGE_TAG} - hostname: wazuh.indexer - restart: always - ports: - - "9200:9200" - environment: - - "OPENSEARCH_JAVA_OPTS=-Xms512m -Xmx512m" - ulimits: - memlock: - soft: -1 - hard: -1 - nofile: - soft: 65536 - hard: 65536 wazuh.dashboard: build: @@ -73,26 +49,4 @@ services: wazuh_certs_tool: ${wazuh_certs_tool} wazuh_config_yml: ${wazuh_config_yml} image: ${WAZUH_REGISTRY}/wazuh/wazuh-dashboard:${IMAGE_TAG} - hostname: wazuh.dashboard - restart: always - ports: - - 443:443 - environment: - - INDEXER_USERNAME=admin - - INDEXER_PASSWORD=admin - - SERVER_SSL_ENABLED=false - - WAZUH_API_URL=https://wazuh.manager - depends_on: - - wazuh.indexer - links: - - wazuh.indexer:wazuh.indexer - - wazuh.manager:wazuh.manager - -volumes: - wazuh_api_configuration: - wazuh_etc: - wazuh_logs: - wazuh_queue: - wazuh_var_multigroups: - wazuh_active_response: diff --git a/build-docker-images/docker-bake.hcl b/build-docker-images/docker-bake.hcl new file mode 100644 index 00000000..d27b79ca --- /dev/null +++ b/build-docker-images/docker-bake.hcl @@ -0,0 +1,108 @@ +# Wazuh Docker Copyright (C) 2017, Wazuh Inc. (License GPLv2) +# +# Docker Buildx Bake file. +# Builds all Wazuh component images in parallel. +# +# Usage: +# docker buildx bake # build all (local, single-arch) +# docker buildx bake wazuh-manager # build one component +# docker buildx bake --push # push to registry after build +# +# Variables are read automatically from the environment (see build-images.sh). + +# ── Global variables ────────────────────────────────────────────────────────── + +variable "WAZUH_VERSION" { default = "5.0.0" } +variable "WAZUH_REGISTRY" { default = "docker.io" } + +# Set IMAGE_TAG externally to override; defaults to WAZUH_VERSION. +variable "IMAGE_TAG" { default = WAZUH_VERSION } + +# MULTIARCH: set to a non-empty value to build linux/amd64 + linux/arm64. +variable "MULTIARCH" { default = "" } + +# Per-component tags — all default to IMAGE_TAG. +# In dev builds the shell script sets each one independently to append the +# per-component commit ref (e.g. MANAGER_TAG=5.0.0-beta1-abc1234). +variable "INDEXER_TAG" { default = IMAGE_TAG } +variable "MANAGER_TAG" { default = IMAGE_TAG } +variable "DASHBOARD_TAG" { default = IMAGE_TAG } +variable "AGENT_TAG" { default = IMAGE_TAG } + +# ── Artifact URL variables ──────────────────────────────────────────────────── +# Populated by build-images.sh from artifacts_env.txt (sourced into env). + +variable "wazuh_indexer_x86_64_rpm" { default = "" } +variable "wazuh_indexer_aarch64_rpm" { default = "" } +variable "wazuh_manager_x86_64_rpm" { default = "" } +variable "wazuh_manager_aarch64_rpm" { default = "" } +variable "wazuh_dashboard_x86_64_rpm" { default = "" } +variable "wazuh_dashboard_aarch64_rpm" { default = "" } +variable "wazuh_agent_x86_64_rpm" { default = "" } +variable "wazuh_agent_aarch64_rpm" { default = "" } +variable "wazuh_certs_tool" { default = "" } +variable "wazuh_config_yml" { default = "" } + +# ── Default group: builds all components ───────────────────────────────────── + +group "default" { + targets = ["wazuh-indexer", "wazuh-manager", "wazuh-dashboard", "wazuh-agent"] +} + +# ── Shared base target ──────────────────────────────────────────────────────── +# All component targets inherit from here. Not built directly. + +target "_common" { + platforms = MULTIARCH != "" ? ["linux/amd64", "linux/arm64"] : ["linux/amd64"] + args = { + WAZUH_VERSION = WAZUH_VERSION + } +} + +# ── Component targets ───────────────────────────────────────────────────────── + +target "wazuh-indexer" { + inherits = ["_common"] + context = "wazuh-indexer/" + tags = ["${WAZUH_REGISTRY}/wazuh/wazuh-indexer:${INDEXER_TAG}"] + args = { + wazuh_indexer_x86_64_rpm = wazuh_indexer_x86_64_rpm + wazuh_indexer_aarch64_rpm = wazuh_indexer_aarch64_rpm + wazuh_certs_tool = wazuh_certs_tool + wazuh_config_yml = wazuh_config_yml + } +} + +target "wazuh-manager" { + inherits = ["_common"] + context = "wazuh-manager/" + tags = ["${WAZUH_REGISTRY}/wazuh/wazuh-manager:${MANAGER_TAG}"] + args = { + wazuh_manager_x86_64_rpm = wazuh_manager_x86_64_rpm + wazuh_manager_aarch64_rpm = wazuh_manager_aarch64_rpm + wazuh_certs_tool = wazuh_certs_tool + wazuh_config_yml = wazuh_config_yml + } +} + +target "wazuh-dashboard" { + inherits = ["_common"] + context = "wazuh-dashboard/" + tags = ["${WAZUH_REGISTRY}/wazuh/wazuh-dashboard:${DASHBOARD_TAG}"] + args = { + wazuh_dashboard_x86_64_rpm = wazuh_dashboard_x86_64_rpm + wazuh_dashboard_aarch64_rpm = wazuh_dashboard_aarch64_rpm + wazuh_certs_tool = wazuh_certs_tool + wazuh_config_yml = wazuh_config_yml + } +} + +target "wazuh-agent" { + inherits = ["_common"] + context = "wazuh-agent/" + tags = ["${WAZUH_REGISTRY}/wazuh/wazuh-agent:${AGENT_TAG}"] + args = { + wazuh_agent_x86_64_rpm = wazuh_agent_x86_64_rpm + wazuh_agent_aarch64_rpm = wazuh_agent_aarch64_rpm + } +} diff --git a/build-docker-images/wazuh-agent/Dockerfile b/build-docker-images/wazuh-agent/Dockerfile index 302c8125..6239d179 100644 --- a/build-docker-images/wazuh-agent/Dockerfile +++ b/build-docker-images/wazuh-agent/Dockerfile @@ -1,10 +1,13 @@ # Wazuh Docker Copyright (C) 2017, Wazuh Inc. (License GPLv2) -FROM amazonlinux:2023 -RUN rm /bin/sh && ln -s /bin/bash /bin/sh +################################################################################ +# Build stage 0 (builder): +# Install Wazuh Agent RPM and download tini (static PID-1 init shim). +################################################################################ +FROM amazonlinux:2023 AS builder ARG WAZUH_VERSION -ARG S6_VERSION="v2.2.0.3" +ARG TINI_VERSION="v0.19.0" ARG WAZUH_MANAGER='CHANGE_MANAGER_IP' ARG WAZUH_REGISTRATION_SERVER='CHANGE_ENROLL_IP' ARG WAZUH_AGENT_NAME='CHANGE_AGENT_NAME' @@ -16,19 +19,51 @@ RUN RPM_ARCH="x86_64" && \ if [ "${TARGETARCH}" = "arm64" ]; then RPM_ARCH="aarch64"; fi && \ URL_VAR="wazuh_agent_${RPM_ARCH}_rpm" && \ agent_url="${!URL_VAR}" && \ - dnf install curl-minimal tar gzip procps -y &&\ + dnf install curl-minimal tar gzip procps shadow-utils -y && \ curl -o /wazuh-agent.rpm "${agent_url}" && \ dnf install /wazuh-agent.rpm -y && \ rm -rf /wazuh-agent.rpm && \ dnf clean all && \ - sed -i '//d' /var/ossec/etc/ossec.conf && \ - S6_ARCH="amd64" && \ - if [ "${TARGETARCH}" = "arm64" ]; then S6_ARCH="aarch64"; fi && \ - curl --fail --silent -L https://github.com/just-containers/s6-overlay/releases/download/${S6_VERSION}/s6-overlay-${S6_ARCH}.tar.gz \ - -o /tmp/s6-overlay-${S6_ARCH}.tar.gz && \ - tar xzf /tmp/s6-overlay-${S6_ARCH}.tar.gz -C / --exclude="./bin" && \ - tar xzf /tmp/s6-overlay-${S6_ARCH}.tar.gz -C /usr ./bin && \ - rm /tmp/s6-overlay-${S6_ARCH}.tar.gz + sed -i '//d' /var/ossec/etc/ossec.conf + +# Download tini static binary (no external library dependencies) +RUN TINI_ARCH="amd64" && \ + if [ "${TARGETARCH}" = "arm64" ]; then TINI_ARCH="arm64"; fi && \ + curl --fail --silent -L \ + https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-${TINI_ARCH} \ + -o /usr/local/bin/tini && \ + chmod +x /usr/local/bin/tini + +################################################################################ +# Build stage 1 (the actual Wazuh Agent image): +# Copy Wazuh Agent and tini from builder. Install only runtime dependencies. +################################################################################ +FROM amazonlinux:2023 + +RUN rm /bin/sh && ln -s /bin/bash /bin/sh + +# Install only runtime dependencies +RUN dnf install procps shadow-utils -y && \ + dnf clean all && \ + getent group wazuh || groupadd -r -g 999 wazuh && \ + getent passwd wazuh || useradd --system \ + --uid 999 \ + --no-create-home \ + --home-dir /var/ossec \ + --gid wazuh \ + --shell /sbin/nologin \ + wazuh + +# Copy Wazuh Agent installation from builder +COPY --from=builder /var/ossec /var/ossec + +# Copy tini static binary +COPY --from=builder /usr/local/bin/tini /usr/local/bin/tini + +# Copy entrypoint and init scripts +COPY config/entrypoint.sh /entrypoint.sh COPY config/etc/ /etc/ -ENTRYPOINT [ "/init" ] +RUN chmod 755 /entrypoint.sh + +ENTRYPOINT ["/usr/local/bin/tini", "--", "/entrypoint.sh"] diff --git a/build-docker-images/wazuh-agent/config/entrypoint.sh b/build-docker-images/wazuh-agent/config/entrypoint.sh new file mode 100644 index 00000000..1e479595 --- /dev/null +++ b/build-docker-images/wazuh-agent/config/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Wazuh Docker Copyright (C) 2017, Wazuh Inc. (License GPLv2) + +# Run initialization and configuration +bash /etc/cont-init.d/0-wazuh-init + +# Start Wazuh Agent (may log warnings if manager address is not configured) +bash /etc/cont-init.d/1-agent + +# Tail the main log to stdout so Docker captures it +tail -F /var/ossec/logs/ossec.log & +TAIL_PID=$! + +# Graceful shutdown: stop Wazuh and exit cleanly on SIGTERM/SIGINT +_stop() { + echo "Stopping Wazuh Agent..." + /var/ossec/bin/wazuh-control stop 2>/dev/null || true + kill "${TAIL_PID}" 2>/dev/null || true +} +trap _stop SIGTERM SIGINT SIGQUIT + +wait "${TAIL_PID}" diff --git a/build-docker-images/wazuh-agent/config/etc/cont-init.d/0-wazuh-init b/build-docker-images/wazuh-agent/config/etc/cont-init.d/0-wazuh-init index 27dfbf88..c7802236 100644 --- a/build-docker-images/wazuh-agent/config/etc/cont-init.d/0-wazuh-init +++ b/build-docker-images/wazuh-agent/config/etc/cont-init.d/0-wazuh-init @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv bash +#!/bin/bash # Wazuh App Copyright (C) 2017, Wazuh Inc. (License GPLv2) WAZUH_INSTALL_PATH=/var/ossec diff --git a/build-docker-images/wazuh-agent/config/etc/cont-init.d/1-agent b/build-docker-images/wazuh-agent/config/etc/cont-init.d/1-agent index 076ac6ce..74a6818f 100644 --- a/build-docker-images/wazuh-agent/config/etc/cont-init.d/1-agent +++ b/build-docker-images/wazuh-agent/config/etc/cont-init.d/1-agent @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv bash +#!/bin/bash ############################################################################## # Migration sequence diff --git a/build-docker-images/wazuh-agent/config/etc/services.d/ossec-logs/run b/build-docker-images/wazuh-agent/config/etc/services.d/ossec-logs/run index e96cba8f..65065c21 100644 --- a/build-docker-images/wazuh-agent/config/etc/services.d/ossec-logs/run +++ b/build-docker-images/wazuh-agent/config/etc/services.d/ossec-logs/run @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv sh +#!/bin/sh # dumping ossec.log to standard output exec tail -F /var/ossec/logs/ossec.log diff --git a/build-docker-images/wazuh-manager/Dockerfile b/build-docker-images/wazuh-manager/Dockerfile index 553eb368..5ef48c2d 100644 --- a/build-docker-images/wazuh-manager/Dockerfile +++ b/build-docker-images/wazuh-manager/Dockerfile @@ -1,53 +1,88 @@ # Wazuh Docker Copyright (C) 2017, Wazuh Inc. (License GPLv2) -FROM amazonlinux:2023 -RUN rm /bin/sh && ln -s /bin/bash /bin/sh +################################################################################ +# Build stage 0 (builder): +# Install Wazuh Manager RPM, configure directories, prepare permanent data, +# and download tini (static PID-1 init shim). +################################################################################ +FROM amazonlinux:2023 AS builder ARG WAZUH_VERSION -ARG S6_VERSION="v2.2.0.3" +ARG TINI_VERSION="v0.19.0" ARG TARGETARCH ARG wazuh_manager_x86_64_rpm ARG wazuh_manager_aarch64_rpm +# Prepare permanent data config needed by permanent_data.sh at build time +COPY config/permanent_data.env config/permanent_data.sh / + RUN RPM_ARCH="x86_64" && \ if [ "${TARGETARCH}" = "arm64" ]; then RPM_ARCH="aarch64"; fi && \ URL_VAR="wazuh_manager_${RPM_ARCH}_rpm" && \ manager_url="${!URL_VAR}" && \ - dnf install curl-minimal xz gnupg tar gzip openssl findutils procps -y &&\ + dnf install curl-minimal xz gnupg tar gzip openssl findutils procps shadow-utils -y && \ dnf clean all && \ curl -o /wazuh-manager.rpm "${manager_url}" && \ dnf install /wazuh-manager.rpm -y && \ rm -rf /wazuh-manager.rpm && \ dnf clean all && \ - S6_ARCH="amd64" && \ - if [ "${TARGETARCH}" = "arm64" ]; then S6_ARCH="aarch64"; fi && \ - curl --fail --silent -L https://github.com/just-containers/s6-overlay/releases/download/${S6_VERSION}/s6-overlay-${S6_ARCH}.tar.gz \ - -o /tmp/s6-overlay-${S6_ARCH}.tar.gz && \ - tar xzf /tmp/s6-overlay-${S6_ARCH}.tar.gz -C / --exclude="./bin" && \ - tar xzf /tmp/s6-overlay-${S6_ARCH}.tar.gz -C /usr ./bin && \ - rm /tmp/s6-overlay-${S6_ARCH}.tar.gz && \ - rm -f /var/wazuh-manager/etc/sslmanager.key && \ - rm -f /var/wazuh-manager/etc/sslmanager.cert - -COPY config/etc/ /etc/ -# Prepare permanent data -# Sync calls are due to https://github.com/docker/docker/issues/9547 - -COPY config/permanent_data.env config/permanent_data.sh / - -#Make mount directories for keep permissions - -RUN mkdir -p /var/wazuh-manager/var/multigroups && \ + # Set up required directories with correct ownership + mkdir -p /var/wazuh-manager/var/multigroups && \ chown root:wazuh-manager /var/wazuh-manager/var/multigroups && \ chmod 770 /var/wazuh-manager/var/multigroups && \ mkdir -p /var/wazuh-manager/etc/certs && \ chown wazuh-manager:wazuh-manager /var/wazuh-manager/etc/certs && \ chmod 500 /var/wazuh-manager/etc/certs && \ - chmod 755 /permanent_data.sh && \ + rm -f /var/wazuh-manager/etc/sslmanager.key && \ + rm -f /var/wazuh-manager/etc/sslmanager.cert + +# Prepare permanent data snapshot (sync calls: https://github.com/docker/docker/issues/9547) +RUN chmod 755 /permanent_data.sh && \ sync && /permanent_data.sh && \ sync && rm /permanent_data.sh +# Download tini static binary (no external library dependencies) +RUN TINI_ARCH="amd64" && \ + if [ "${TARGETARCH}" = "arm64" ]; then TINI_ARCH="arm64"; fi && \ + curl --fail --silent -L \ + https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-static-${TINI_ARCH} \ + -o /usr/local/bin/tini && \ + chmod +x /usr/local/bin/tini + +################################################################################ +# Build stage 1 (the actual Wazuh Manager image): +# Copy Wazuh Manager and tini from builder. Install only runtime dependencies. +################################################################################ +FROM amazonlinux:2023 + +RUN rm /bin/sh && ln -s /bin/bash /bin/sh + +# Install only runtime dependencies (no curl, tar, gzip, xz, or full dnf stack) +RUN dnf install openssl findutils procps shadow-utils -y && \ + dnf clean all && \ + getent group wazuh-manager || groupadd -r -g 999 wazuh-manager && \ + getent passwd wazuh-manager || useradd --system \ + --uid 999 \ + --no-create-home \ + --home-dir /var/wazuh-manager \ + --gid wazuh-manager \ + --shell /sbin/nologin \ + wazuh-manager + +# Copy Wazuh Manager installation (includes permanent data snapshot) +COPY --from=builder /var/wazuh-manager /var/wazuh-manager + +# Copy tini static binary +COPY --from=builder /usr/local/bin/tini /usr/local/bin/tini + +# Copy entrypoint, init scripts and runtime config +COPY config/entrypoint.sh /entrypoint.sh +COPY config/etc/ /etc/ +COPY config/permanent_data.env / + +RUN chmod 755 /entrypoint.sh + # Services ports EXPOSE 55000/tcp 1514/tcp 1515/tcp 514/udp 1516/tcp -ENTRYPOINT [ "/init" ] +ENTRYPOINT ["/usr/local/bin/tini", "--", "/entrypoint.sh"] diff --git a/build-docker-images/wazuh-manager/config/entrypoint.sh b/build-docker-images/wazuh-manager/config/entrypoint.sh new file mode 100644 index 00000000..748ceb70 --- /dev/null +++ b/build-docker-images/wazuh-manager/config/entrypoint.sh @@ -0,0 +1,22 @@ +#!/bin/bash +# Wazuh Docker Copyright (C) 2017, Wazuh Inc. (License GPLv2) + +# Run initialization and configuration +bash /etc/cont-init.d/0-wazuh-init + +# Start Wazuh Manager (may log warnings in environments without certs) +bash /etc/cont-init.d/1-manager + +# Tail the main log to stdout so Docker captures it +tail -F /var/wazuh-manager/logs/wazuh-manager.log & +TAIL_PID=$! + +# Graceful shutdown: stop Wazuh and exit cleanly on SIGTERM/SIGINT +_stop() { + echo "Stopping Wazuh Manager..." + /var/wazuh-manager/bin/wazuh-manager-control stop 2>/dev/null || true + kill "${TAIL_PID}" 2>/dev/null || true +} +trap _stop SIGTERM SIGINT SIGQUIT + +wait "${TAIL_PID}" diff --git a/build-docker-images/wazuh-manager/config/etc/cont-init.d/0-wazuh-init b/build-docker-images/wazuh-manager/config/etc/cont-init.d/0-wazuh-init index 5f0fd8c8..7813fa22 100644 --- a/build-docker-images/wazuh-manager/config/etc/cont-init.d/0-wazuh-init +++ b/build-docker-images/wazuh-manager/config/etc/cont-init.d/0-wazuh-init @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv bash +#!/bin/bash # Wazuh App Copyright (C) 2017, Wazuh Inc. (License GPLv2) # Variables diff --git a/build-docker-images/wazuh-manager/config/etc/cont-init.d/1-manager b/build-docker-images/wazuh-manager/config/etc/cont-init.d/1-manager index 2dbf13b2..153f2b1c 100644 --- a/build-docker-images/wazuh-manager/config/etc/cont-init.d/1-manager +++ b/build-docker-images/wazuh-manager/config/etc/cont-init.d/1-manager @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv bash +#!/bin/bash ############################################################################## # Migration sequence diff --git a/build-docker-images/wazuh-manager/config/etc/services.d/wazuh-manager-logs/run b/build-docker-images/wazuh-manager/config/etc/services.d/wazuh-manager-logs/run index bdecb254..7883a776 100644 --- a/build-docker-images/wazuh-manager/config/etc/services.d/wazuh-manager-logs/run +++ b/build-docker-images/wazuh-manager/config/etc/services.d/wazuh-manager-logs/run @@ -1,4 +1,4 @@ -#!/usr/bin/with-contenv sh +#!/bin/sh # dumping wazuh-manager.log to standard output exec tail -F /var/wazuh-manager/logs/wazuh-manager.log