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.
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
# Dónde estoy
pwd # /home/usuario
# Listar archivos
ls -la # -l: detalle, -a: ocultos
ls -lah # -h: tamaño legible
# Navegar
cd /var/www/html # ruta absoluta
cd .. # subir un nivel
cd ~ # ir al home
cd - # volver al directorio anterior
# Crear y eliminar
mkdir -p proyectos/wordpress # -p: crea directorios anidados
touch archivo.php # crear archivo vacío
rm -rf directorio/ # CUIDADO: elimina recursivamente
# Ver contenido
cat archivo.php # todo el archivo
less archivo.php # paginado (q para salir)
head -20 archivo.php # primeras 20 líneas
tail -f /var/log/apache2/access.log # seguir en tiempo real
Búsqueda y filtrado — las más útiles en seguridad
# grep: buscar texto en archivos
grep -r "eval(" /var/www/html/ # buscar eval() recursivamente (señal de malware)
grep -rn "base64_decode" . # -n: mostrar número de línea
grep -ri "password" wp-config.php
# find: buscar archivos
find . -name "*.php" -newer wp-config.php # archivos PHP más nuevos que wp-config
find . -perm 777 -type f # archivos con permisos 777 (peligroso)
find . -name "*.php" -mtime -7 # modificados en los últimos 7 días
# Combinar con pipe |
find . -name "*.php" | xargs grep -l "eval(" # archivos PHP que contienen eval()
ps aux | grep apache # procesos de Apache
netstat -tulpn | grep :80 # qué escucha en el puerto 80
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
# 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
# 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:
# 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
.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.
~/.ssh/id_ed25519
Clave privada (NUNCA compartas)
~/.ssh/authorized_keys
Clave pública (puedes compartir)
Generar y usar claves SSH
# 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)
# 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.
# 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 Intelephense
Autocompletado, navegación de código, detección de errores en tiempo real para PHP.
bmewburn.vscode-intelephense-client
GitLens
Visualización avanzada de Git. Muestra quién cambió cada línea y cuándo (blame inline).
eamodio.gitlens
Remote - SSH
Edita archivos directamente en servidores remotos vía SSH desde VS Code.
ms-vscode-remote.remote-ssh
SonarLint
Detecta vulnerabilidades de seguridad en tu código en tiempo real. Especialmente útil para PHP.
SonarSource.sonarlint-vscode
MySQL (Database Client)
Conecta con MySQL/MariaDB directamente desde VS Code. Ejecuta queries y visualiza tablas.
cweijan.vscode-mysql-client2
REST Client
Hace peticiones HTTP directamente desde archivos .http. Alternativa ligera a Postman.
humao.rest-client
Configuración recomendada para PHP
{
"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.
Configura tu entorno local
~60 minInstala 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.
Primer repositorio Git
~30 minCrea un repositorio Git para guardar tus scripts y notas del curso. Sube al menos 3 commits con mensajes descriptivos a GitHub o GitLab.
Conexión SSH a servidor remoto
~45 minSi 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.
Script de auditoría básico
~45 minEscribe 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.
#!/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:
add→commit→push - 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
Ir al Módulo 1 →