Docker 和 Mirantis Kubernetes 引擎

在 Mirantis Kubernetes 引擎上进行 Kubernetes 部署

请遵循 Kubernetes 部分 中的说明。

SUSE® Security 不支持混合 Kubernetes / Swarm 集群。

使用 Docker 原生或 UCP/Swarm 部署 SUSE® Security 容器

请注意,在 Mirantis Kubernetes 引擎上使用 Swarm 进行原生 Docker 部署不支持以特权模式部署服务或添加 seccomp 功能的容器。要在此环境中部署,您必须使用 Docker Compose 或 Run 来部署 SUSE® Security 容器。您可以使用远程主机部署 (docker-compose -H HOST) 来简化此任务。

以下是示例 docker compose 配置文件。请注意,使用 Docker 原生不支持在与控制器相同的节点上部署执法者,如果希望在同一节点上具有控制器和执法者功能,则需要使用 All-in-One 容器。

环境变量 NV_PLATFORM_INFO=platform=Docker 用于通知 SUSE® Security 平台为 Docker/Swarm,即使在 Docker EE 部署中可能会检测到未使用的 Kubernetes 容器 SUSE® Security。此外,要在网络活动 → 视图 → 显示系统中查看这些内容,请为执法者添加环境变量 NV_SYSTEM_GROUPS。

部署 All-in-One 以实现高可用性

在生产 Docker 原生或 EE 环境中,为高可用性在前三个生产主机上部署 All-in-One 容器。每个 All-in-One 应指向所有 All-in-One 主机的 IP 地址。例如,三个 All-in-One 容器是高可用性的最小要求,CLUSTER_JOIN_ADDR 应列出三个用逗号分隔的 IP 地址。可以以奇数个数部署额外的高可用性 All-in-One,例如 5、7。在集群中其余主机上部署执法者,顺序不限。

使用 docker-compose 部署 All-in-One(特权模式)

以下是一个示例的 docker-compose 文件,用于在第一个节点上部署 All-in-One 容器。由于 All-in-One 容器内部有一个执法模块,因此同一节点上的应用程序容器可以得到保护。支持绿地和棕地部署。

allinone:
    pid: host
    image: neuvector/allinone:<version>
    container_name: allinone
    privileged: true
    environment:
        - CLUSTER_JOIN_ADDR=node_ip
        - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18300:18300
        - 18301:18301
        - 18400:18400
        - 18401:18401
        - 18301:18301/udp
        - 8443:8443
    volumes:
        - /lib/modules:/lib/modules:ro
        - /var/neuvector:/var/neuvector
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - /proc:/host/proc:ro
        - /sys/fs/cgroup:/host/cgroup:ro

最重要的环境变量是*CLUSTER_JOIN_ADDR*。这是其他执法者连接的 IP 地址。通常,它应该设置为运行 All-in-One 容器的节点的 IP 地址。

端口 18300 和 18301 是集群通信的默认端口。它们必须在集群中的所有控制器和执法者之间保持一致。请参考_"Docker-compose 详细信息"_部分以了解如何更改默认端口。

要在 All-in-One 中公开 REST API,请添加 10443 的端口映射,例如 - 10443:10443。

使用 docker-compose 添加一个执法者容器(特权模式)

这是一个示例 docker-compose 文件,用于将执法者加入集群。支持绿地和棕地部署。

enforcer:
    pid: host
    image: neuvector/enforcer:<version>
    container_name: enforcer
    privileged: true
    environment:
        - CLUSTER_JOIN_ADDR=controller_node_ip
        - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18301:18301
        - 18401:18401
        - 18301:18301/udp
    volumes:
        - /lib/modules:/lib/modules:ro
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - /proc:/host/proc:ro
        - /sys/fs/cgroup/:/host/cgroup/:ro

最重要的环境变量是*CLUSTER_JOIN_ADDR*。对于执法者,将 <controller_node_ip> 替换为控制器的节点 IP 地址。通常,控制器/All-in-One 的 docker-compose 文件和执法者的 docker-compose 文件中的*CLUSTER_JOIN_ADDR*具有相同的值。

部署SUSE® Security扫描器容器

从SUSE® Security 4.0+开始,必须部署一个单独的扫描器容器以执行漏洞扫描。重要说明:在拉取和运行扫描器镜像时,请始终使用:latest标签,以确保部署最新的CVE数据库。

示例docker run命令,用于在与控制器相同的主机上部署扫描器

docker run -td --name scanner -e CLUSTER_JOIN_ADDR=controller_node_ip -p 18402:18402 -v /var/run/docker.sock:/var/run/docker.sock:ro neuvector/scanner:latest

以及示例docker-compose

Scanner:
   image: neuvector/scanner:latest
   container_name: scanner
   environment:
     - CLUSTER_JOIN_ADDR=controller_node_ip
   ports:
     - 18402:18402
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro

要在与控制器不同的主机上部署扫描器,请添加环境变量 CLUSTER_ADVERTISED_ADDR,以便控制器可以访问扫描器。

docker run -td --name scanner -e CLUSTER_JOIN_ADDR=controller_node_ip -e CLUSTER_ADVERTISED_ADDR=scanner_host_ip -p 18402:18402 -v /var/run/docker.sock:/var/run/docker.sock:ro neuvector/scanner:latest

要在与控制器相同的主机上部署多个扫描器,请移除端口映射和 CLUSTER_ADVERTISED_ADDR 环境变量。

docker run -itd --name s1  -e CLUSTER_JOIN_ADDR=controller_node_ip neuvector/scanner:latest

其中 s1 是扫描器 1(对于每个额外的扫描器使用 s2、s3 等)。

要部署独立扫描器(无控制器/All-in-One),请参见 并行和独立扫描器 一节。

要更新扫描器以获取来自 SUSE® Security 的最新 CVE 数据库更新,请创建一个 cron 任务以停止并重启扫描器,拉取最新版本。有关详细信息,请参见 本节

不使用特权模式的部署

对于某些平台配置,可以在不要求以特权模式运行的情况下部署 SUSE® Security 容器。配置必须支持添加功能和设置 apparmor 配置文件。请注意,Docker DataCenter/UCP 和 Swarm 目前不支持此功能,但仍然可以使用 Compose 或 Run 手动部署 SUSE® Security。

使用 docker-compose 部署 All-in-One(无特权模式)

allinone:
    pid: host
    image: neuvector/allinone:<version>
    container_name: neuvector.allinone
    cap_add:
        - SYS_ADMIN
        - NET_ADMIN
        - SYS_PTRACE
        - IPC_LOCK
    security_opt:
        - apparmor=unconfined
        - seccomp=unconfined
        - label=disable
    environment:
        - CLUSTER_JOIN_ADDR=[AllInOne Node IP Address]
        - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18300:18300
        - 18301:18301
        - 18400:18400
        - 18401:18401
        - 18301:18301/udp
        - 8443:8443
    volumes:
        - /lib/modules:/lib/modules:ro
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - /proc:/host/proc:ro
        - /sys/fs/cgroup:/host/cgroup:ro
        - /var/neuvector:/var/neuvector

使用 docker-compose 部署执法者(无特权模式)

enforcer:
    pid: host
    image: neuvector/enforcer:<version>
    container_name: neuvector.enforcer
    cap_add:
        - SYS_ADMIN
        - NET_ADMIN
        - SYS_PTRACE
        - IPC_LOCK
    security_opt:
        - apparmor=unconfined
        - seccomp=unconfined
        - label=disable
    environment:
        - CLUSTER_JOIN_ADDR=[AllInOne Node IP Address]
        - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18301:18301
        - 18401:18401
        - 18301:18301/udp
    volumes:
        - /lib/modules:/lib/modules:ro
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - /proc:/host/proc:ro
        - /sys/fs/cgroup/:/host/cgroup/:ro

使用 docker run 部署 All-in-One(特权模式)

您可以使用 docker run 而不是 compose 进行部署。以下是示例。

docker run -d --name allinone \
--pid=host \
--privileged \
    -e CLUSTER_JOIN_ADDR=[AllInOne Node IP Address] \
    -e NV_PLATFORM_INFO=platform=Docker \
    -p 18300:18300 \
    -p 18301:18301 \
    -p 18400:18400 \
    -p 18401:18401 \
    -p 18301:18301/udp \
    -p 8443:8443 \
    -v /lib/modules:/lib/modules:ro \
    -v /var/neuvector:/var/neuvector \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v /sys/fs/cgroup:/host/cgroup:ro \
    -v /proc:/host/proc:ro \
neuvector/allinone:<version>

使用 docker run 部署执法者(特权模式)

docker run -d --name enforcer \
--pid=host \
--privileged \
    -e CLUSTER_JOIN_ADDR=[AllInOne Node IP Address] \
    -e NV_PLATFORM_INFO=platform=Docker \
    -p 18301:18301 \
    -p 18401:18401 \
    -p 18301:18301/udp \
    -v /lib/modules:/lib/modules:ro \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v /sys/fs/cgroup:/host/cgroup:ro \
    -v /proc:/host/proc:ro \
neuvector/enforcer:<version>

使用 docker run 部署 All-in-One(无特权模式)

您可以使用 docker run 而不是 compose 进行部署。以下是示例。

docker run -d --name allinone \
--pid=host \
--cap-add=SYS_ADMIN \
--cap-add=NET_ADMIN \
--cap-add=SYS_PTRACE \
--cap-add=IPC_LOCK \
--security-opt label=disable \
--security-opt apparmor=unconfined \
--security-opt seccomp=unconfined \
    -e CLUSTER_JOIN_ADDR=[AllInOne Node IP Address] \
    -e NV_PLATFORM_INFO=platform=Docker \
    -p 18300:18300 \
    -p 18301:18301 \
    -p 18400:18400 \
    -p 18401:18401 \
    -p 18301:18301/udp \
    -p 8443:8443 \
    -v /lib/modules:/lib/modules:ro \
    -v /var/neuvector:/var/neuvector \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v /sys/fs/cgroup:/host/cgroup:ro \
    -v /proc:/host/proc:ro \
neuvector/allinone:<version>

使用 docker run 部署执法者(无特权模式)

docker run -d --name enforcer \
--pid=host \
--cap-add=SYS_ADMIN \
--cap-add=NET_ADMIN \
--cap-add=SYS_PTRACE \
--cap-add=IPC_LOCK \
--security-opt label=disable \
--security-opt apparmor=unconfined \
--security-opt seccomp=unconfined \
    -e CLUSTER_JOIN_ADDR=[AllInOne Node IP Address]  \
    -e NV_PLATFORM_INFO=platform=Docker \
    -p 18301:18301 \
    -p 18401:18401 \
    -p 18301:18301/udp \
    -v /lib/modules:/lib/modules:ro \
    -v /var/run/docker.sock:/var/run/docker.sock:ro \
    -v /sys/fs/cgroup:/host/cgroup:ro \
    -v /proc:/host/proc:ro \
neuvector/enforcer:<version>

在不同主机上部署独立的 SUSE® Security 组件

如果计划将 docker 主机专用于控制器和/或管理器(无执法者),则可以单独部署这些容器,而不是使用 All-in-One。请注意,docker 不支持在同一节点上将执法者作为单独组件部署,因此如果希望在节点上同时部署控制器和执法者功能,则需要使用 All-in-One 容器。

控制器 compose 文件(将 [controller IP] 替换为第一个控制器节点的 IP)

controller:
    image: neuvector/controller:<version>
    container_name: controller
    pid: host
    privileged: true
    environment:
      - CLUSTER_JOIN_ADDR=[controller IP]
      - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18300:18300
        - 18301:18301
        - 18400:18400
        - 18401:18401
        - 18301:18301/udp
        - 10443:10443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /proc:/host/proc:ro
      - /sys/fs/cgroup:/host/cgroup:ro
      - /var/neuvector:/var/neuvector

Docker run 也可以使用,例如

docker run -itd --privileged --name neuvector.controller -e CLUSTER_JOIN_ADDR=controller_ip -p 18301:18301 -p 18301:18301/udp -p 18300:18300 -p 18400:18400 -p 10443:10443 -v /var/neuvector:/var/neuvector -v /var/run/docker.sock:/var/run/docker.sock:ro -v /proc:/host/proc:ro -v /sys/fs/cgroup/:/host/cgroup/:ro neuvector/controller:<version>

管理器的 compose 文件(将 [controller IP] 替换为要连接的控制器节点的 IP)。Docker UCP HRM 服务使用默认端口 8443,这与 SUSE® Security 控制台端口冲突。如果使用默认 HRM 端口,则需要将下面示例中的 SUSE® Security 端口映射更改为其他端口,例如 9443:8443,用于管理器,如下所示。

manager:
    image: neuvector/manager:<version>
    container_name: nvmanager
    environment:
      - CTRL_SERVER_IP=[controller IP]
    ports:
      - 9443:8443

执法者的 compose 文件:

enforcer:
    image: neuvector/enforcer:<version>
    pid: host
    container_name: enforcer
    privileged: true
    environment:
        - CLUSTER_JOIN_ADDR=controller_node_ip
        - NV_PLATFORM_INFO=platform=Docker
    ports:
        - 18301:18301
        - 18401:18401
        - 18301:18301/udp
    volumes:
        - /lib/modules:/lib/modules:ro
        - /var/run/docker.sock:/var/run/docker.sock:ro
        - /proc:/host/proc:ro
        - /sys/fs/cgroup/:/host/cgroup/:ro

监控和重启 SUSE® Security

由于 SUSE® Security 容器未作为 UCP/Swarm 服务部署,因此它们不会在节点上自动启动/重启。您应该通过 SIEM 系统为 SUSE® Security SYSLOG 事件设置警报,或通过数据中心检测 SUSE® Security 容器是否未运行。

在没有特权模式下部署

一般来说,您需要将特权设置替换为:

    cap_add:
        - SYS_ADMIN
        - NET_ADMIN
        - SYS_PTRACE
        - IPC_LOCK
    security_opt:
        - apparmor=unconfined
        - seccomp=unconfined
        - label=disable

上述语法适用于 Docker EE v17.06.0 及以上版本。此版本之前使用 : 而不是 =,例如 apparmor:unconfined。

Docker 原生更新

拉取和运行扫描器镜像时,请始终使用 :latest 标签,以确保部署最新的 CVE 数据库。

docker stop scanner
docker rm <scanner id>
docker pull neuvector/scanner:latest
<docker run command from below>

docker rm -f <scanner id> 也可以用于强制停止和移除正在运行的扫描器。

对于 docker-compose

docker-compose -f file.yaml down
docker-compose -f file.yaml pull        // pre-pull the image before starting the scanner
docker-compose -f file.yaml up -d

示例 docker run

docker run -td --name scanner -e CLUSTER_JOIN_ADDR=controller_node_ip -e CLUSTER_ADVERTISED_ADDR=node_ip -e SCANNER_DOCKER_URL=tcp://192.168.1.10:2376 -p 18402:18402 -v /var/run/docker.sock:/var/run/docker.sock:ro neuvector/scanner:latest

以及示例docker-compose

Scanner:
   image: neuvector/scanner:latest
   container_name: scanner
   environment:
     - SCANNER_DOCKER_URL=tcp://192.168.1.10:2376
     - CLUSTER_JOIN_ADDR=controller_node_ip
     - CLUSTER_ADVERTISED_ADDR=node_ip
   ports:
     - 18402:18402
   volumes:
     - /var/run/docker.sock:/var/run/docker.sock:ro