Docker e Mirantis Kubernetes Engine

Implantação do Kubernetes no Mirantis Kubernetes Engine

Siga as instruções na seção Kubernetes.

SUSE® Security não suporta clusters mistos de Kubernetes / Swarm.

Implante SUSE® Security Contêineres Usando Docker Nativo ou UCP/Swarm

Observe que a implantação nativa do Docker no Mirantis Kubernetes Engine usando Swarm NÃO SUPORTA a implantação de serviços com contêineres em modo privilegiado ou com capacidades seccomp adicionadas. Para implantar neste ambiente, você deve usar Docker Compose ou Run para implantar os SUSE® Security contêineres. Você pode usar a implantação em host remoto (docker-compose -H HOST) para facilitar essa tarefa.

Aqui estão os arquivos de configuração de exemplo do docker compose. Observe que usar o docker nativo não suporta implantar o enforcer no mesmo nó que o controlador, exigindo o uso do contêiner All-in-One se as funções de controlador e enforcer forem desejadas em um nó.

A variável de ambiente NV_PLATFORM_INFO=platform=Docker é usada para notificar SUSE® Security que a plataforma é Docker/Swarm, mesmo que possam haver contêineres Kubernetes não utilizados detectados por SUSE® Security em uma implantação Docker EE. Além disso, para poder ver isso na Atividade de Rede → Visualizar → Mostrar Sistema, adicione a variável de ambiente para o Enforcer NV_SYSTEM_GROUPS.

Implante All-in-One para alta disponibilidade

Para HA em ambientes de produção Docker nativo ou EE, implante o contêiner All-in-One nos primeiros três hosts de produção. Cada All-in-One deve apontar para os endereços IP de todos os hosts All-in-One. Por exemplo, três contêineres All-in-One é o mínimo para HA, e o CLUSTER_JOIN_ADDR deve listar os três endereços IP separados por vírgula. All-in-One adicionais para HA podem ser implantados em números ímpares, por exemplo, 5, 7. Implante o Enforcer nos hosts restantes do cluster, em qualquer um.

Implante o All-in-One usando docker-compose (modo privilegiado)

A seguir, um exemplo do arquivo docker-compose para implantar o contêiner All-in-One no primeiro nó. Como o contêiner All-in-One possui um módulo de enforcer interno, os contêineres de aplicativo no mesmo nó podem ser protegidos. Implantações tanto em greenfield quanto em brownfield são suportadas.

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

A variável de ambiente mais importante é CLUSTER_JOIN_ADDR. É o endereço IP ao qual outros enforcers se conectam. Normalmente, deve ser definido como o endereço IP do nó onde o contêiner All-in-One está em execução.

As portas 18300 e 18301 são as portas padrão para comunicação do cluster. Elas devem ser idênticas para todos os controladores e enforcers no cluster. Por favor, consulte a seção "Detalhes do Docker-compose" para saber como alterar as portas padrão.

Para expor a API REST no All-in-One, adicione o mapeamento de porta para 10443, por exemplo - 10443:10443.

Adicione um contêiner enforcer usando docker-compose (modo privilegiado)

Este é um exemplo de arquivo docker-compose para adicionar um enforcer ao cluster. Implantações tanto em greenfield quanto em brownfield são suportadas.

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

A variável de ambiente mais importante é CLUSTER_JOIN_ADDR. Para enforcers, substitua <controller_node_ip> pelo endereço IP do nó do controlador. Normalmente, CLUSTER_JOIN_ADDR no arquivo docker-compose do controlador/all-in-one e no arquivo docker-compose do enforcer têm o mesmo valor.

Implante o SUSE® Security contêiner Scanner

A partir do SUSE® Security 4.0+, um contêiner scanner separado deve ser implantado para realizar a varredura de vulnerabilidades. Importante: Sempre use a tag :latest ao puxar e executar a imagem do scanner para garantir que o banco de dados CVE mais recente seja implantado.

Exemplo de docker run para implantar o scanner no mesmo host que o controlador.

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

E exemplo de 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

Para implantar o scanner em um host diferente do controlador, adicione a variável de ambiente CLUSTER_ADVERTISED_ADDR para que o controlador possa alcançar o scanner.

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

Para implantar vários scanners no mesmo host que o controlador, remova o mapeamento de porta e a variável de ambiente CLUSTER_ADVERTISED_ADDR.

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

Onde s1 é o scanner 1 (use s2, s3 etc. para cada scanner adicional).

Para implantar um scanner autônomo (sem controlador/All-in-One), consulte a seção Scanners Paralelos e Autônomos.

Para atualizar o Scanner a fim de obter as últimas atualizações do banco de dados CVE de SUSE® Security, crie um trabalho cron para parar e reiniciar o scanner, puxando a versão mais recente. Veja esta seção para detalhes.

Implantação Sem Usar Modo Privilegiado

Para algumas configurações de plataforma, é possível implantar os contêineres SUSE® Security sem exigir que eles sejam executados em modo privilegiado. A configuração deve suportar a capacidade de adicionar permissões e definir o arquivo de controle do AppArmor. Observe que o Docker DataCenter/UCP e o Swarm atualmente não suportam isso, mas ainda é possível implantar SUSE® Security manualmente usando Compose ou Run.

Implante o All-in-One (SEM modo privilegiado) com docker-compose

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

Implante o enforcer (SEM modo privilegiado) com 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

Implante o All-in-One (modo privilegiado) com docker run

Você pode usar docker run em vez de compose para implantar. Aqui estão exemplos.

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>

Implante o enforcer (modo privilegiado) com 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>

Implante o All-in-One (SEM modo privilegiado) com docker run

Você pode usar docker run em vez de compose para implantar. Aqui estão exemplos.

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>

Implante o enforcer (SEM modo privilegiado) com 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>

Implante SUSE® Security Componentes Separados em Hosts Diferentes

Se planeja dedicar um host Docker a um Controlador e/ou Gerente (sem Enforcer), esses contêineres podem ser implantados individualmente em vez do All-in-One. Observe que o Docker não suporta a implantação do enforcer no mesmo nó que o controlador como componentes separados, exigindo o uso do contêiner All-in-One se as funções de controlador e enforcer forem desejadas em um nó.

O arquivo de composição do Controlador (substitua [IP do controlador] pelo IP do primeiro nó controlador)

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

O comando docker run também pode ser usado, por exemplo.

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>

O arquivo de composição do Gerente (substitua [IP do controlador] pelo IP do nó controlador ao qual se conectar). O serviço HRM do Docker UCP usa a porta padrão 8443, que conflita com a SUSE® Security porta do console. Se estiver usando a porta padrão do HRM, altere o SUSE® Security mapeamento da porta no exemplo abaixo para outra porta, por exemplo 9443:8443 para o contêiner do Manager, conforme mostrado abaixo.

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

O arquivo de composição para o Enforcer:

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

Monitorando e Reiniciando SUSE® Security

Como os SUSE® Security contêineres não são implantados como um serviço UCP/Swarm, eles não são iniciados/reiniciados automaticamente nos nós. Você deve configurar alertas através do seu sistema SIEM para SUSE® Security eventos SYSLOG ou através do DataCenter para detectar se um SUSE® Security contêiner não está em execução.

Implantando Sem Modo Privilegiado

Em geral, você precisará substituir a configuração privilegiada por:

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

A sintaxe acima é para Docker EE v17.06.0+. Versões anteriores a esta usam : em vez de =, por exemplo apparmor:unconfined.

Atualizações Nativas do Docker

Sempre use a :latest tag ao puxar e executar a imagem do scanner para garantir que o banco de dados CVE mais recente seja implantado.

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

docker rm -f <scanner id> também pode ser usado para forçar parar e remoção do scanner em execução.

Para 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

Exemplo de 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

E exemplo de 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