Este documento describe las medidas de seguridad implementadas en el CDN de iconos Origon y las mejores prácticas para su uso seguro.
- Orígenes permitidos: Solo dominios autorizados
- Métodos permitidos: GET, HEAD únicamente
- Headers expuestos: Limitados a metadatos necesarios
- Duración de preflight: 1 hora (3600 segundos)
- Nombres de archivo: Sanitizados automáticamente
- Encoding: URL encoding obligatorio para caracteres especiales
- Patrones de archivo: Validación estricta de nombres
- Content-Type:
image/svg+xml
para archivos SVG - Cache-Control:
public, max-age=31536000, immutable
- ETag: Hash MD5 para verificación de integridad
- Variables de entorno: Credenciales no hardcodeadas
- Archivo de ejemplo:
env.example
para configuración - Separación: Credenciales separadas del código fuente
Problema: Las credenciales de R2 estaban hardcodeadas en los scripts.
Solución:
- ✅ Migrado a variables de entorno
- ✅ Creado archivo
env.example
- ✅ Documentación actualizada
Archivos afectados:
scripts/setup-cors.js
scripts/sync-optimized.js
-
Búsqueda de credenciales hardcodeadas
grep -r "password\|secret\|key\|token\|credential" . --exclude-dir=node_modules
-
Verificación de CORS
aws s3api get-bucket-cors --bucket origonlabs
-
Validación de headers
- Content-Type correcto
- Cache-Control apropiado
- ETag presente
- ✅ Credenciales: Migradas a variables de entorno
- ✅ CORS: Configurado correctamente
- ✅ Headers: Optimizados y seguros
- ✅ Validación: Implementada en todos los scripts
-
Nunca hardcodear credenciales
// ❌ MALO const accessKey = 'c31ef114db9524f7ec2d2b82b19eb894'; // ✅ BUENO const accessKey = process.env.R2_ACCESS_KEY_ID;
-
Usar variables de entorno
# Crear archivo .env cp env.example .env # Editar con tus credenciales
-
Validar entrada de usuario
// Sanitizar nombres de iconos const sanitizedName = encodeURIComponent(iconName);
- Rotar credenciales regularmente
- Monitorear acceso al bucket
- Revisar logs de Cloudflare
- Actualizar CORS según necesidades
# Cloudflare R2
R2_ACCESS_KEY_ID=your_access_key_here
R2_SECRET_ACCESS_KEY=your_secret_key_here
R2_ENDPOINT_URL=https://your-account-id.r2.cloudflarestorage.com
R2_BUCKET_NAME=origonlabs
# CDN
CDN_BASE_URL=https://cdn.origonlabs.opendex.dev
Las credenciales de R2 deben tener solo los permisos necesarios:
s3:GetObject
s3:PutObject
s3:DeleteObject
s3:PutBucketCors
s3:GetBucketCors
Si encuentras una vulnerabilidad de seguridad:
- NO crear un issue público
- Enviar email a: [email protected]
- Incluir:
- Descripción detallada
- Pasos para reproducir
- Impacto potencial
- Sugerencias de mitigación
- Tiempo de respuesta: 24-48 horas
- Proceso: Investigación → Parche → Comunicación
- Reconocimiento: Con consentimiento del reportero
- Credenciales en variables de entorno
- CORS configurado correctamente
- Headers de seguridad presentes
- Validación de entrada implementada
- Logs de acceso monitoreados
- Rotar credenciales si es necesario
- Revisar logs de acceso
- Actualizar dependencias
- Verificar configuración CORS
- Auditoría de permisos
- Email: [email protected]
- Respuesta: 24-48 horas
- Confidencialidad: Garantizada
Última actualización: $(date) Versión: 1.0.0