Skip to main content

Exibindo vulnerabilidades de aplicações em ferramentas nativas do Kubernetes

Escrito por
container scans

19 de novembro de 2019

0 minutos de leitura

Com base nos novos recursos do Kubernetes no Snyk Container, estamos experimentando maneiras de integrar os dados de vulnerabilidades de forma mais próxima ao ecossistema do Kubernetes. A Snyk oferece um conjunto abrangente de painéis e recursos de geração de relatórios, ideais para quem tem foco exclusivo em segurança. Mas e se você não quiser interromper o que está fazendo no Kubernetes para mudar de contexto? Será que podemos usar o amplo conjunto de APIs do Snyk Container para aproximar as informações sobre vulnerabilidades do Kubernetes?

Kubectl e o CRD de vulnerabilidade

Uma forma de estender o Kubernetes é usar recursos personalizados. Esse mecanismo permite adicionar novos objetos ao Kubernetes, que podem ser manipulados por ferramentas compatíveis com a API do Kubernetes. Assim, além de gerenciar Deployments e CronJobs, o Kubernetes também pode gerenciar seu novo recurso. Vamos usar uma definição de recurso personalizado (CRD) para descrever uma vulnerabilidade.

kubectl apply -f https://raw.githubusercontent.com/snyk-labs/ksnyk/master/ksnyk/commands/vulnerability.yaml

Você pode verificar se o CRD foi instalado corretamente assim:

$ kubectl api-resources --api-group snyk.io                                                                            NAME SHORTNAMES APIGROUP NAMESPACED KIND
  vulnerabilities   vuln,vulns snyk.io    true Vulnerability

Agora precisamos preencher nosso CRD com dados da Snyk. A integração do Snyk com o Kubernetes verifica automaticamente as cargas de trabalho no cluster e identifica vulnerabilidades nas imagens associadas. Podemos ler essas informações pela API da Snyk e inseri-las no Kubernetes usando algumas das ferramentas disponíveis em https://github.com/snyk-labs/ksnyk.

Com as informações carregadas, podemos usar qualquer cliente da API do Kubernetes para listar as vulnerabilidades encontradas no nosso namespace. Vamos ver como fazer isso no kubectl.


$ kubectl get vulns

NAME                             TITLE       PATH                 PACKAGE SEVERITY

snyk-linux-coreutils-104909      Improper Input Validation       replicationcontroller/example-rc:nginx coreutils medium
snyk-linux-coreutils-114540      Race Condition       replicationcontroller/example-rc:nginx coreutils medium
snyk-linux-expat-107842          Access Restriction Bypass       replicationcontroller/example-rc:nginx expat/libexpat1 medium
snyk-linux-expat-450908          XML External Entity (XXE) Injection    deployment.apps/snyky:docker.io/garethr/garethr_snyky   expat high
snyk-linux-expat-460765          XML External Entity (XXE) Injection    replicationcontroller/example-rc:nginx expat/libexpat1 high
snyk-linux-gcc8-447557           Out-of-Bounds       replicationcontroller/example-rc:nginx gcc-8/libstdc++6 high
snyk-linux-git-175991            Untrusted Search Path       deployment.apps/snyky:docker.io/garethr/garethr_snyky git high
snyk-linux-glibc-107098          Improper Input Validation       replicationcontroller/example-rc:nginx glibc/libc-bin medium
snyk-linux-glibc-121839          Resource Management Errors       replicationcontroller/example-rc:nginx glibc/libc-bin medium

A saída mostra um resumo das vulnerabilidades, incluindo a gravidade, a carga de trabalho afetada e o pacote na imagem que contém a vulnerabilidade. Você pode ver ainda mais detalhes, incluindo uma descrição completa, consultando uma vulnerabilidade específica.


$ kubectl get vulns snyk-linux-coreutils-104909 -o yaml                                                              
apiVersion: snyk.io/v1
kind: Vulnerability
metadata:
creationTimestamp: "2019-09-24T14:05:57Z"
generation: 1
name: snyk-linux-coreutils-104909
namespace: default
resourceVersion: "28382"
selfLink: /apis/snyk.io/v1/namespaces/default/vulnerabilities/snyk-linux-coreutils-104909
uid: 6e305adb-ded4-11e9-9bf7-025000000001
spec:
cvssScore: 6.5
cvssV3: CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:N
description: |
## Overview
chroot in GNU coreutils, when used with --userspec, allows local users to escape to the parent session via a crafted TIOCSTI ioctl call, which pushes characters to the terminal's input buffer.
## References

- [ADVISORY](https://security-tracker.debian.org/tracker/CVE-2016-2781)

- [http://www.openwall.com/lists/oss-security/2016/02/28/2](http://www.openwall.com/lists/oss-security/2016/02/28/2)

- [http://www.openwall.com/lists/oss-security/2016/02/28/3](http://www.openwall.com/lists/oss-security/2016/02/28/3)

disclosureTime: "2017-02-07T15:59:00Z"
image: nginx
isUpgradable: false
kind: replicationcontroller
language: linux
package: coreutils
packageManager: linux
path: replicationcontroller/example-rc:nginx
publicationTime: "2017-02-07T15:59:00Z"
resource: example-rc
severity: medium
title: Improper Input Validation
url: https://dev.snyk.io/vuln/SNYK-LINUX-COREUTILS-104909
version: 8.30-3

Exiba dados de vulnerabilidades nos painéis do Octant

Octant é um novo painel do Kubernetes criado pela VMware. Embora tenha sido lançado há pouco tempo, o Octant já oferece muitos dos recursos da CLI do kubectl e também conta com um poderoso modelo de plugins.

As instruções para instalar o plugin do Snyk para Octant e importar os dados relevantes da API da Snyk para o Kubernetes estão disponíveis em https://github.com/snyk-labs/ksnyk. Observe que você precisa ser cliente do Snyk Container para usar a API.

Confira abaixo o painel do Deployment. Você verá dados de vulnerabilidades no painel de status, incluindo a quantidade de vulnerabilidades de gravidade alta, média e baixa que a carga de trabalho tem no momento.

Painel do Kubernetes mostrando a configuração e o status de “Deployment / snyky”, incluindo uma réplica e três vulnerabilidades de alta gravidade.

O Octant também exibe muito bem as informações sobre recursos personalizados. Assim, ao instalar o CRD de vulnerabilidade mencionado acima, o Octant mostra informações sobre vulnerabilidades de cada carga de trabalho no namespace que você está visualizando.

Painel do Kubernetes exibindo detalhes de cargas de trabalho, contas de serviço, segredos e uma tabela de vulnerabilidades e descobertas de segurança em vulnerabilities.snyk.io

Este protótipo é apenas uma pequena amostra das informações que podemos exibir no Octant. Também será interessante acompanhar o crescimento do ecossistema de plugins do Octant e descobrir como combinar dados de vulnerabilidades no Kubernetes com outros recursos personalizados.

Conclusões

Como mencionado, o que mostramos acima são experimentos, não recursos finalizados, mas queremos conhecer as primeiras impressões. Se você é cliente do Snyk Container, já pode testá-los usando as ferramentas disponíveis em https://github.com/snyk-labs/ksnyk. Esses utilitários demonstram tanto a capacidade de extensão da plataforma Kubernetes quanto o poder de contar com uma API robusta da Snyk para desenvolver novas soluções.

Segurança de contêineres que prioriza os desenvolvedores

O Snyk encontra e corrige automaticamente vulnerabilidades em imagens de contêiner e workloads do Kubernetes.