MKS DevEnv

Seguridad

Best practices de seguridad y hardening para MKS DevEnv

Seguridad y Hardening

MKS DevEnv está diseñado con la seguridad en mente. Esta guía cubre las mejores prácticas para asegurar tu instalación.

TLS/HTTPS

Certificados LetsEncrypt con Traefik

Si usas Coolify con Traefik, los certificados se generan automáticamente. Para instalación manual:

Usar Certbot

# En el VPS
sudo apt update
sudo apt install certbot python3-certbot-nginx

# Obtener certificado
sudo certbot --nginx -d lab1-helsinki.mks2508.systems

# Renovación automática (cron ya está configurado)
sudo certbot renew --dry-run

Certificados Wildcard

# Certificado wildcard para *.mks2508.systems
sudo certbot certonly --manual -d "*.mks2508.systems" \
  --preferred-challenges dns-01

Configurar Certificados Auto con Coolify

Traefik en Coolify genera certificados LetsEncrypt automáticamente usando el challenge HTTP-01.

# docker-compose.yml
services:
  devenv:
    labels:
      # Habilitar HTTPS
      - "traefik.enable=true"
      - "traefik.http.routers.devenv.rule=Host(`lab1-helsinki.code.mks2508.systems`)"
      - "traefik.http.routers.devenv.tls=true"
      - "traefik.http.routers.devenv.tls.certresolver=letsencrypt"

Secrets Management

Usar Docker Secrets (Production)

En producción, usa Docker Swarm secrets en lugar de environment variables:

# docker-compose.prod.yml
version: '3.8'

secrets:
  github_token:
    external: true
  database_password:
    external: true

services:
  devenv:
    image: ghcr.io/mks2508/devenv-full:latest
    secrets:
      - github_token
      - database_password
    environment:
      GITHUB_TOKEN_FILE: /run/secrets/github_token
      DB_PASSWORD_FILE: /run/secrets/database_password

Crear el secret:

echo "ghp_xxxxxxxxxxxx" | docker secret create github_token -

Integración con Vault

Para manejo avanzado de secrets, integra con HashiCorp Vault:

# Instar Vault CLI
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install vault

# Exportar token de Vault
export VAULT_ADDR="https://vault.mks2508.systems"
export VAULT_TOKEN="your-vault-token"

# Obtener secret
vault kv get -field=token devenv/github

Roles y Permisos

Crear Usuario No-Root

Por defecto, devenv corre como root. Para mayor seguridad, crea un usuario no-root:

# Dockerfile.custom
FROM ghcr.io/mks2508/devenv-full:latest

# Crear usuario developer
RUN groupadd -r developer && \
    useradd -r -g developer -u 1000 -m -s /bin/zsh developer

# Configurar sudo sin password para operaciones específicas
RUN echo 'developer ALL=(ALL) NOPASSWD:/usr/bin/docker' >> /etc/sudoers.d/developer

# Cambiar a usuario
USER developer
WORKDIR /home/developer

Permisos de SSH

Configura SSH keys en lugar de password authentication:

# En tu máquina local
ssh-keygen -t ed25519 -f ~/.ssh/devenv_key -C "devenv@lab1"

# Copiar key pública al servidor
ssh-copy-id -i ~/.ssh/devenv_key.pub root@77.42.25.248

# Usar key privada
ssh -i ~/.ssh/devenv_key root@77.42.25.248

Deshabilitar password authentication en /etc/ssh/sshd_config:

PasswordAuthentication no
PubkeyAuthentication yes

Firewall

Configurar UFW

# Instalar UFW
sudo apt install ufw

# Reglas por defecto
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Permitir puertos necesarios
sudo ufw allow 22/tcp    # SSH
sudo ufw allow 443/tcp   # HTTPS
sudo ufw allow 3389/tcp  # RDP (limitado a IPs específicas)
sudo ufw allow from YOUR_IP to any port 8443  # Code-Server

# Habilitar firewall
sudo ufw enable

# Ver status
sudo ufw status verbose

Limitar Acceso por IP

# Solo permitir tu IP para RDP
sudo ufw allow from YOUR_IP to any port 3389 proto tcp

# Denegar resto
sudo ufw deny 3389/tcp

Rate Limiting

Traefik Middleware

Configura rate limiting en Traefik:

# docker-compose.yml
services:
  traefik:
    # ... config existente ...
    command:
      - "--experimental.http.middlewares.rate-limit.rateLimit.average=100"
      - "--experimental.http.middlewares.rate-limit.rateLimit.burst=50"

  devenv:
    labels:
      # Aplicar middleware
      - "traefik.http.routers.devenv.middlewares=rate-limit"

Nginx Rate Limiting

Si usas Nginx reverse proxy:

# /etc/nginx/nginx.conf
http {
    limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;

    server {
        location /api/ {
            limit_req zone=api burst=20 nodelay;
        }
    }
}

Docker Security

Docker Socket Permissions

El socket de Docker debe ser read-only para contenedores no privilegiados:

services:
  agent-backend:
    volumes:
      # Read-only access
      - /var/run/docker.sock:/var/run/docker.sock:ro

AppArmor/SELinux

Activa AppArmor profiles:

# Instalar AppArmor
sudo apt install apparmor apparmor-utils

# Crear profile para devenv
sudo aa-genprof docker-container

# Cargar profile
sudo apparmor_parser -r /etc/apparmor.d/docker-container

# Enforzar modo
sudo aa-enforce docker-container

Seccomp

Restringe syscalls con seccomp:

# docker-compose.yml
services:
  devenv:
    security_opt:
      - seccomp:seccomp-profile.json

seccomp-profile.json:

{
  "defaultAction": "SCMP_ACT_ERRNO",
  "syscalls": [
    {
      "name": "accept",
      "action": "SCMP_ACT_ALLOW"
    },
    {
      "name": "read",
      "action": "SCMP_ACT_ALLOW"
    }
    // ... syscalls necesarias
  ]
}

Monitoring y Logs

Audit Logging

Activa auditd para rastrear accesos:

# Instalar auditd
sudo apt install auditd

# Regla para rastrear accesos a Docker
sudo auditctl -w /var/run/docker.sock -p wa -k docker-access

# Ver logs
sudo ausearch -k docker-access

Log Aggregation

Envía logs a centralized logging:

# docker-compose.yml
services:
  devenv:
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"
        labels: "service,workspace"

Backup y Recovery

Backup de Volumes

#!/bin/bash
# backup-workspace.sh

WORKSPACE_NAME=$1
BACKUP_DIR=/backups
DATE=$(date +%Y%m%d_%H%M%S)

docker run --rm \
  -v ${WORKSPACE_NAME}-workspace:/data:ro \
  -v $BACKUP_DIR:/backup \
  alpine tar czf /backup/${WORKSPACE_NAME}_${DATE}.tar.gz -C /data .

Restore

#!/bin/bash
# restore-workspace.sh

WORKSPACE_NAME=$1
BACKUP_FILE=$2

docker run --rm \
  -v ${WORKSPACE_NAME}-workspace:/data \
  -v $(dirname $BACKUP_FILE):/backup \
  alpine tar xzf /backup/$(basename $BACKUP_FILE) -C /data

Seguridad en Producción - Checklist

  • TLS/HTTPS configurado con certificados válidos
  • Firewall UFW activo con reglas mínimas
  • SSH keys configuradas (no password auth)
  • Docker socket montado read-only
  • Secrets usando Docker Secrets o Vault
  • Rate limiting configurado
  • AppArmor/Seccomp profiles activados
  • Audit logging habilitado
  • Backups automatizados configurados
  • Usuario no-root para contenedores
  • Actualizaciones de seguridad aplicadas
# Script de verificación
cat > check-security.sh << 'EOF'
#!/bin/bash
echo "Checking MKS DevEnv security..."

checks=0

# Check HTTPS
curl -s https://lab1-helsinki.api.mks2508.systems > /dev/null && \
  echo "✓ HTTPS configured" && ((checks++))

# Check UFW
ufw status | grep -q "Status: active" && \
  echo "✓ UFW active" && ((checks++))

# Check SSH keys
[ -f ~/.ssh/devenv_key ] && \
  echo "✓ SSH keys exist" && ((checks++))

# Check Docker socket read-only
docker inspect agent-backend | grep -q "/var/run/docker.sock:ro" && \
  echo "✓ Docker socket read-only" && ((checks++))

echo "$checks/4 checks passed"
EOF

chmod +x check-security.sh
./check-security.sh

Para más información sobre seguridad de Docker, consulta Docker Security Documentation.

Actions

On this page