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.
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.
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.