YAML

Fundamentos Security Notes Jan 6, 2025 YAML

Definición

¿Alguna vez has mirado un archivo de configuración y te ha dado dolor de cabeza? JSON tiene llaves y comillas por todos lados. XML tiene etiquetas de apertura y cierre interminables. YAML fue creado para humanos que estaban hartos de toda esa sintaxis innecesaria. Su lema dice todo: “YAML Ain’t Markup Language” - no es un lenguaje de marcado, es un formato de datos que en realidad puedes leer.

YAML usa indentación en lugar de llaves o etiquetas para mostrar estructura. Es como un esquema bien organizado o una lista con viñetas que de casualidad también puede ser leída por máquinas. Escribir nombre: Juan es más natural que {"nombre": "Juan"} o <nombre>Juan</nombre>. Esta legibilidad lo ha hecho increíblemente popular para archivos de configuración - desde especificaciones de API (OpenAPI/Swagger) hasta pipelines de CI/CD (GitHub Actions, GitLab CI) y orquestación de contenedores (Docker Compose, Kubernetes).

El inconveniente de YAML es que los espacios importan mucho. Dos espacios de diferencia pueden cambiar completamente lo que significa tu archivo. Es como Python en ese sentido - limpio y legible, pero tienes que ser cuidadoso con la indentación. Muchos desarrolladores lo aman o lo odian precisamente por esta razón. Sin embargo, para la configuración que los humanos leen y editan frecuentemente, YAML sigue siendo difícil de superar.

Ejemplo

Especificaciones de API OpenAPI: Cuando documentas tu API REST, probablemente la escribes en YAML. Los endpoints, parámetros, esquemas de respuesta - todo fluye naturalmente en el formato indentado de YAML. Herramientas como Swagger UI lo leen y generan documentación interactiva automáticamente.

Configuraciones de CI/CD: Cada repositorio de GitHub con Actions tiene un archivo .github/workflows/algo.yml. GitLab CI usa .gitlab-ci.yml. Estos archivos definen pipelines de construcción y despliegue en YAML porque los desarrolladores necesitan leerlos y modificarlos frecuentemente.

Kubernetes y Docker Compose: Cuando defines cómo desplegar tu aplicación en contenedores, escribes manifiestos YAML. docker-compose.yml describe tus servicios, redes y volúmenes. Los archivos de Kubernetes definen pods, deployments y services. YAML hace que estas configuraciones complejas sean manejables.

Archivos de Configuración de Aplicaciones: Muchas aplicaciones usan YAML para configuración. Rails usa config/database.yml, Ansible usa playbooks YAML, y muchas herramientas de desarrollo tienen archivos de configuración .yml. Es el formato por defecto cuando quieres algo legible por humanos.

Analogía

El Esquema Bien Organizado: YAML es como escribir un esquema con viñetas y sub-viñetas indentadas. Cualquiera puede mirarlo y entender la jerarquía al instante. JSON es como el mismo esquema pero escrito como una fórmula matemática con muchos paréntesis - técnicamente correcto pero más difícil de escanear visualmente.

El Formulario de Impuestos vs. la Conversación: Llenar un formulario de impuestos (JSON/XML) requiere poner información en campos específicos con formato exacto. Describir la misma información en una conversación (YAML) es más natural: “Mi nombre es Juan, tengo dos dependientes, gano tanto al año.” YAML se siente más como conversación.

La Tarjeta de Receta: Una receta bien escrita tiene ingredientes listados claramente, luego pasos indentados con sub-pasos cuando es necesario. YAML estructura los datos de la misma forma - limpio, jerárquico, y legible sin conocimiento especial del formato.

Las Instrucciones de Ensamblaje de IKEA: Las instrucciones de IKEA usan indentación visual y estructura para mostrar qué partes van con qué pasos. No necesitas un manual para entender el formato. YAML hace lo mismo para datos - la estructura es auto-evidente por cómo se ve en la página.

Code Example


# Especificación OpenAPI en YAML - legible para humanos
openapi: 3.0.0
info:
  title: API de Usuarios
  version: 1.0.0
  description: API para gestionar usuarios

paths:
  /users:
    get:
      summary: Listar todos los usuarios
      responses:
        '200':
          description: Respuesta exitosa
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/User'

  /users/{id}:
    get:
      summary: Obtener usuario por ID
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer

components:
  schemas:
    User:
      type: object
      properties:
        id:
          type: integer
        name:
          type: string
        email:
          type: string
          format: email

Notas de Seguridad

SECURITY NOTES

Requisitos Principales:

  • Los parseadores YAML pueden ser vulnerables a ejecución arbitraria de código si soportan características peligrosas como etiquetas !!python/object.
  • Siempre usa parseadores YAML seguros que deshabiliten estas características.

Mejores Prácticas:

  • Valida la estructura y contenido YAML antes de procesarlo.
  • Ten precaución con YAML proporcionado por usuarios ya que puede causar denegación de servicio mediante estructuras profundamente anidadas o agotamiento de recursos.
  • En Python usa yaml.safe_load() en lugar de yaml.load()..

Standards & RFCs

Standards & RFCs