M0 · Bloque I Introducción Terminal y Bash Git y control de versiones SSH y claves Entorno local LAMP/LEMP VS Code y extensiones Ejercicios prácticos Resumen y siguiente
Nivel 1 Bloque I — Programación y fundamentos Gratuito

M0 · Introducción y
entorno de trabajo

Antes de escribir una sola línea de PHP o tocar un WordPress, necesitas dominar las herramientas que usarás cada día como desarrollador o técnico de seguridad. Este módulo te prepara el terreno: terminal, Git, SSH y un entorno de desarrollo local completo.

Al finalizar este módulo serás capaz de:

  • Navegar y operar con el sistema de archivos desde la terminal
  • Gestionar proyectos con Git: commits, branches y repositorios remotos
  • Conectarte a servidores remotos con SSH usando claves pública/privada
  • Instalar y configurar un stack LAMP o LEMP en tu máquina local
  • Configurar VS Code para desarrollo PHP con las extensiones esenciales

¿Por qué empezamos aquí?

El programa SecurityWP Certified no empieza con WordPress. Empieza antes. Mucho antes.

WordPress es la capa superficial de un sistema complejo: un servidor web (Apache o Nginx), un intérprete de PHP, una base de datos MySQL y cientos de miles de líneas de código PHP, JavaScript y SQL. Para entender las vulnerabilidades de WordPress — y más importante, para entender por qué existen — necesitas entender las capas que hay debajo.

Filosofía del programa: No queremos que memorices listas de vulnerabilidades. Queremos que entiendas el sistema tan bien que seas capaz de descubrir vulnerabilidades nuevas por ti mismo.

Este primer módulo no tiene misterio técnico — es pura infraestructura. Pero es la base sobre la que construiremos todo lo demás. Asegúrate de completarlo con calma.

Terminal y Bash

La terminal es la herramienta más poderosa que tienes como técnico. Aprenderla bien multiplica tu productividad y es imprescindible para administrar servidores, ejecutar herramientas de seguridad y automatizar tareas.

Comandos esenciales de navegación

bash

Búsqueda y filtrado — las más útiles en seguridad

bash
Nunca ejecutes rm -rf / ni variantes. En un servidor de producción, un comando incorrecto puede eliminar todo el sistema. Desarrolla el hábito de leer los comandos antes de ejecutarlos, especialmente cuando los copias de internet.

Variables de entorno y scripts Bash

bash
# Variables de entorno
export DB_PASSWORD="mi_password_seguro"
echo $DB_PASSWORD

# Ver todas las variables de entorno
env
printenv | grep DB_

# Script básico: backup de WordPress
#!/bin/bash
SITE_DIR="/var/www/html/wordpress"
BACKUP_DIR="/backups"
DATE=$(date +%Y%m%d_%H%M%S)

tar -czf "$BACKUP_DIR/wp_$DATE.tar.gz" "$SITE_DIR"
echo "Backup creado: wp_$DATE.tar.gz"

# Dar permisos de ejecución al script
chmod +x backup.sh
./backup.sh

Git y control de versiones

Git no es solo para desarrolladores. Como técnico de seguridad, Git te permite rastrear cambios en archivos (clave para detectar modificaciones maliciosas), gestionar tus scripts y herramientas, y colaborar en proyectos.

Conceptos fundamentales

Working Directory

Los archivos con los que trabajas directamente. Tus cambios aquí no están "guardados" en Git todavía.

Staging Area

La zona de preparación. git add mueve cambios aquí antes de hacer commit.

Repository (.git)

El historial completo de commits. Es la "memoria" de tu proyecto.

Remote (origin)

La copia en GitHub, GitLab u otro servidor. Tu respaldo remoto.

Flujo de trabajo básico

bash
# Configuración inicial (una vez)
git config --global user.name "Tu Nombre"
git config --global user.email "tu@email.com"
git config --global core.editor "nano"

# Iniciar un repositorio
git init mi-proyecto
cd mi-proyecto

# Flujo diario
git status                    # ver qué ha cambiado
git add archivo.php           # añadir archivo específico
git add .                     # añadir todos los cambios
git commit -m "feat: añadir validación de formulario"

# Ramas
git branch feature/login      # crear rama
git checkout feature/login    # cambiar a ella
git checkout -b hotfix/xss    # crear y cambiar en uno
git merge feature/login       # fusionar en main

# Repositorio remoto
git remote add origin https://github.com/usuario/repo.git
git push -u origin main       # primera vez
git push                      # siguientes veces
git pull                      # obtener cambios remotos

# Historial
git log --oneline --graph --all
git diff HEAD~1 HEAD          # cambios del último commit
git show abc1234              # detalles de un commit

Git en seguridad: detectar cambios sospechosos

Una de las primeras cosas que debes hacer al auditar un WordPress es verificar si el código ha sido modificado. Si el tema o plugin está bajo control de versiones, Git lo hace trivial:

bash
# Ver qué archivos han cambiado respecto al repositorio original
git diff --name-only origin/main

# Ver cambios específicos en un archivo
git diff origin/main -- wp-includes/functions.php

# Buscar en el historial si se añadió eval() en algún momento
git log -S "eval(" --all --oneline

# Ver quién modificó cada línea de un archivo (blame)
git blame wp-config.php
Buena práctica: Mantén todos tus scripts de seguridad y herramientas bajo control de versiones en un repositorio privado. Incluye un archivo .gitignore para no subir credenciales o datos sensibles.

SSH y claves criptográficas

SSH (Secure Shell) es el protocolo estándar para conectarte de forma segura a servidores remotos. Entender cómo funciona es fundamental tanto para administrar servidores como para entender ataques de fuerza bruta y hardening de acceso remoto.

Cómo funciona SSH

SSH usa criptografía asimétrica (par de claves pública/privada). Tu clave privada nunca sale de tu máquina. Tu clave pública se copia al servidor. Cuando te conectas, el servidor verifica que tienes la clave privada correspondiente sin que tengas que enviarla.

Tu máquina ~/.ssh/id_ed25519 Clave privada (NUNCA compartas)
Autenticación sin contraseña
Servidor remoto ~/.ssh/authorized_keys Clave pública (puedes compartir)

Generar y usar claves SSH

bash
# Generar par de claves Ed25519 (más seguro que RSA)
ssh-keygen -t ed25519 -C "tu@email.com"
# Guarda en ~/.ssh/id_ed25519 (privada) y ~/.ssh/id_ed25519.pub (pública)

# Copiar clave pública al servidor (método fácil)
ssh-copy-id usuario@192.168.1.100

# O manualmente: añadir el contenido de id_ed25519.pub a:
# /home/usuario/.ssh/authorized_keys en el servidor

# Conectarse al servidor
ssh usuario@192.168.1.100
ssh -p 2222 usuario@dominio.com    # puerto personalizado
ssh -i ~/.ssh/mi_clave usuario@ip  # clave específica

# Túnel SSH (port forwarding) — muy útil en seguridad
ssh -L 8080:localhost:80 usuario@servidor  # acceder al port 80 del servidor via localhost:8080

# Config de SSH para alias (en ~/.ssh/config)
# Host miservidor
#   HostName 192.168.1.100
#   User ubuntu
#   IdentityFile ~/.ssh/id_ed25519
#   Port 22

ssh miservidor  # conecta directamente con la config anterior

Hardening de SSH (lo que deberías configurar en producción)

/etc/ssh/sshd_config
# Deshabilitar acceso root directo
PermitRootLogin no

# Solo autenticación por clave, sin contraseña
PasswordAuthentication no
PubkeyAuthentication yes

# Cambiar el puerto por defecto (oscuridad básica)
Port 2222

# Limitar usuarios con acceso SSH
AllowUsers ubuntu deployer

# Timeout de sesiones inactivas
ClientAliveInterval 300
ClientAliveCountMax 2

# Después de cambiar la config:
sudo systemctl restart sshd

Entorno local LAMP / LEMP

Necesitas un entorno local donde poder instalar WordPress, probar plugins, romper cosas y aprender sin miedo. Aquí tienes dos opciones principales:

LAMP: Linux + Apache + MySQL + PHP

La combinación más común en hosting compartido. Ideal para aprender si tu objetivo es trabajar con WordPress en entornos típicos.

bash — Ubuntu/Debian
# Actualizar el sistema
sudo apt update && sudo apt upgrade -y

# Instalar Apache
sudo apt install apache2 -y
sudo systemctl enable apache2
sudo systemctl start apache2

# Instalar MySQL
sudo apt install mysql-server -y
sudo mysql_secure_installation  # configuración inicial segura

# Instalar PHP 8.3 con extensiones para WordPress
sudo apt install php8.3 php8.3-mysql php8.3-curl php8.3-gd \
  php8.3-mbstring php8.3-xml php8.3-zip php8.3-imagick \
  php8.3-intl libapache2-mod-php8.3 -y

# Verificar instalación
php -v
mysql --version
apache2 -v

# Crear base de datos para WordPress
sudo mysql -u root -p
CREATE DATABASE wordpress_local CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'password_seguro_local';
GRANT ALL PRIVILEGES ON wordpress_local.* TO 'wpuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

VS Code y extensiones esenciales

VS Code es el editor más usado en desarrollo web. Con las extensiones correctas se convierte en un entorno de desarrollo PHP completo y en una herramienta de análisis de código útil para seguridad.

Extensiones imprescindibles

PHP

PHP Intelephense

Autocompletado, navegación de código, detección de errores en tiempo real para PHP.

bmewburn.vscode-intelephense-client
GIT

GitLens

Visualización avanzada de Git. Muestra quién cambió cada línea y cuándo (blame inline).

eamodio.gitlens
SSH

Remote - SSH

Edita archivos directamente en servidores remotos vía SSH desde VS Code.

ms-vscode-remote.remote-ssh
SEC

SonarLint

Detecta vulnerabilidades de seguridad en tu código en tiempo real. Especialmente útil para PHP.

SonarSource.sonarlint-vscode
DB

MySQL (Database Client)

Conecta con MySQL/MariaDB directamente desde VS Code. Ejecuta queries y visualiza tablas.

cweijan.vscode-mysql-client2
REST

REST Client

Hace peticiones HTTP directamente desde archivos .http. Alternativa ligera a Postman.

humao.rest-client

Configuración recomendada para PHP

.vscode/settings.json
{
  "editor.formatOnSave": true,
  "editor.tabSize": 4,
  "editor.insertSpaces": true,
  "php.validate.executablePath": "/usr/bin/php",
  "intelephense.diagnostics.undefinedVariables": true,
  "intelephense.diagnostics.undefinedFunctions": true,
  "files.associations": {
    "*.php": "php"
  },
  "sonarlint.rules": {
    "php:S2068": { "level": "on" },  // Detección de credenciales hardcodeadas
    "php:S3649": { "level": "on" }   // Detección de SQL injection
  }
}

Ejercicios prácticos

No pases al siguiente módulo sin completar estos ejercicios. Son la base de todo lo que viene.

01

Configura tu entorno local

~60 min

Instala el stack de tu elección (LAMP, LEMP o Docker) y levanta una instalación limpia de WordPress en local. Verifica que puedes acceder al panel de administración.

02

Primer repositorio Git

~30 min

Crea un repositorio Git para guardar tus scripts y notas del curso. Sube al menos 3 commits con mensajes descriptivos a GitHub o GitLab.

03

Conexión SSH a servidor remoto

~45 min

Si tienes acceso a un VPS (Hostinger, DigitalOcean, etc.), conéctate por SSH usando clave pública/privada. Si no tienes VPS, usa una VM local con Ubuntu Server.

04

Script de auditoría básico

~45 min

Escribe un script Bash que, dado un directorio de WordPress, liste todos los archivos PHP modificados en los últimos 7 días y busque la cadena eval( en todos ellos.

bash — pista
#!/bin/bash
WP_DIR=${1:-"/var/www/html"}

echo "=== Archivos PHP modificados en 7 días ==="
find "$WP_DIR" -name "*.php" -mtime -7 -type f

echo ""
echo "=== Archivos con eval() ==="
grep -r --include="*.php" -l "eval(" "$WP_DIR" 2>/dev/null

Resumen y siguiente módulo

Terminal Bash

  • Navegación: cd, ls, pwd
  • Búsqueda: find, grep
  • Permisos: chmod, chown

Git

  • Flujo: addcommitpush
  • Ramas y merges
  • Uso en auditorías de seguridad

SSH

  • Claves Ed25519
  • Hardening de sshd_config
  • Port forwarding

Entorno local

  • LAMP / LEMP / Docker
  • WordPress en local
  • VS Code configurado
Siguiente: M1 · Fundamentos de programación — Variables, tipos, estructuras de control y funciones. Empezamos a escribir PHP.
Ir al Módulo 1 →
Volver al programa
Módulo 0 de 20
← Anterior Siguiente →