Argo é perfeito para tarefas repetidas e worklows que podem ser reutilizados apenas fornecendo um parâmetro diferente.

Hoje vamos demonstrar como fase de como explorar mais sobre no ambíto da seghurança da informação.

💡 Para este exemplo, presumimos que você entenda de Argo e esteja confortável com os modelos envolvidos.

Vamos obter uma lista dos IPs atuais da AWS e executar o NMAP consequentemente em todos.

Definimos o seguinte manifesto com o Kind Workflow:

apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
  generateName: scan-nmap-aws-
  namespace: "argo"
spec:
  entrypoint: entry
  volumeClaimTemplates:
    - metadata:
        name: workdir
      spec:
        accessModes: ["ReadWriteOnce"]
        resources:
          requests:
            storage: 1Gi
 parallelism: 10

O que fizemos acima?

Criamos um workflow vazio que gerará nomes semelhantes a scan-nmap-aws-XXXXX

Colocamos no namespace argo e criamos um VolumeClaim chamado workdir para nossos próximos passos.

Agora precisamos definir alguns passos...

Se vamos escanear toda a AWS, precisamos obter esses intervalos de IP primeiramente.

Como podemos fazer isso? Bem, acredite ou não, a AWS fornece isso para nós!

- name: get-ips
  script:
    image: byteknight/alpine-curl-jq:latest
    command: [sh, -c]
     args:
      [
        'curl -s ''<https://ip-ranges.amazonaws.com/ip-ranges.json>'' | jq ''[.prefixes[] | select(.service | contains("EC2")) | .ip_prefix]'' > /tmp/ips.json',
      ]
   outputs:
     parameters:
     - name: ips
       valueFrom:
         path: /tmp/ips.json

Agora temos os IPs de que precisamos, mas precisamos escaneá-los via NMAP em outra etapa.

Como vamos fazer isso?

Enviando IPs ao NMAP

- name: run-nmap
  inputs:
    parameters:
      - name: target
    container:
      image: securecodebox/nmap:latest
      securityContext:
        privileged: true
        allowPrivilegeEscalation: true
      command: [nmap]
      args:
        [
            "-sV",
            "-vv",
            "-T5",
            "-A",
            "-n",
            "--min-hostgroup",
            "100",
            "--min-parallelism",
            "200",
            "-Pn",
            "-oX",
            "/mnt/data/{{}}.xml",
            "{{inputs.parameters.target}}",
        ]
      volumeMounts:
        - name: workdir
          mountPath: /mnt/data

O container NMAP será criado com as opções especificadas e consequentemente executará sob os IPS destinos fornecidos na lista baixada.

Agora precisamos combinar todas as etapas e criar uma etapa de entrada principal, onde lidará com a passagem dos parâmetros e a ordenação das etapas.

Por uma questão de exemplo, este é o script inteiro até este ponto: