{"id":30384408,"url":"https://github.com/jpradoar/devsecops","last_synced_at":"2026-02-11T11:34:34.535Z","repository":{"id":304869327,"uuid":"1020319211","full_name":"jpradoar/devsecops","owner":"jpradoar","description":"DevSecOps demo","archived":false,"fork":false,"pushed_at":"2025-09-21T14:12:35.000Z","size":105,"stargazers_count":0,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-21T16:09:29.792Z","etag":null,"topics":["devops","devsecops","nerdearla"],"latest_commit_sha":null,"homepage":"https://jpradoar.github.io/devsecops/vuln_scans/insecure_image_vuln_scan.html","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jpradoar.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-15T17:19:18.000Z","updated_at":"2025-09-21T14:12:39.000Z","dependencies_parsed_at":"2025-08-21T01:35:16.491Z","dependency_job_id":"67d489bb-ac84-4ac2-94f1-d46e558ca16b","html_url":"https://github.com/jpradoar/devsecops","commit_stats":null,"previous_names":["jpradoar/devsecops_demo","jpradoar/devsecops"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jpradoar/devsecops","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpradoar%2Fdevsecops","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpradoar%2Fdevsecops/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpradoar%2Fdevsecops/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpradoar%2Fdevsecops/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jpradoar","download_url":"https://codeload.github.com/jpradoar/devsecops/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jpradoar%2Fdevsecops/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29332606,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-11T06:13:03.264Z","status":"ssl_error","status_checked_at":"2026-02-11T06:12:55.843Z","response_time":97,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["devops","devsecops","nerdearla"],"created_at":"2025-08-21T01:35:07.367Z","updated_at":"2026-02-11T11:34:34.531Z","avatar_url":"https://github.com/jpradoar.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# DevSecOps sin humo [![Nerdear.la 2025](https://img.shields.io/badge/evento-Nerdear.la%202025-blue)](https://nerdear.la/speakers/jonathan-prado/)\n\n\n[![CI Pipeline](https://github.com/jpradoar/devsecops/actions/workflows/DevSecOps.yaml/badge.svg)](https://github.com/jpradoar/devsecops/actions)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit)](https://github.com/pre-commit/pre-commit)\n\n\nEste repositorio acompaña mi charla en Nerdear.la 2025 sobre cómo aplique DevSecOps en la vida real, con todo lo bueno, lo malo y los incidentes que aprendí a contener.\n\n\nMi objetivo es dejar ejemplos prácticos y documentación abierta para que cualquier persona pueda usar, forkar y reutilizar lo que a mí me funcionó. Y que esto quede reflejado en el README como un primer \"camino paso a paso\" del pipeline completo (con jobs y stages).  Obviamente cada empresa/proyecto es un mundo asi que acá sentite libre de modificar lo que necesites o usar lo que te convenga.\n\n\u003cbr\u003e\u003cbr\u003e\n\n### Estructura del repo\n\n    ├── app/                 # Ejemplo de aplicación vulnerable + Dockerfile\n    ├── terraform/           # Infraestructura como código (IaC)\n    ├── vuln_scans/          # Ejemplo de reporte HTML de escaneo\n    ├── img/                 # Diagramas e imágenes de apoyo\n    ├── internal-checks.sh   # Script de validaciones internas\n    ├── data.json            # Datos de ejemplo (para triggers/demos)\n    ├── README.md            # Este archivo :)\n\n\n\n\u003cbr\u003e\u003chr\u003e\u003cbr\u003e\n\n### Principios\n\n1. **Cambio de mindset**:  No es checklist, es entender qué puede salir mal.\n2. **Shift Left**:  Seguridad desde el inicio del ciclo de vida.  (...o lo antes posible)\n3. **Seguridad proactiva**: Evaluar lo que se va a publicar, evitar manejar secretos,tokens etc\n4. **Automatización con propósito**:  IaC, pipelines auditables, rollback seguro.\n5. **Monitoreo y observabilidad**:  Logs, métricas, trazas y validaciones post-deploy.\n6. **Cultura colaborativa**:  Dev + Sec + Ops trabajando con feedback continuo.\n\n\n\u003cbr\u003e\u003chr\u003e\u003cbr\u003e\n\n# Cómo usar este repo\n\n\n### 1. Pre-commit hooks\n\nEjemplo:  **pre-commit-config.yaml**\n\n - Validación de secrets.\n - Linters y formateo.\n - Scanners básicos antes de subir el código.\n\nAcordate de instalar pre-commit en tu local, o si sos muy mañoso usalo en un docker.\n\n    pip install pre-commit   (al momento de la charla use pre-commit v4.3.0)\n    pre-commit install\n    pre-commit run --all-files\n\n\nEjemplo:\n\n    echo \"superdupersecret\" \u003e hola.txt\n    git add hola.txt\n    git commit -m \"nuevo archivo\"\n        # Ojo, hacer el pre-commit antes del push...\n    pre-commit run -a\n    git push origin \u003cbranch\u003e\n\nResumen\n\n    Archivos nuevos          necesitas git add antes de que pre-commit los vea.\n    Archivos en staging    se analizan automáticamente en cada git commit.\n    Revisión global        usa pre-commit run --all-files.\n\n\n\n\n\n\u003cbr\u003e\u003cbr\u003e\n\n\n### 2. Pipelines CI/CD\n\nEjemplo: .github/workflows/DevSecOps.yaml\n\n\n\n1. 🟢 Pre-checks                                  linters, pre-commit, secretos.\n2. 🛠 Build \u0026 Test                                compilación reproducible, tests unitarios.\n3. 🔍 Análisis de seguridad              SAST + IaC scanning (tfsec, trivy).\n4. 🚀 Deploy controlado                       Terraform (terraform/).\n5. 🧪 Validaciones post-deploy        DAST / Nuclei.\n6. 📊 Monitoreo y observabilidad  logs, métricas y trazas.\n7. 🔁 Feedback loop                               métricas visibles + vulnerabilidades evitadas.\n\n\n\u003cpre\u003e\n\nPre-checks\n    - Validar formato y calidad de código (linters).\n    - Pre-commit hooks para evitar secrets, claves o tokens en commits.\n\nBuild \u0026 Test\n    - Compilación o build reproducible.\n    - Tests unitarios y de integración.\n\nAnálisis de seguridad\n    - SAST: análisis estático de código.\n    - IaC scanning: tfsec para Terraform, trivy para imágenes de contenedor.\n\nDeploy controlado\n    - Despliegue con IaC.\n    - Deploy auditado (commit = deploy).\n    - Feedback inmediato si algo falla.\n\nValidaciones post-deploy\n    - DAST con Nuclei u otras herramientas.\n    - Validación de endpoints y URLs públicas.\n\nMonitoreo y observabilidad\n    - Logs, métricas y trazas.\n    - Alertas tempranas de incidentes.\n\nFeedback loop\n    - Métricas visibles en el pipeline.\n    - Reporte de Vulns evitadas antes de llegar a Prod (esto alimenta los pre-commits)\n            y ayuda a otros miembros del Team\n\n\u003c/pre\u003e\n\n\n\u003cbr\u003e\u003cbr\u003e\n\n\n\n\n### 3. Ciclo de vida DevSecOps\n\n| Objetivo             | Descripción                                                                | Ejemplo en repo                  |\n|---                   |---                                                                         |---                               |\n| Planificación        | Casos de uso y abuso, definición de riesgos                                | docs/ (próximamente)             |\n| Desarrollo           | Linters, pre-commit, code reviews                                          | app/, .pre-commit-config.yaml    |\n| Integración continua | SAST, control de secretos, builds reproducibles                            | .github/workflows/DevSecOps.yaml |\n| Deploy               | IaC validado, escaneo de imágenes, pipelines auditables                    | terraform/                       |\n| Post-deploy          | Validaciones automáticas (Nuclei, scanners), monitoreo y observabilidad    |vuln_scans/                       |\n| Feedback             | Incidentes evitados, métricas de seguridad y mejoras continuas             |internal-checks.sh                |\n\n\n\n\n\n\u003cbr\u003e\u003cbr\u003e\n\n\n### 4. Recursos útiles\n\n| Tool      | descripción                             | uso generico                                            | \n|---        |---                                      |---                                                      |\n| tfsec     | análisis de seguridad en Terraform.     | mitigar lo más posible antes de deployar                |\n| trivy     | escaneo de vulnerabilidades.            | validar que tan criticos son nuestros CVEs              |\n| Nuclei    | validación de endpoints y URLs públicas | simular lo que veria un atacante                        |\n| pre-commit| filtro de hooks locales                 | evitar que datos sensibles o vulerables lleguen al repo |\n\n\n\u003cbr\u003e\u003cbr\u003e\n\n\n### 5. Contribuciones\n\n\nEste repo está pensado para crecer con ejemplos reales de la comunidad.\nSi tenés una receta, script o pipeline que te funcionó, por mas minimo o simple que sea, hacé una PR!!!\n\n\u003cbr\u003e\u003cbr\u003e\n\n\u003cbr\u003e\u003cbr\u003e\n    \u003cimg src=\"img/devsecops_02.png\"\u003e\u003cbr\u003e\n\nRecordá que todo lo que sube al repo, queda en el log, asi que si ya subiste un secreto o similar, cambialo y para la prox podes implementar pre-commits para evitar subir cualquier tipo de password, secreto o dato potencialmente peligroso   :D\n\n\n\u003cbr\u003e\u003chr\u003e\u003cbr\u003e\n\n\n\n\n\n## Ejemplos para la demo\n\n\n#### Triggering (errores intencionales)\n\n        sed -i 's/xxxxx/60f41f67-b43b-4552-bb80-f2f29b861ef99/g' data.json \u0026\u0026 \\\n        sed -i 's/zzzzz/SuperSecretPassword1234!/g' app/app.py \u0026\u0026 \\\n        sed -i 's/99.99.99.99\\/32/0.0.0.0\\/0/g' terraform/sg.tf\n\n        git pull; git status ; git add --all ;  git commit -m \"fix: fake workflow\" ; git push origin main\n\n#### Restorear\n\n        sed -i 's/60f41f67-b43b-4552-bb80-f2f29b861ef99/xxxxx/g' data.json \u0026\u0026 \\\n        sed -i 's/SuperSecretPassword1234!/zzzzz/g' app/app.py \u0026\u0026 \\\n        sed -i 's/0.0.0.0\\/0/99.99.99.99\\/32/g' terraform/sg.tf\n\n        git pull; git status ; git add --all ;  git commit -m \"fix: rollback workflow\" ; git push origin main\n\n\n\n#### Reset to first commit\n\n        git reset --hard  8f19d216282d1516ad3fedf7b28e2bebb23b36c6\n        git push -f origin main\n\n\u003c/pre\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpradoar%2Fdevsecops","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjpradoar%2Fdevsecops","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjpradoar%2Fdevsecops/lists"}